如何通过 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