如何在更新命令上使用动态SQL?

时间:2018-10-24 09:18:02

标签: sql sql-server

我有更新命令。就是这样。

Update DispatchExceptions
SET TYPE='MWM'
WHERE ID=9801246

我想使用动态sql触发相同的命令。

DECLARE @ColumnName varchar(20)=N'TYPE'
DECLARE @ColumnValue char(3)='MWM'
DECLARE @ID INTEGER = 9801246
declare @Query nvarchar(max)


SET @Query = 'Update DispatchExceptions SET '+ QUOTENAME(@ColumnName) + '''=' + @ColumnValue + '''WHERE ID =' + @ID +''

EXEC (@Query)

但是显示以下错误。

Conversion failed when converting the nvarchar value 'Update DispatchExceptions SET [TYPE]'=MWM'WHERE ID =' to data type int. 

在这种情况下如何使用动态sql。有任何建议。

3 个答案:

答案 0 :(得分:3)

这里的问题专门是' + @ID部分。 @ID是数据类型int,其数据类型优先级比nvarchar高;因此,任何其他表达式都将隐式转换为int(并且我确定您知道'Update DispatchExceptions SET...'不是int)。

如果您对查询进行参数设置,则不会出现此问题:

DECLARE @ColumnName sysname = N'TYPE'; --Changed the datatype here to sysname, as the caters for all possible object names
                                       --sysname is actually a synonym for nvarchar(128), and 128 is the maximum length for an object's name
DECLARE @ColumnValue char(3) = 'MWM';
DECLARE @ID integer = 9801246;
DECLARE @Query nvarchar(MAX);   

SET @Query = N'Update DispatchExceptions SET ' + QUOTENAME(@ColumnName) + N' = @value WHERE ID = @ID;';

EXEC sp_executesql @Query,
                   N'@Value char(3), @ID int',
                   @Value = @ColumnValue,
                   @ID = @ID;

对于OP,在使用QUOTENAME方面做得很好。常常会错过这一点,从而使(动态)SQL易于注入。

答案 1 :(得分:1)

DBMS添加失败

9801246

Update DispatchExceptions SET [TYPE]'=MWM'WHERE ID =

因为后者是一个字符串,并且将表根转换为数字,所以必须在其中添加数字9801246:-)

一种解决方案:

DECLARE @ID varchar(7) = '9801246'

另一种解决方案:

SET @Query = 'Update DispatchExceptions SET '+ QUOTENAME(@ColumnName) +
             '''=' + @ColumnValue + '''WHERE ID =' + CAST(@ID AS VARCHAR(7)) +''

答案 2 :(得分:1)

只需将您的@ID强制转换为varchar,并按如下所示在@ColumnValue之前正确引用:

   q) items: `nut`cam
   q) items like "cam"  / 01b