SqlServer Split 的实现

数据库如何处理传参用指定字符隔开参数的情况 如“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 在自定义中我已经做了过滤只输出不为空的数据

posted @ 2021-12-02 14:18  jiayouliucui  阅读(863)  评论(0)    收藏  举报