尝试在SQL Server 2016中使用存储过程将值插入表中时出现此错误。我正在使用动态 SQL:
SET @InsertIntoTable = 'INSERT INTO ' + @TableName +
'VALUES (' + @Param1 +
',' + @Param2 +
',' + @Param3 +
',' + @Param4 +
',' + @Param5 +
',' + @Param6 +
',' + @Param7 + ')'
当我想在 @Param3 中插入一个值时,会发生错误,其中我正在传入一个十六进制字符串(例如字符串"24A673C87B11AE1D8F50765E86270FA0546F241F499868"(。
该错误表示"A673C87B11AE1D8F50765E86270FA0546F241F499868"处的语法不正确(这与我上面提供的示例的错误完全不同,它只是原始字符串的子字符串,而不是整个字符串(。我正在传递用于@Param3、@Param4和@Param5的十六进制字符串
理想情况下,您应该使用sp_executesql但要解决您遇到的问题,您应该执行以下操作:
SET @InsertIntoTable = 'INSERT INTO ' + @TableName +
' VALUES (''' + @Param1 --<-- space before Values
+ ''', ''' + @Param2
+ ''', ''' + @Param3
+ ''', ''' + @Param4
+ ''', ''' + @Param5
+ ''', ''' + @Param6
+ ''', ''' + @Param7
+ ''')'
若要将sp_executesql与参数化查询一起使用,请执行以下操作,它还可以保护您免受 SQL 注入攻击。
Declare @Sql NVARCHAR(MAX);
SET @sql = N' INSERT INTO ' + QUOTENAME(@TableName)
+ N' VALUES ( @Param1
, @Param2
, @Param3
, @Param4
, @Param5
, @Param6
, @Param7);'
Exec sp_executesql @sql
, N'@Param1 [datatype] , @Param2 [datatype], @Param3 [datatype]....'
, @Param1
, @Param2
, @Param3
, @Param4
, @Param5
, @Param6
, @Param7;