gpt4 book ai didi

sql - 针对不同服务器的条件 SQL

转载 作者:行者123 更新时间:2023-12-03 20:55:14 26 4
gpt4 key购买 nike

如何让一条 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

但在测试机器上,我希望运行相同的 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

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

最佳答案

您需要使用动态 SQL。此外,您不应该使用 'single 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;

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

或者,为了使代码更稳定,您可以在两个环境中使用同义词。在开发中:

CREATE SYNONYM dbo.sp_class FOR DEVSERVER.cases.dbo.sp_class;

测试中:

CREATE SYNONYM dbo.sp_class FOR TESTSERVER.cases.dbo.sp_class;

现在您的查询可以是:

INSERT  INTO [sds].[dbo].[Team_Email_Addresses]
SELECT [class],
[description],
[DutyEmail]
FROM [dbo].[sp_class]
WHERE [status] = 1;

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

关于sql - 针对不同服务器的条件 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com