2017-07-15 99 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

這是一個多行查詢,而不是單行。僅舉一個例子,我提到了示例表。但實際上它有點冗長查詢 –