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");

注:Dint型的一列

SQL Server:参数未在子句的AND部分求值

因为不能像那样参数化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是一个字符串类型。如果是数字,则需要将其强制转换为字符类型。