Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有一种方法可以在不硬编码数据库名称的情况下查询SQL Server链接服务器?_Sql Server_Tsql_Linked Server - Fatal编程技术网

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

Sql server 有没有一种方法可以在不硬编码数据库名称的情况下查询SQL Server链接服务器?,sql-server,tsql,linked-server,Sql Server,Tsql,Linked Server,我找到的示例代码如下: SELECT * FROM [legacyserver].[database].[schema].[table] 其表述如下: SELECT * FROM [legacyserver]...[table] 但这对我不起作用 它给了我一个错误: 为链接服务器“legacyserver”的提供程序“MSDASQL”指定的架构或目录无效 我将用于旧服务器SQL server 2000和新服务器SQL server 2012 我尝试使用以下方法创建链接服务器: EXEC sp

我找到的示例代码如下:

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;',
以及:

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

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

更新:

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

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

由于职责分离,我无法开发和部署它,所以在接受后我无法触摸这个脚本。我需要指示其他人这样做,如果他/她需要更换[legacyserver].[database]的每一个实例,则出错的几率非常高。

您可以创建同义词

CREATE SYNONYM [table] FOR [legacyserver].[database].[schema].[table]
当你询问

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

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

DROP SYNONYM table;
CREATE SYNONYM [table] FOR [legacyserver].[anotherdatabase].[schema].[table]
您的查询语句保持不变

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

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 2000实例上是否有开发、验收和生产数据库?三个数据库是否具有相同的结构(相同的表、视图等)??完全相同的表、视图等。不同的实例和数据。我只有发展和接受的途径。DBA将使用生产服务器执行脚本。链接服务器的“惰性模式验证”是否设置为true?这是一种黑暗中的跛脚刺,但值得一试。顺便说一句,此功能需要企业版或开发人员版。不幸的是,我正在为旧版服务器使用“Microsoft SQL Server 2000 SP4标准版”,而旧版服务器不提供此选项。在新服务器中,我有“Microsoft SQL server 2012 SP1 Enterprise(64位)”。它给了我与当前相同的问题,并包括新问题。我将需要更改创建同义词的脚本,并且将有许多新对象要删除。我将给出一个加号,并接受您的回答,因为这给了我一个好主意。实际上,我需要您查询
[legacyserver].[database].[schema].[sysobjects]
并检索所有表,将每个表的同义词放在新数据库中名为legacy的模式中,导入数据并将其与所有内容一起删除legacy模式,使我的新数据库干净。