gpt4 book ai didi

sql-server - 有没有一种方法可以在不硬编码数据库名称的情况下查询 SQL Server 链接服务器?

转载 作者:行者123 更新时间:2023-12-03 02:30:36 25 4
gpt4 key购买 nike

我找到了代码示例:

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

表示为:

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

但不适合我。

它给了我错误:

An invalid schema or catalog was specified for the provider "MSDASQL" for linked server "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';

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

我需要创建一个非常大的迁移脚本,它需要使用开发、验收和生产数据库,并且在文本编辑器中使用替换来更改它会需要大量工作并且容易出错。

更新:

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

由于职责分离,我无法开发一些东西并部署它,所以在接受后我无法触及这个脚本。我需要指导其他人这样做,如果他/她需要替换所有出现的 [legacyserver].[database],那么出错的可能性非常高。

最佳答案

您可以创建同义词

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

当您查询时

SELECT * FROM table

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

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

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

您的查询语句未更改。

编辑:DROPCREATE SYNONYM语句有点误导。您不需要自己做。这是部署中的一次性工作。只需创建一个部署后脚本来创建所有同义词并参数化链接服务器名称和数据库名称。代码如下:

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

注意,它使用 SQLCMD 语法。要求操作人员在不同环境下更改参数。

关于sql-server - 有没有一种方法可以在不硬编码数据库名称的情况下查询 SQL Server 链接服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23502980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com