2017-07-15 37 views
0

我想用逗号分隔字符串。其实我想在WHERE条款过滤像如何使用SQL Server以逗号分隔字符串?

CREATE PROC spGetRecords 
@class varchar(50) 
AS 
BEGIN 
    SELECT * 
    FROM SampleTable 
    WHERE class in (@class) --in Database class is an integer 
END 

所以,我想通过时一样执行查询下面

spGetRecords @class = '12,22,45,66' 

我认为这是不可能在一个参数传递多个值的参数我案件。

所以,如果我通过','删除单独的字符串,那么我可以在while循环中运行我的查询,这将使记录正确吗?

所以,我怎样才能通过逗号

+0

您正在使用什么RDBMS和版本。 – Igor

+0

使用动态SQL:'exec'选择...'' –

+0

@Igor'Microsoft sql server 2012 11.0.2100.60' –

回答

3

可以使用XML路径尝试拆分如下:

Declare @delimiter nvarchar(max) = ',' 
Declare @str nvarchar(max) = '12,22,45,66' 

Declare @xml as xml 
     Select @xml = CAST('<x>' + REPLACE((SELECT REPLACE(@str,@delimiter,'$$$SSText$$$') AS [*] FOR XML PATH('')),'$$$SSText$$$','</x><x>')+ '</x>' AS XML) 

--select @xml 
Select y.value(N'text()[1]', N'nvarchar(MAX)') as value 
FROM @xml.nodes(N'x') as x(y) 

如果您是在SQL Server> = 2016,你可以使用STRING_SPLIT(如下):

Select * from string_split('12,22,45,66',',') 
+0

你的回答是正确的。但在我给出正确的之前,你能否给出关于第三和第四行的解释?谢谢 –

+0

尝试选择你将理解的单个行,首先使用xml路径转换为xml,同时创建节点,我将逗号/分隔符作为单独的节点并将第二行遍历所有节点 –

0

使用动态SQL

exec 'SELECT * FROM SampleTable WHERE class in (' + @class + ')' 

将修补串在一起,然后执行它是这样的:

SELECT * FROM SampleTable WHERE class in (12,22,45,66) 
+0

类是整数 –

+0

您是否尝试过查询? –

+0

这是一个多行查询,而不是单行。仅举一个例子,我提到了示例表。但实际上它有点冗长查询 –