我在代码中找到了样本:
SELECT * FROM [legacyserver].[database].[schema].[table]
表示为:
SELECT * FROM [legacyserver]...[table]
但不适合我。
它给了我错误:
为提供程序指定了无效的架构或目录" MSDASQL"对于链接服务器" legacyserver"。
我用于旧版服务器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';
是否可以在不对数据库名称进行硬编码的情况下创建脚本?
我需要创建一个非常大的迁移脚本,它需要使用开发,接受和生产数据库,并且在文本编辑器中使用replace更改它将会发生很多工作并且容易出错。
更新
遗留开发,验收和生产数据库完全相同(数据除外),每个数据库都有自己的服务器/实例和数据库名称。
由于职责分离,我无法开发和部署它,因此我无法在接受后触摸此脚本。我需要指示其他人这样做,如果他/她需要更换[legacyserver]。[数据库]的每一次出现,那么错误的可能性非常高。
答案 0 :(得分:5)
您可以创建同义词
CREATE SYNONYM [table] FOR [legacyserver].[database].[schema].[table]
查询时
SELECT * FROM table
它实际上是从链接服务器而不是本地数据库中获取数据。
如果想要更改数据库,只需删除同义词并使用新的数据库名称创建一个新的数据库。
DROP SYNONYM table;
CREATE SYNONYM [table] FOR [legacyserver].[anotherdatabase].[schema].[table]
您的查询语句未更改。
编辑: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语法。 要求操作在不同环境中更改参数。