首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`WHERE…在@xs`中,@xs参数是一个值列表:受ADO.NET支持?

‘`WHERE…在@xs`中,@xs参数是一个值列表:受ADO.NET支持?
EN

Stack Overflow用户
提问于 2013-06-08 16:12:35
回答 3查看 690关注 0票数 1

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

这是行不通的:

代码语言:javascript
复制
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 )吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-08 22:10:19

如果您使用的是SQL Server2008或更高版本,另一种方法可能是使用“表值参数”。更多信息请点击此处:Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters

票数 1
EN

Stack Overflow用户

发布于 2013-06-08 16:23:30

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

代码语言:javascript
复制
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)
);
票数 2
EN

Stack Overflow用户

发布于 2013-06-08 16:20:44

正如您已经发现的:这是不受支持的。

代码语言:javascript
复制
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():
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16997496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档