数据库如何处理传参用指定字符隔开参数的情况 如“name1,name3,name5”

共2种方式,

1、数据库内置函数STRING_SPLIT(sql2016之前的版本不支持该函数)

2、自定义自己写表值函数

第一种数据库内置函数STRING_SPLIT 直接拿来用,一般情况就够用了,不过很抱歉我们项目用的数据库竟然不支持,所以就有了第二种情况。

1、数据库内置函数STRING_SPLIT

STRING_SPLIT ( input_string , separator ) //separator 单个字符

declare @strs nvarchar(max)='proname1~proname2~proname3'
declare @delimiter nvarchar(5)='~'
select * from STRING_SPLIT(@strs,@delimiter)

输出为:

2、自定义表值函数

传参@strlist @delimiter 返回 table类型的@T

declare @strs nvarchar(max)='proname1~proname2~proname3'
declare @delimiter nvarchar(5)='~'
select * from fn_split(@strs,@delimiter)

output:

附上fn_split实现的代码:

Create function fn_split
(
@strlist nvarchar(1000),
@delimiter nvarchar(10)
)
Returns @T table
(
id int identity(1,1),
val nvarchar(100)
)
as
/**
找出每个被分隔符隔开的字符串@val,循环插入表变量@B
**/
begin
declare @pos int
declare @val varchar(100)

set @strlist=@strlist+@delimiter while(1=1)
begin
set @pos=charindex(@delimiter,@strlist) if @pos=0 break set @val=substring(@strlist,1,@pos-1)
if @val<>''
insert into @T values(@val) set @strlist= substring(@strlist,@pos+len(@delimiter),len(@strlist)-@pos-len(@delimiter)+1)
--set @strlist=STUFF(@strlist,1,@pos+len(@delimiter),'') --当出现 1~~1 两个相连的分隔符时出现错误
end
return

end

以上两种实现方式的优缺点:

1、内置STRING_SPLIT 函数在2016以上数据库支持,低版本不支持

2、内置STRING_SPLIT 函数分隔符只能传一位字符,而第二种实现方式也就是自定义的表值函数可以传的长度可以自定义,根据函数传参的长度

3、内置STRING_SPLIT函数无法过滤为空的分隔 比如:1,,2,3,4 在自定义中我已经做了过滤只输出不为空的数据

SqlServer Split 的实现的更多相关文章

  1. SqlServer Split函数

    Create FUNCTION [dbo].[SplitToTable] ( @SplitString nvarchar(max), @Separator nvarchar(10)=' ' ) RET ...

  2. SQLServer Split

    ALTER FUNCTION dbo.splitl ( @String VARCHAR(MAX), @Delimiter VARCHAR(MAX) ) RETURNS @temptable TABLE ...

  3. SQLServer实现split分割字符串到列

    网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题. 先贴上某大牛写的sp ...

  4. 【转】sqlserver字符串拆分(split)方法汇总

    Java..net等开发工具具有split功能,最近在Sqlserver中碰到这个需求. 方法1:动态SQL法 ),) set @string='1,2,3,4,5,6,7,8,9,10' set @ ...

  5. (转自aierong原创技术随笔)sqlserver字符串拆分(split)方法汇总

    sqlserver字符串拆分(split)方法汇总   --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5, ...

  6. sqlserver字符串拆分(split)方法汇总

    --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select ...

  7. sqlserver 字符串split

    select value from TF_NJVALUES('3C457A2D-188B-4D99-A822-2968054E1FB8,3C457A2D-188B-4D99-A822-2968054E ...

  8. SQLSERVER中的假脱机spool

    SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...

  9. 一步一步搭框架(asp.netmvc+easyui+sqlserver)-03

    一步一步搭框架(asp.netmvc+easyui+sqlserver)-03 我们期望简洁的后台代码,如下: using System; using System.Collections.Gener ...

随机推荐

  1. 根据经纬度坐标获得省市区县行政区划城市名称,自建数据库 java python php c# .net 均适用

    目录 步骤一.下载省市区边界数据 步骤二.解析CSV文件导入数据库 步骤三.在程序中根据坐标解析获得城市 在LBS应用中,根据坐标来解析获得对应是哪个城市是一个很常见的功能,比如App里面通过手机定位 ...

  2. 02网络编程( socket套接字+TCP粘包 )

    目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...

  3. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  4. 通过修改注册表将右alt键映射为application键

    通过修改注册表将右alt键映射为application键的方法有许多键盘没有APPLICATION(上下文菜单)键,本文将教您如何把右ALT键映射为apps键.1.映射请将以下注册表信息用记事本保存为 ...

  5. verification 提取差异点

    提取出差异点 传统用例 项目A锁定的寄存器是regA,项目B的锁定功能的寄存器是regB,如果项目A用例中直接用 reg_model.regA.write(); reg_model.regA.read ...

  6. 正确理解jmeter线程组之Ramp-Up

    Ramp-Up表示多少时间内启动线程,比如线程数100,Ramp-Up设置为10,表示10秒内启动100线程,不一定是每秒启动10个线程: 下面我们来做几个测试 线程组设置:100线程,Ramp-Up ...

  7. Clickhouse 分布式表&本地表

    CK 分布式表和本地表 ck的表分为两种: 分布式表 一个逻辑上的表, 可以理解为数据库中的视图, 一般查询都查询分布式表. 分布式表引擎会将我们的查询请求路由本地表进行查询, 然后进行汇总最终返回给 ...

  8. 公司正在开发BI系统?这些设计要素请了解一下!

    ​1. 数据源 第一个要素数据源.企业中的BI工具可能承接上游数据中台或者其他产品输出的结果,作为输入的数据源,每个业务方用的数据库都可能是不一样的,所以可接入数据源的种类决定的一个BI工具的可用性, ...

  9. 商业智能bi行业现状,BI应用的3个层次

    ​商业智能bi行业现状.传统的报表系统技术上已经相当成熟,大家熟悉的Excel等都已经被广泛使用.但是,随着数据的增多,需求的提高,传统报表系统面临的挑战也越来越多. 1. 数据太多,信息太少 密密麻 ...

  10. 【windows 操作系统】进程

    前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...