【问题标题】:Dynamic insert sql stored procedure动态插入sql存储过程
【发布时间】:2016-03-22 17:35:14
【问题描述】:

我有一个关于动态插入 sql 存储过程的问题,因为我需要插入一个未知数量(动态生成),

下面是它的写法:

@Parameter as nvarchar(Max),
@SQLQuery as nvarchar(Max)

SET @SQLQuery = 'insert into <table>
(FieldOne,FieldTwo,FieldThree,GeneratedId,dateAdded,addedBy)
values '+@Parameter
EXEC sp_executesql @SQLQuery

当我尝试使用以下值执行此存储过程时:

@Parameter = (1,0,0,12345678123,"2016-03-22 23:26:25",123)
@SQLQuery = null

我什至尝试(出于愚蠢的原因)尝试以下值:

@Parameter = (1,0,0,12345678123,2016-03-22 23:26:25,123)
@SQLQuery = null

我从 SQL Server 收到以下错误

消息 102,级别 15,状态 1,行 3 '23' 附近的语法不正确。

(受影响的 1 行)

但实际上没有添加任何行。

我使用的表格如下:

ID           (PK and autoincrement)
FieldOne:    tinyint
FieldTwo:    tinyint
FieldThree:  tinyint
GeneratedId: nvarchar(50)
dateAdded:   datetime
addedBy:     int

我似乎无法弄清楚我做错了什么,

提前感谢大家的时间和帮助。

【问题讨论】:

  • “我需要插入未知数量”是什么意思?列数未知?
  • @Parameter = (1,0,0,12345678123,''2016-03-22 23:26:2'',123) 使用双单引号
  • 是的,在某些时候我可能需要 (1,0,0,12345678123,"2016-03-22 23:26:25",123) 而另一个时候我可能需要 (1,0 ,0,12345678123,"2016-03-22 23:26:25",123),(1,0,0,12345678124,"2016-03-22 23:26:26",123)

标签: sql vb.net sql-server-2008


【解决方案1】:

您的日期变量应该用单引号括起来,而不是双引号。尝试一下,它应该可以工作。

但是.....

如果您特别想走这条(不寻常的)道路,我强烈建议您使用 sp_ExecuteSQL 中的参数化查询支持 - 它会为您提供更好的性能且通常更安全的查询。

查看https://msdn.microsoft.com/en-us/library/ms188001.aspx,了解有关如何使用 sp_ExecuteSQL 进行参数化查询的更多信息。

【讨论】:

    【解决方案2】:

    如果您需要双引号,请确保 QUOTED_IDENTIFIER 已打开 IE。 SET QUOTED_IDENTIFIER ON;

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 2020-07-05
      • 2017-01-26
      • 2018-04-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多