如何在动态SQL中转义单引号

时间:2017-03-01 04:44:06

标签: sql sql-server dynamicquery single-quotes

我在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)直接是要插入的值而不是实际的列名。需要检索其值以进行插入的源表?

1 个答案:

答案 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
;