我正在尝试编写一些动态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'
附近的语法不正确有关错误的任何提示?
答案 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;'