`WHERE ... IN @ xs`,其中@xs参数是值列表:ADO.NET支持?

时间:2013-06-08 08:12:35

标签: c# sql ado.net where-in parameterized-query

我正在尝试使用WHERE … IN @xs子句创建参数化的ADO.NET查询,其中@xs是可能不连续的值的简短列表,例如(2, 3, 5, 8, 13)。可以这样做吗?如果是这样,怎么样?

这不会起作用:

int[] xs = { 2, 3, 5, 8, 13 };  // I've also tried using a List<int> instead
var c = new System.Data.SqlClient.SqlCommand();
c.CommandText = "SELECT … FROM … WHERE … IN @xs";
c.Parameters.AddWithValue("@xs", xs);  // throws ArgumentException due to `values`

System.Data.SqlDbType enum中的System.Data.SqlTypes namespace和类型都不表示支持此方案。我必须恢复到动态SQL(即使用字符串操作手动编写最终的SQL CommandText)?

3 个答案:

答案 0 :(得分:2)

您必须一次构建一个参数:

int[] xs = { 2, 3, 5, 8, 13 };
var c = new SqlCommand();
var parameters = xs.Select((x, i) => string.Concat("@xs", i)).ToList();
for (var i = 0; i < xs.Count; i++)
{
    c.Parameters.AddWithValue(parameters[i], xs[i]);
}

c.CommandText = string.Format(
    "SELECT ... FROM ... WHERE ... IN ({0})", 
    string.Join(", ", parameters)
);

答案 1 :(得分:1)

正如您已经发现的那样:不支持。

int[] xs = { 2, 3, 5, 8, 13 };
var c = new System.Data.SqlClient.SqlCommand();
// this code assumes xs has always at least one item
var s = new StringBuilder("SELECT … FROM … WHERE … IN (@xs0");
c.Parameters.AddWithValue("@xs0", xs[0]);  
for(int i = 1; i < xs.Length; i++)
{
  s.AppendFormat(",@xs{0}", i);
  c.Parameters.AddWithValue(String.Format("@xs{0}",i), xs[i]);  
}
s.Append(")");
c.CommandText = s.ToString():

答案 2 :(得分:1)

如果您使用的是SQL Server 2008或更高版本,则替代方法可能是使用“表值参数”。更多信息:Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters