我有更新命令。就是这样。
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。有任何建议。
答案 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