sql server 字符串分组 2016版本和2016版本之前的解决方法,

遇到一个烦人的问题,存储过程传入的变量是整数以逗号分隔开的拼接字符串,由于原先存储过程已写好,无法进行大幅修改,无法使用 in进行筛选相关数据,故在网上查了一下找到了一个分隔字符串的例子,如下:

2016版本之前

 create FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
    declare @idx int
    declare @slice varchar(8000)
    select @idx = 1
          if len(@String)<1 or @String is null return
    while @idx!= 0
    begin
        set @idx =charindex(@Delimiter,@String)
        if @idx!=0
            set @slice =left(@String,@idx - 1)
        else
            set @slice = @String
        if(len(@slice)>0)
            insert into @temptable(items)values(@slice)
        set @String =right(@String,len(@String)- @idx)
        if len(@String)= 0 break
    end
return

end

执行:

select *from dbo.Split('214,215',',');

2016版本之后


三、拆分表中的列

SELECT t.id,
       t.name,
       t.description,
       v.value
FROM test t
    CROSS APPLY STRING_SPLIT(t.description, ',')v;


四、和in搭配使用

有些应用中,参数的值是不确定的,是用逗号拼接后,传入sql中,这个时候string_split特别有用,可以和in搭配使用。

SELECT t.id,
       t.name,
       t.description
FROM test t
WHERE t.id IN (SELECT CAST(v.value AS INT) AS id  FROM STRING_SPLIT('1,2,3', ',') v)

五、拆分+关联
SELECT t.id,
       t.name,
       t.description
FROM test t
INNER JOIN STRING_SPLIT('1,2',',') v
        ON t.id = CAST(v.value AS INT) 

 

你可能感兴趣的:(sql,server)