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 devserver或testserverSQL FROM [@TGT].[cases].[dbo].[sp_class],但是我收到错误Could not find server '@TGT' in sys.servers.
您需要使用动态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版本总是很有用!
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |