好了,我有一个搜索存储过程这行代码:
SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + ''''
有两个基本的操作,我想精简- 第一次是在周围的单引号合并的值。 显然,在上面的语句,我逃避一个'
通过使用两个''
,然后结束一个字符串'
这样我可以连接的实际值。 我们有了一个更好的办法!
操作的第二个将是REPLACE(@job_code, '''', '''''')
在那里我逃逸,可能在该领域存在的任何单引号。
是不是有写这行代码作为一个整体的一个更优雅的方式?
我认为这是ESCAPE
关键字但是这紧紧地拴LIKE
语句,所以没有去那里。
不知道你是如何执行SQL查询,如果你使用sp_executesql的,可能是这样的
EXECUTE sp_executesql
N'SELECT * FROM YouTable WHERE job_code = @job_code',
N'@job_code varchar(100)',
@job_code = @job_code;
参数化查询答案很可能是真正的“正确答案”,而是要回答你原来的问题,你想要的是QUOTENAME() 。 更具体地讲,单引号版本:
SET @where = 'job_code = ' + QUOTENAME(@job_code, '''')
请注意,这个长度限制(输入是一个sysname
,这意味着128个字符),不过,因为它旨在引用数据库对象的名称,而不是作为一个通用的机制。
你可以声明常量:
declare @SQ as char(1) = ''''
SET @where = 'job_code = ' + @SQ + REPLACE(@job_code, @SQ, @SQ + @SQ) + @SQ
您可以定义处理您的典型场景,像一个函数:
create function WrapAndReplaceQuotes (@input as varchar(max))
returns varchar(max)
as
begin
return '''' + replace(@input, '''', '''''') + ''''
end
SET @where = 'job_code = ' + WrapAndReplaceQuotes(@job_code)