遇到一个烦人的问题,存储过程传入的变量是整数以逗号分隔开的拼接字符串,由于原先存储过程已写好,无法进行大幅修改,无法使用 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)