SQL Server:参数未在子句的AND部分求值
本文关键字:AND 子句 Server 参数 SQL | 更新日期: 2023-09-27 18:24:53
以下带参数的SQL查询有效:
select A from B where C = @param1;
C#:
command.Parameters.AddWithValue("@param1", "TEXT");
注:C
是字符串类型的列
以下带参数的SQL查询不起作用:
select A from B where C = @param1 and D in (@param2);
C#:
command.Parameters.AddWithValue("@param1", "123,234,456");
注:D
是int
型的一列
因为不能像那样参数化in
;您当前正在对一个值请求in
,该值恰好是一个包含逗号的字符串,也就是说,只有当有一行D
等于123,234,456
时,这才有效。
您需要或者每个值都有一个参数,即
... and D in (@param2, @param3, @param4)
或者使用一个为你做这件事的工具。例如,使用"dapper":
string c = "TEXT";
int[] vals = { 123, 234, 456 };
var data = conn.Query<AType>("select A from B where C = @c and D in @vals",
new { c, vals }).ToList();
请参阅下面的链接,他们还将数组传递给SQL IN
子句
var parameters = new string[items.Length];
var cmd = new SqlCommand();
for (int i = 0; i < items.Length; i++)
{
parameters[i] = string.Format("@Age{0}", i);
cmd.Parameters.AddWithValue(parameters[i], items[i]);
}
cmd.CommandText = string.Format("SELECT * from TableA WHERE Age IN ({0})", string.Join(", ", parameters));
cmd.Connection = new SqlConnection(connStr);
有关详细信息,请参阅:在SqlCommand中传递数组参数,由@Brian 回答
它确实有效。它只是没有达到你的预期。表达式:
D in (@param2)
真的在做:
D = (@param2)
因为列表只包含一个元素。它是一个包含逗号的元素,但它仍然只是一个字符串。
一种解决方法是列出显式参数:
D in (@in1, @in2, @in3, @in4)
或者使用效率较低的方法,如like
:
',' + @param2 + ',' like '%,' + D + ',%'
注意:这假设D
是一个字符串类型。如果是数字,则需要将其强制转换为字符类型。