繁体   English   中英

如何通过 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 需要很长时间,请在您需要的时候打开骗局

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM