SQL IN 运算符无法在 C# Winforms 中处理标量变量的多个值
SQL IN operator is not working with multiple value of scalar variable in C# Winforms
我遇到了一个问题,即 SQL IN
运算符在 C# 中无法处理标量变量的多个值,但查询在 SQL Server 2012 中有效。
这是有效的:
SELECT WorkStatus
FROM viewWorkRequest
WHERE WorkStatus IN ('Open', 'Closed')
但它在 C# 中不起作用
string All = "'Open','Closed'";
string sql = "SELECT WorkStatus FROM viewWorkRequest WHERE WorkStatus IN (@WorkStatus)"
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@WorkStatus", All);
cmd.ExecuteNonQuery();
}
提前致谢
为什么您认为第一个 SQL 起作用的事实会对第二个 SQL 产生任何影响,后者不包含 IN
子句?
每个参数只能包含一个值,并且 IN
子句中的每个值都是不同的,因此您不能为具有单个参数的 IN
子句传递多个值。如果您不知道您将拥有多少个值,那么您必须以允许可变数量参数的方式构建您的 SQL,例如
var values = new[] {"Open", "Closed"};
var sql = $"SELECT * FROM viewWorkRequest WHERE WorkStatus IN ({string.Join(", ", Enumerable.Range(0, values.Length).Select(n => "@WorkStatus" + n))})";
var command = new SqlCommand(sql, connection);
for (var i = 0; i < values.Length; i++)
{
command.Parameters.Add("@WorkStatus" + i, SqlDbType.VarChar, 50).Value = values[i];
}
我遇到了一个问题,即 SQL IN
运算符在 C# 中无法处理标量变量的多个值,但查询在 SQL Server 2012 中有效。
这是有效的:
SELECT WorkStatus
FROM viewWorkRequest
WHERE WorkStatus IN ('Open', 'Closed')
但它在 C# 中不起作用
string All = "'Open','Closed'";
string sql = "SELECT WorkStatus FROM viewWorkRequest WHERE WorkStatus IN (@WorkStatus)"
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@WorkStatus", All);
cmd.ExecuteNonQuery();
}
提前致谢
为什么您认为第一个 SQL 起作用的事实会对第二个 SQL 产生任何影响,后者不包含 IN
子句?
每个参数只能包含一个值,并且 IN
子句中的每个值都是不同的,因此您不能为具有单个参数的 IN
子句传递多个值。如果您不知道您将拥有多少个值,那么您必须以允许可变数量参数的方式构建您的 SQL,例如
var values = new[] {"Open", "Closed"};
var sql = $"SELECT * FROM viewWorkRequest WHERE WorkStatus IN ({string.Join(", ", Enumerable.Range(0, values.Length).Select(n => "@WorkStatus" + n))})";
var command = new SqlCommand(sql, connection);
for (var i = 0; i < values.Length; i++)
{
command.Parameters.Add("@WorkStatus" + i, SqlDbType.VarChar, 50).Value = values[i];
}