针对不同服务器的条件SQL

Ste*_*veC 3 sql sql-server sql-server-2008

如何有一个SQL有条件地更改目标服务器?

所以在我的本地开发机器上,我可以运行它并拥有命令......

INSERT  INTO [sds].[dbo].[Team_Email_Addresses]
        SELECT  [class] AS 'Team number' ,
                [description] AS 'Team name' ,
                [DutyEmail] AS 'Team email address'
        FROM    [DEVSERVER].[cases].[dbo].[sp_class]
        WHERE   [status] = 1
Run Code Online (Sandbox Code Playgroud)

但是在测试机器上我希望运行相同的SQL并获得命令......

INSERT  INTO [sds].[dbo].[Team_Email_Addresses]
        SELECT  [class] AS 'Team number' ,
                [description] AS 'Team name' ,
                [DutyEmail] AS 'Team email address'
        FROM    [TESTSERVER].[cases].[dbo].[sp_class]
        WHERE   [status] = 1
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用变量@TGT并将其设置为SQL devservertestserverSQL FROM [@TGT].[cases].[dbo].[sp_class],但是我收到错误Could not find server '@TGT' in sys.servers.

Aar*_*and 6

您需要使用动态SQL.此外,您不应该使用'single quotes'分隔列别名; 此语法已被弃用.你应该使用[square brackets]"double quotes"(前者通常是首选的).

DECLARE @sql NVARCHAR(MAX), @TGT SYSNAME;

SET @TGT = N'[TESTSERVER]';

SET @sql = N'INSERT  INTO [sds].[dbo].[Team_Email_Addresses]
        SELECT  [class] AS [Team number] ,
                [description] AS [Team name] ,
                [DutyEmail] AS [Team email address]
        FROM    ' + @TGT + '.[cases].[dbo].[sp_class]
        WHERE   [status] = 1;';

PRINT @sql;
EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

(实际上你并不需要这里的别名,尽管你应该指定插入列列表.)

或者,如何使代码更稳定,就是在两个环境中使用同义词.在开发中:

CREATE SYNONYM dbo.sp_class FOR DEVSERVER.cases.dbo.sp_class;
Run Code Online (Sandbox Code Playgroud)

在测试中:

CREATE SYNONYM dbo.sp_class FOR TESTSERVER.cases.dbo.sp_class;
Run Code Online (Sandbox Code Playgroud)

现在您的查询可以简单地是:

INSERT  INTO [sds].[dbo].[Team_Email_Addresses]
        SELECT  [class],
                [description],
                [DutyEmail]
        FROM    [dbo].[sp_class]
        WHERE   [status] = 1;
Run Code Online (Sandbox Code Playgroud)

当然,只有在SQL Server 2005或更高版本上,同义词才有效.指定您正在使用的SQL Server版本总是很有用!