我在SQL Server上有以下查询,其中一些值存储在先前计算的变量中:
SET @Command = N'INSERT INTO Products (Id
,Region
,Name
,Category
,CreatedBy
,CreatedOn
,) SELECT ' + @Id + ',
Region,
''' + @ProductName + ''',
Category,
CreatedBy,
CreatedOn FROM ' + @ProductTable + '
WITH (NOLOCK) WHERE Id IS NOT NULL';
EXEC(@Command)
它运行正常,除非@ProductName的值包含引号(例如 Jim的产品),在这种情况下我收到以下错误:字符串后的未闭合引号
有没有办法在像这样的动态查询中处理变量中的单引号,其中插入的一个选定值(在本例中为@ProductName)直接是要插入的值而不是实际的列名。需要检索其值以进行插入的源表?
答案 0 :(得分:4)
最好的方法是使用sp_executesql
代替EXEC
,并为@ProductName
值使用适当的参数。
无法参数化的其余查询(表@ProductTable
的名称)将保持动态字符串连接。
在这种情况下,您不需要转义任何内容,并且可以防止SQL注入。
这样的事情:
SET @Command =
N'INSERT INTO Products
(Id
,Region
,Name
,Category
,CreatedBy
,CreatedOn)
SELECT
@ParamId
,Region
,@ParamProductName
,Category
,CreatedBy
,CreatedOn
FROM ' + @ProductTable + N' WITH (NOLOCK)
WHERE ID IS NOT NULL'
;
EXEC sp_executesql
@Command
,N'@ParamId int, @ParamProductName nvarchar(255)'
,@ParamId = @Id
,@ParamProductName = @ProductName
;