2013-07-02 43 views
0

我傳入一個動態數量的csv格式的id作爲sql參數,並希望在select語句的where子句中使用它們。如何使用where子句以csv格式執行SQL select語句?

我不能得到我的頭周圍如何在SQL中做到這一點。

僞會是這個樣子:

@ids varchar(max) 

select stuff from table 
where stuff = [email protected](',') 

任何幫助將不勝感激。

確定經過一些研究後,我認爲最好的方法是使用xml而不是csv,因爲這樣做會更省力,因此我將選擇最佳答案並關閉它。多謝你們。

+2

...這將取決於您的數據庫,應用程序語言和連接驅動程序,它們都不是您提供的。然而,通常情況下,你不能只提供一個數組(可能是爲了鼓勵'JOIN's?) - 你必須列出特定數量的參數,或動態構建查詢(更困難,並且有點危險)。 –

回答

2

(由用戶等進入@ids)constuct的SQL如果我理解正確,你想通過一個動態的名單,然後在SQL Server中創建一個表值函數:

CREATE FUNCTION ParseIds (@ids varchar(MAX)) RETURNS @TempIds TABLE (Id INT) 
AS 
BEGIN 
    DECLARE @Pos INT 
    SET  @Pos = 1 

    SET  @ids = ',' + @ids + ',' 

    WHILE @Pos < LEN(@ids) 
    BEGIN 
      INSERT @TempIds 
      VALUES (Convert(int, SUBSTRING(@ids,@Pos+1,CHARINDEX(',',@ids,@Pos+1)[email protected]))) 

      SET  @Pos = CHARINDEX(',',@ids,@Pos+1) 
    END 

    RETURN 
END 

通過你的動態CSV Id列表到您的存儲過程和u se在這樣的查詢中:

select stuff from table 
where stuff IN (SELECT id FROM dbo.ParseIds(@ids)) 
0

IN查詢做你所需要的:

SELECT stuff FROM table WHERE stuff in (1,4,7,9) 

考慮SQL注入,如果你來自不安全來源的

+0

將這個字符串變量('@ids varchar(max)')傳遞給'IN'語句時不起作用。它必須被解析。 –

相關問題