2011-02-13 53 views
1

可能重複:
Parameterizing a SQL IN clause?預處理語句 - 在列表

如何翻譯下面的查詢,以準備語句(如果可能的話..)?

string allemails = "[email protected], [email protected], [email protected]"; //etc... 
string query = "select UNIQUE_ID users where E_MAIL in (" + allemails + ")"; 
//run query.... 

我可以這樣做:

OdbcCommand cmd = sqlConn.CreateCommand(); 
cmd.CommandText = "select UNIQUE_ID users where E_MAIL in (?)"; 

如果是的話,我要補充的CMD參數集合的參數,如果它是VARCHAR,我怎麼能要求無限的大小?

回答

0

嗯,好的,它不;噸覺得你能做到這樣。

我採取的是重寫使用加入針對一組選項查詢,您生成一套從分割功能選項。

的一瞬間看看這裏:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648

然後SP會是這個樣子

Create proc GetUsersByEmail 
@EmailList varchar(8000) 
as 

    select unique_id 
    from users u 
     inner join split(@emaillist,',') e on u.e_mail = e.data 

其實你也可以直接通過SQL而不在DB的SP,但我去一個SP。

問候GJ

+0

加入成本不僅僅是一個簡單的「在列表中」...... – Nili 2011-02-13 14:12:19

+0

檢查確實如此。這種方法可行,但建議的線程包含更好的解決方案。 – gjvdkamp 2011-02-13 15:08:48

1

您正在使用的的OdbcCommand將表明您使用的是SQL Server之外的數據庫。 SQL Server 2008引入了table valuded parameters這可能是一個解決方案。

假設您正在使用不支持此功能,分割功能,如gjvdkamp建議將是一種選擇的一個數據庫。

如果你的數據庫支持動態SQL(SQL Server以爲此提供了sp_executesql stored procedure)你也可以考慮使用。

,你可能要考慮的最後一個選項(不是很優雅)將允許電子郵件地址的數量有限,而且允許每個通過其自身的參數傳遞。然後,您將在where子句中使用它們,如下所示。

where E_MAIL in (@Address1, @Address2, @Address3)