逃逸动态SQL的更优雅的方式?(A more elegant way of escaping dyn

2019-09-01 13:54发布

好了,我有一个搜索存储过程这行代码:

SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + ''''

有两个基本的操作,我想精简- 第一次是在周围的单引号合并的值。 显然,在上面的语句,我逃避一个'通过使用两个'' ,然后结束一个字符串'这样我可以连接的实际值。 我们有了一个更好的办法!

操作的第二个将是REPLACE(@job_code, '''', '''''')在那里我逃逸,可能在该领域存在的任何单引号。

是不是有写这行代码作为一个整体的一个更优雅的方式?

我认为这是ESCAPE关键字但是这紧紧地拴LIKE语句,所以没有去那里。

Answer 1:

不知道你是如何执行SQL查询,如果你使用sp_executesql的,可能是这样的

EXECUTE sp_executesql 
          N'SELECT * FROM YouTable WHERE job_code = @job_code',
          N'@job_code varchar(100)',
          @job_code = @job_code;


Answer 2:

参数化查询答案很可能是真正的“正确答案”,而是要回答你原来的问题,你想要的是QUOTENAME() 。 更具体地讲,单引号版本:

SET @where = 'job_code = ' + QUOTENAME(@job_code, '''')

请注意,这个长度限制(输入是一个sysname ,这意味着128个字符),不过,因为它旨在引用数据库对象的名称,而不是作为一个通用的机制。



Answer 3:

你可以声明常量:

declare @SQ as char(1) = ''''

SET @where = 'job_code = ' + @SQ + REPLACE(@job_code, @SQ, @SQ + @SQ) + @SQ


Answer 4:

您可以定义处理您的典型场景,像一个函数:

create function WrapAndReplaceQuotes (@input as varchar(max))
returns varchar(max)
as
begin
    return '''' + replace(@input, '''', '''''') + ''''
end

SET @where = 'job_code = ' + WrapAndReplaceQuotes(@job_code)


文章来源: A more elegant way of escaping dynamic SQL?