SqlServer Split 的实现
数据库如何处理传参用指定字符隔开参数的情况 如“name1,name3,name5”
共2种方式,
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 在自定义中我已经做了过滤只输出不为空的数据
本文来自博客园,作者:jiayouliucui,转载请注明原文链接:https://www.cnblogs.com/cheery-go/p/15632996.html

浙公网安备 33010602011771号