如何编写引用链接服务器的可移植SQL?


9

我有一个引用链接服务器的存储过程。在整个过程的几个地方,我都有类似以下内容:

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

此过程存在于我的开发环境,测试环境和实时环境中。

问题在于该过程的每个副本都略有不同,因为每个环境的服务器名称都不同。这使得管理脚本更新的部署很麻烦。

有没有办法使该过程具有可移植性,以便每个环境都可以运行该过程的相同版本?

如果没有,我是否可以做些什么来使脚本部署不易出现错误/错误?


3
是否可以在每个服务器上创建不同的视图?您可以将视图定义为,SELECT <fields> FROM <linked server>但在所有服务器上使用相同的视图名称以保持代码的维护
JNK 2012年

@JNK并不是一个坏主意,尽管有很多表,但是至少视图要比带有链接服务器引用的存储过程更容易维护。
2012年

@jnk,您应该做出答案。
HLGEM 2012年

Answers:


14

链接服务器的名称不必是服务器的名称。您可以使用通用名称。

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

在每个环境上使用相同的名称设置链接服务器,但实际上将它们指向不同的服务器。


0

我喜欢使用通用链接服务器名称的想法。但是,在许多环境中这可能是不可能的。在这种情况下,可以在sp中使用动态SQl。

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
我会注意到,如果我是在现实生活中这样做的话,我会使用try catch块并在set语句警告@linkservername为null时冒出一个错误,以警告您该错误在错误的服务器上运行。
HLGEM 2012年

1
如果您采用这种方法,我想我会将CASE语句包装在一个函数中,因此,如果服务器发生了变化,我只需要更新该函数即可。
伊莱(Eli)2012年

好点@Eli
HLGEM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.