【问题标题】:How to quote this dynamic SQL properly?如何正确引用这个动态 SQL?
【发布时间】:2014-12-19 07:43:32
【问题描述】:

我正在尝试编写一些动态 SQL,如下所示:

EXECUTE master.sys.sp_msforeachdb 'USE [?]; EXEC (''

DECLARE @type NVARCHAR(32);

IF DB_NAME() IN (''master'',''model'',''msdb'',''tempdb'')
BEGIN
    SET @type = ''System'';
END

SELECT @type;

'')'

但我认为引用不起作用,因为我收到错误:

消息 102,第 15 级,状态 1,第 5 行 “master”附近的语法不正确。

关于什么是错误的任何提示?

【问题讨论】:

    标签: sql tsql dynamic exec quotes


    【解决方案1】:

    您需要双重转义 EXEC('') 中的所有内容,例如

    IF DB_NAME() IN (''''master'''',''''model'''',''''msdb'''',''''tempdb'''')
    

    第一个转义是sp_msforeachdb,就目前而言(只有一个),你最终会得到类似的东西:

    USE [Master];
    EXEC ('IF DB_NAME() IN ('master', 'model', 'msdb', 'tempdb')
    ...
    

    你最终需要的是:'

    USE [Master];
    EXEC ('IF DB_NAME() IN (''master'', ''model'', ''msdb'', ''tempdb'')
    ...
    

    所以你的完整 SQL 变成:

    EXECUTE master.sys.sp_msforeachdb 'USE [?]; EXEC (''
    
    DECLARE @type NVARCHAR(32);
    
    IF DB_NAME() IN (''''master'''',''''model'''',''''msdb'''',''''tempdb'''')
    BEGIN
        SET @type = ''''System'''';
    END
    
    SELECT @type;
    
    '')'
    

    但是,完全没有必要使用EXEC

    EXECUTE master.sys.sp_msforeachdb 'USE [?]; 
        DECLARE @type NVARCHAR(32);
    
        IF DB_NAME() IN (''master'',''model'',''msdb'',''tempdb'')
        BEGIN
            SET @type = ''System'';
        END
    
        SELECT @type;'
    

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多