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

问题描述 投票:0回答:2

我的变量看起来像这样:

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

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

sql sql-server tsql
2个回答
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()


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?

© www.soinside.com 2019 - 2024. All rights reserved.