我发现样本中的代码:
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: DROP
和CREATE 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语法。