如何正确引用这个动态SQL?

时间:2014-10-23 15:19:50

标签: sql tsql dynamic exec quotes

我正在尝试编写一些动态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;

'')'

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

Msg 102,Level 15,State 1,Line 5 ' master'

附近的语法不正确

有关错误的任何提示?

1 个答案:

答案 0 :(得分: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;'