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

Mik*_*oud 15 sql t-sql sql-server sql-server-2008

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

SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + ''''
Run Code Online (Sandbox Code Playgroud)

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

第二个操作将是REPLACE(@job_code, '''', '''''')我逃避现场可能存在的任何单引号的地方.

是不是有更优雅的方式来编写这行代码?

我认为这是ESCAPE关键字,但这与LIKE声明紧密相关,所以不要去那里.

Eri*_*icZ 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;
Run Code Online (Sandbox Code Playgroud)

  • 添加奖金是您获得计划重用和减少计划缓存膨胀. (4认同)
  • +1:这是我想象的解决方案,关于它的好处是你无论如何都可以填充@job_code而不用担心任何转义. (2认同)

Ata*_*rio 5

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

SET @where = 'job_code = ' + QUOTENAME(@job_code, '''')
Run Code Online (Sandbox Code Playgroud)

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