准备好的陈述 - 在列表中

时间:2011-02-13 13:58:23

标签: c# sql prepared-statement

  

可能重复:
  Parameterizing a SQL IN clause?

如何将以下查询翻译成预准备语句(如果可能的话)?

string allemails = "aaa@aaa.aaa, bbb@bbb.bbb, ccc@ccc.ccc"; //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,我该如何要求无限大小?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

嗯,好的,它不要认为你可以这样做。

我的看法是重写查询以对一组选项使用连接,并从split函数生成该组选项。

在这里进行拆分: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而不在数据库中创建SP,但我会选择SP。

关心GJ