通过存储过程将SQL变量传递到“IN”子句中

通过存储过程将SQL变量传递到“IN”子句中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的变量如下所示: DECLARE @number AS NVARCHAR(1000) SET @number = '1,2,3,4,5,6' 我在WHERE声明中的内容是: WHERE V.client IN (@number) 我的V.Client列是一个整数。我想做的是从@number中删除,使其看起来像1,2,3,4,5,6。我试过这么做 ',' + @number + ',' LIKE '%,' + CAST(V.client AS VARCHAR) + ',%' 但它只返回1

我的变量如下所示:

DECLARE @number AS NVARCHAR(1000)
SET @number = '1,2,3,4,5,6'
我在WHERE声明中的内容是:

WHERE V.client IN (@number) 
我的V.Client列是一个整数。我想做的是从@number中删除,使其看起来像1,2,3,4,5,6。我试过这么做

',' + @number + ',' LIKE '%,' + CAST(V.client AS VARCHAR) + ',%'
但它只返回1的结果,而不返回其他数字的结果

有人知道我能做什么吗?

另一个选择

DECLARE @number AS nvarchar(1000)
SET @number = '1,2,3,4,5,6'

...
WHERE V.client IN (
                    Select RetVal = B.i.value('(./text())[1]', 'int')
                    From  (Select x = Cast('<x>' + replace(@Number,',','</x><x>')+'</x>' as xml).query('.')) as A 
                    Cross Apply x.nodes('x') AS B(i)
                  )
如果2016+,则使用字符串分割另一个选项

DECLARE @number AS nvarchar(1000)
SET @number = '1,2,3,4,5,6'

...
WHERE V.client IN (
                    Select RetVal = B.i.value('(./text())[1]', 'int')
                    From  (Select x = Cast('<x>' + replace(@Number,',','</x><x>')+'</x>' as xml).query('.')) as A 
                    Cross Apply x.nodes('x') AS B(i)
                  )

如果2016+,使用字符串分割是最常见的选项,下面是一个如何使用它的代码片段

DECLARE @number AS nvarchar(1000)
SET @number = N'1,2,3,4,5,6'

declare @cmd nvarchar(1000) = N'select case when 1 in ' + Quotename(@number, '()') + ' then 1 else 0 end'

exec sp_executesql @cmd
哪个将准备以下查询

select case when 1 in (1,2,3,4,5,6) then 1 else 0 end
您可以考虑的其他选项: 拆分字符串并使用标准sql查询。 在新的sql server中,有一个函数string_split,它非常符合您的需要。
在旧版本中,您可以创建自定义函数,执行完全相同的操作

动态sql是最常见的选项,下面是一个如何使用它的代码片段

DECLARE @number AS nvarchar(1000)
SET @number = N'1,2,3,4,5,6'

declare @cmd nvarchar(1000) = N'select case when 1 in ' + Quotename(@number, '()') + ' then 1 else 0 end'

exec sp_executesql @cmd
哪个将准备以下查询

select case when 1 in (1,2,3,4,5,6) then 1 else 0 end
您可以考虑的其他选项: 拆分字符串并使用标准sql查询。 在新的sql server中,有一个函数string_split,它非常符合您的需要。
在旧版本中,您可以创建自定义函数,执行完全相同的操作

传入表值参数是一个选项。或者使用动态sql。使用拆分器函数将字符串参数转换为表add join。这里有几个拆分器函数。的可能重复项在SQL中不使用分隔字符串。别这样。还有其他更好的方法。使用表值参数或xml参数可能是最好的选项,另一种可能是使用字符串拆分函数,您尝试过的字符串操作和动态sql也是选项,尽管可能是最差的。传入表值参数是一种选项。或者使用动态sql。使用拆分器函数将字符串参数转换为表add join。这里有几个拆分器函数。的可能重复项在SQL中不使用分隔字符串。别这样。还有其他更好的方法。使用表值参数或xml参数可能是最好的选择,另一种可能是使用字符串拆分函数,您尝试过的字符串操作和动态sql也可能是最坏的选择。