有没有办法查询SQL Server链接服务器而无需硬编码数据库名称?

Law*_*ker 4 t-sql sql-server linked-server

我找到了代码所在的示例:

SELECT * FROM [legacyserver].[database].[schema].[table]
Run Code Online (Sandbox Code Playgroud)

表达为:

SELECT * FROM [legacyserver]...[table]
Run Code Online (Sandbox Code Playgroud)

但不适合我.

它给了我错误:

为链接服务器"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;',
Run Code Online (Sandbox Code Playgroud)

和:

EXEC sp_addlinkedserver 
   @server = 'legacyserver', 
   @srvproduct = '',
   @provider = 'MSDASQL',
   @provstr = 'DRIVER={SQL Server};SERVER=legacyserver;Trusted_Connection=Yes;',
   @catalog = 'database';
Run Code Online (Sandbox Code Playgroud)

是否可以在不对数据库名称进行硬编码的情况下创建脚本?

我需要创建一个非常大的迁移脚本,它需要使用开发,接受和生产数据库,并且在文本编辑器中使用replace会更改它并且容易出错.

更新:

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

由于职责分离,我无法开发并部署它,因此我无法在接受后触摸此脚本.我需要指导别人这样做,如果他/她将需要更换的[legacyserver]每次出现.[数据库],出错的几率非常高.

qxg*_*qxg 6

您可以创建同义词

CREATE SYNONYM [table] FOR [legacyserver].[database].[schema].[table]
Run Code Online (Sandbox Code Playgroud)

当你查询

SELECT * FROM table
Run Code Online (Sandbox Code Playgroud)

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

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

DROP SYNONYM table;
CREATE SYNONYM [table] FOR [legacyserver].[anotherdatabase].[schema].[table]
Run Code Online (Sandbox Code Playgroud)

您的查询语句未更改.

编辑: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]')
Run Code Online (Sandbox Code Playgroud)

注意,它使用SQLCMD语法.要求操作在不同环境中更改参数.