如何通过 ado.net 查询在 SQL IN 子句中传递 null
How to pass null in SQL IN Clause through ado.net query
我正在将员工 ID 列表传递给我的 ado.net 查询。有时我的列表是空的,所以在这种情况下我会收到错误消息。
错误说:Incorrect syntax near ')'.
这是我的代码:
var emps = String.Join(",", empList.Keys);
StringBuilder sql = new StringBuilder(
$@"select [Id]
FROM [Test].[dbo].[Employees]
Where [Id] NOT IN {emps}"
);
事先检查您的 emp 列表,如果列表不为空,则仅将 WHERE 子句添加到 StringBuilder。
在你的 sql 字符串中还有一个额外的 ')',
其中 [Id] 不在 {emps})
您需要将其删除。
您发布的 SQL 中存在很多问题,但您似乎在说您将 运行 这个 SQL 一遍又一遍,每次添加更多要排除的 ID。也许你做了一些事情,不断发现应该被忽略的新 ID
考虑:
using var con = new SqlConnection(...);
for(..some..ongoing..iterative..process){
empList = ..get new IDs here..
var sql = "select [Id] from [Test].[dbo].[Employees] ";
if(empList.Count > 0){
sql += $"where [Id] NOT IN ({string.Join(",", empList.Select((kvp,i) => $"@p{i}"))})";
}
using var cmd = new SqlCommand(sql, con);
//it's a no-op if 0 values
cmd.Parameters.AddRange(empList.Select((kvp,i) => new SqlParameter($"@p{i}", SqlDbType.Int) { Value = kvp.Value }));
..execute here..
}
打开和关闭 con
的位置取决于计算新 ID 所需的时间。如果每次都是几毫秒,在循环前打开应该问题不大。如果获取新 ID 需要很长时间,请在需要时打开 con
我正在将员工 ID 列表传递给我的 ado.net 查询。有时我的列表是空的,所以在这种情况下我会收到错误消息。
错误说:Incorrect syntax near ')'.
这是我的代码:
var emps = String.Join(",", empList.Keys);
StringBuilder sql = new StringBuilder(
$@"select [Id]
FROM [Test].[dbo].[Employees]
Where [Id] NOT IN {emps}"
);
事先检查您的 emp 列表,如果列表不为空,则仅将 WHERE 子句添加到 StringBuilder。 在你的 sql 字符串中还有一个额外的 ')',
其中 [Id] 不在 {emps})
您需要将其删除。
您发布的 SQL 中存在很多问题,但您似乎在说您将 运行 这个 SQL 一遍又一遍,每次添加更多要排除的 ID。也许你做了一些事情,不断发现应该被忽略的新 ID
考虑:
using var con = new SqlConnection(...);
for(..some..ongoing..iterative..process){
empList = ..get new IDs here..
var sql = "select [Id] from [Test].[dbo].[Employees] ";
if(empList.Count > 0){
sql += $"where [Id] NOT IN ({string.Join(",", empList.Select((kvp,i) => $"@p{i}"))})";
}
using var cmd = new SqlCommand(sql, con);
//it's a no-op if 0 values
cmd.Parameters.AddRange(empList.Select((kvp,i) => new SqlParameter($"@p{i}", SqlDbType.Int) { Value = kvp.Value }));
..execute here..
}
打开和关闭 con
的位置取决于计算新 ID 所需的时间。如果每次都是几毫秒,在循环前打开应该问题不大。如果获取新 ID 需要很长时间,请在需要时打开 con