动态构建的sql server insert语句无法插入

时间:2015-04-05 06:15:29

标签: c# sql-server sql-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查询窗口中,它看起来像这样:

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)

并成功执行,如何通过应用程序成功完成此工作?

2 个答案:

答案 0 :(得分:1)

查看SqlBulkCopy或表值参数。这些提供了一种更简洁的方法,可以将多个记录从C#app插入到SQL数据库中。

答案 1 :(得分:0)

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

您还必须正确制定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