一种更优雅的方式来逃避动态SQL?

时间:2013-04-30 20:12:01

标签: sql sql-server sql-server-2008 tsql

好的,所以我在搜索存储过程中有这行代码:

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

并且基本上有两个我想简化的操作 - 第一个用单引号括起连接值。显然,在上面的语句中,我正在逃避{{1}通过使用两个',然后使用''结束字符串,以便我可以连接实际值。必须有更好的方法!

第二个操作将是',我将在其中转义字段中可能存在的任何单引号。

整体编写这行代码是不是更优雅?

我认为这是REPLACE(@job_code, '''', '''''')关键字,但它与ESCAPE语句紧密相关,所以不要去那里。

4 个答案:

答案 0 :(得分:27)

不确定如何执行sql查询,如果使用sp_executesql,可能是这样的

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

答案 1 :(得分:5)

参数化查询答案可能是真正的“正确答案”,但要回答原始问题,您需要的是QUOTENAME()。更具体地说,单引号版本:

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

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

答案 2 :(得分:2)

您可以声明常量:

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

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

答案 3 :(得分:2)

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

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

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