动态构建sql服务器插入语句插入失败

Dynamically built sql server insert statement fails to insert

我们在验证后动态构建一个sql语句

在 运行 一些代码之后,插入的生成值如下所示:

(1, 1, SYSDATETIME(), null),
(4, 1, SYSDATETIME(), null),
(6, 1, SYSDATETIME(), null),
(8, 1, SYSDATETIME(), null)

有效的SQL语法

然后我们按如下方式使用它

IF(@Activities != null)
Begin
 INSERT INTO [User].[User_Activities]
       (UserId, ActivitieId, DateCreated, DateDeleted)
 VALUES
       @Activities
END

@Activities 是上面动态构建的 SQL 语句,它会抛出一个错误,指出 @Activities 的语法不正确。

即使在 SQL 查询中 window 它看起来像这样:

Insert into [User].User_Activities
(UserId, ActivitieId, DateCreated, DateDeleted)
Values
(1, 1, SYSDATETIME(), null),
(4, 1, SYSDATETIME(), null),
(6, 1, SYSDATETIME(), null),
(8, 1, SYSDATETIME(), null)

并且执行成功,请问如何通过应用程序使其成功运行?

像这样使用 @Activities 不会构建动态 SQL 语句。它将语句的静态部分与动态部分结合在一起,这在 SQL 服务器中是不可能的。

您还必须正确制定 IF 语句:!= 运算符不能用于与 NULL 值进行不等式比较(它永远不会计算为 TRUE) . IS NOT NULL在这种情况下使用。

你必须使用EXEC来实现你想要的:

IF(@Activities IS NOT NULL)
BEGIN
  EXEC('INSERT INTO [User].[User_Activities]
          (UserId, ActivitieId, DateCreated, DateDeleted)
        VALUES' + @Activities)
END

看看 SqlBulkCopy 或 table 值参数。这些提供了一种从 C# 应用程序将多条记录插入 SQL 数据库的更简洁的方法。