在动态SQL中构建字符串 - 棘手的引号

时间:2012-12-12 14:06:29

标签: sql sql-server quotes dynamic-sql

我正在尝试为一些动态SQL构建自定义错误消息字符串。如果没有包装在动态SQL中,它看起来像这样:

SET @message = 'EXCEPTION: Msg ' + COALESCE(CAST(ERROR_NUMBER() AS NVARCHAR(20)), '[NULL]') + ', ' +
   'Level ' + COALESCE(CAST(ERROR_SEVERITY() AS NVARCHAR(20)), '[NULL]')  + ', ' +
   'State ' + COALESCE(CAST(ERROR_STATE() AS NVARCHAR(20)), '[NULL]') + ', ' +
   'Procedure ' + COALESCE(@PROCEDURE_NAME, '[NULL]') + ', ' +
   'Line ' + COALESCE(CAST(ERROR_LINE() AS NVARCHAR(20)), '[NULL]') + ', ' +
   'Message: ' + COALESCE(ERROR_MESSAGE(), '[NULL]') ;

我无法获取引号,因此当它在动态SQL中执行时看起来像这样。报价如何安排如下:

EXEC @sql = 'BEGIN TRY
...
END TRY 
BEGIN CATCH 
DECLARE @PROCEDURE_NAME NVARCHAR(128);
SET @PROCEDURE_NAME = OBJECT_NAME(@@PROCID);

END CATCH
';

1 个答案:

答案 0 :(得分:2)

您的留言代码看起来不错。

但是,如果要将@message嵌入到动态SQL中,则必须将每个引号加倍。

这是一种手工痛苦。所以,我做了以下几点:

  1. 按照您的意思编写SQL。
  2. 选择它。
  3. 键入H(或从菜单中选择)。在搜索框中添加单引号('),在替换框中添加两个单引号('')。
  4. 替换选择中的所有内容。