我正在尝试使用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
)?
答案 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