2009-12-22 79 views
1

可能重複:
Parameterizing a SQL IN clause?如何使用內聯SQL爲IN語句設置參數集?

您好,我有一個查詢看起來是這樣的:

SELECT 
    CompanyId 
FROM 
    CompanyTable 
WHERE 
    CompanyName IN ('Subway', 'A & W', 'Pizzahut') 

有什麼辦法,我可以使用SQL參數的名稱列表?

這不是一個存儲過程(我喜歡但不能在此項目中使用)。當我說'參數'時,我的意思是在參數化的內聯sql中的參數。

我使用MS企業庫,所以我的參數化的內聯SQL是這樣的:

string sql = "SELECT * FROM Company WHERE CompanyID = @companyId"; 
Database db = DatabaseFactory.CreateDatabase(); 
DbCommand dbCommand = db.GetSqlStringCommand(sql); 
db.AddInParameter(dbCommand, "companyId", DbType.Int32, 123); 
... 

這是一個簡單的情況下,像上面非常簡單。但是當涉及到像

SELECT 
    CompanyId 
FROM 
    CompanyTable 
WHERE 
    CompanyName IN ('Subway','A & W','Pizzahut'). 

我不知道如何使用這裏的參數。

+0

重複的http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-條款 – 2009-12-22 22:41:31

回答

3

有幾條路線,你可以採取

  • 的「經典」傳遞一個分隔字符串參數和使用用戶定義的表值函數在數據庫中把字符串到一個表。然後你可以加入該表進行過濾。

喜歡的東西(這將返回的數據類型INT表,只需更改代碼略有VARCHAR

CREATE function [dbo].[csl_to_table] (@list nvarchar(MAX)) 
RETURNS @list_table TABLE ([id] INT) 
AS 
BEGIN 
    DECLARE  @index INT, 
       @start_index INT, 
       @id INT 

    SELECT @index = 1 
    SELECT @start_index = 1 
    WHILE @index <= DATALENGTH(@list) 
    BEGIN 

     IF SUBSTRING(@list,@index,1) = ',' 
     BEGIN 

       SELECT @id = CAST(SUBSTRING(@list, @start_index, 
         @index - @start_index) AS INT) 
       INSERT @list_table ([id]) VALUES (@id) 
       SELECT @start_index = @index + 1 
     END 
     SELECT @index = @index + 1 
    END 
    SELECT @id = CAST(SUBSTRING(@list, @start_index, 
      @index - @start_index) AS INT) 
    INSERT @list_table ([id]) VALUES (@id) 
    RETURN 
END 
  • 您可以使用一個循環,你的.NET代碼來構建IN條款。但請記住,您僅限於256個參數(IIRC)。

類似這樣的東西(a la this answer

string[] tags = new string[] { "Subway","A & W","Pizzahut" }; 
string cmdText = 
    "SELECT CompanyId FROM CompanyTable WHERE CompanyName IN ({0})"; 

string[] paramNames = tags.Select(
    (s, i) => "@tag" + i.ToString() 
).ToArray(); 

string inClause = string.Join(",", paramNames); 
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) { 
    for(int i = 0; i < paramNames.Length; i++) { 
     cmd.Parameters.AddWithValue(paramNames[i], tags[i]); 
    } 
} 
+0

甜,我採用了第二種方法 - 一個動態創建參數列表。有效!我認爲這是處理這種情況的好方法。謝謝! – sean717 2009-12-22 23:45:02

0

是這是一個存儲過程?

通過參數,你的意思是存儲過程參數?

當你說你想使用名稱列表的參數時,你的意思是你想要使用一個單一的參數是整個列表,還是你想爲每個字符串使用一個參數?

假設這是一個存儲過程,並且您的意思是使用它的參數,並且您希望使用一個參數(varchar),它是整個列表(例如:「'Subway','A & W 」,.....「)

這裏是你可以做什麼: 看看我的回答這個問題,其他的今天: SQL - using a variable for an IN clause

0

在SSRS您可以在(@list寫),但在定期的T-SQL,你不能。

但是,您可以在2008年將表值參數傳遞給proc,因此您可以輕鬆地以這種方式處理它(如果您願意,也可以使用連接)。