通过存储过程将SQL变量传递到'IN'子句

时间:2018-09-13 16:09:42

标签: 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的结果,而不返回其他数字。

有人对我能做什么有任何想法吗?

2 个答案:

答案 0 :(得分:3)

另一个选择

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年以上的版本,请使用 string_split()

答案 1 :(得分:0)

动态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函数,可以使您完全想要https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017。 在旧版本中,您可以创建功能完全相同的自定义功能How do I split a string so I can access item x?