是否有一种方法来查询SQL Server链接服务器没有硬编码数据库名称



我发现样本中的代码:

SELECT * FROM [legacyserver].[database].[schema].[table]

表示为:

SELECT * FROM [legacyserver]...[table]

但不适合我。

它给出了错误:

为链接服务器"legacyserver"的提供程序"MSDASQL"指定了无效的架构或目录。

我使用的是旧服务器SQL server 2000和新服务器SQL server 2012。

我尝试创建链接服务器使用:

EXEC sp_addlinkedserver 
   @server = 'legacyserver', 
   @srvproduct = '',
   @provider = 'MSDASQL',
   @provstr = 'DRIVER={SQL Server};SERVER=legacyserver;DATABASE=database;Trusted_Connection=Yes;',

:

EXEC sp_addlinkedserver 
   @server = 'legacyserver', 
   @srvproduct = '',
   @provider = 'MSDASQL',
   @provstr = 'DRIVER={SQL Server};SERVER=legacyserver;Trusted_Connection=Yes;',
   @catalog = 'database';

是否有可能创建脚本没有硬编码数据库名称?

我需要创建一个真正大的迁移脚本,它需要使用开发,验收和生产数据库,这将是很多的工作和错误倾向于改变它使用替换文本编辑器。

更新:

遗留的开发、验收和生产数据库完全相同(除了数据),每个数据库都有自己的服务器/实例和数据库名称。

由于职责隔离,我不能开发和部署一些东西,所以在验收后我没有办法触摸这个脚本。我需要指示其他人这样做,如果他/她需要替换每次出现的[legacyserver]。[数据库],出错的几率非常高。

您可以创建一个同义词

CREATE SYNONYM [table] FOR [legacyserver].[database].[schema].[table]

查询

SELECT * FROM table

它实际上是从链接服务器而不是本地数据库获取数据。

如果要更改数据库,只需删除同义词并创建一个新的数据库名称

DROP SYNONYM table;
CREATE SYNONYM [table] FOR [legacyserver].[anotherdatabase].[schema].[table]

你的查询语句没有改变。

EDIT: DROPCREATE SYNONYM语句有点误导。你不需要自己做。这是一次部署工作。只需创建一个Post-Deployment脚本,该脚本创建所有同义词并参数化链接的服务器名和数据库名。代码:

IF EXISTS (SELECT * FROM sys.synonyms WHERE name = 'table1') 
BEGIN
DROP SYNONYM table1
END
EXEC('CREATE SYNONYM table1 FOR ' + '$(LinkedServerName).$(DBName).[dbo].[Table1]')

注意,它使用SQLCMD语法。

最新更新