链接SQL Server语言 - 传递使用命令或定义默认数据库



我有一组需要对3个数据库运行的SQL查询,它们存储在已链接的2个不同服务器上。所有3个数据库具有完全相同的表和表名称,但是数据库名称不同。查询已经写好了,所有使用的只是表名,而不是完整的database.db .table语法,所以我不能使用自动查找和替换"linked.database1";linked.database2"所有查询将始终通过一个服务器"Server1">

执行。我正试图想出一个方法传递查询链接的服务器之一,但有一个"使用"命令执行,因为这意味着我只需要在"use"中更改数据库。线。

到目前为止,我已经从Server1尝试了以下操作:

Select * from [Linked].Database.DBO.Table - Successful
Exec ('Select * from [Linked].Database.DBO.Table') - Successful

直接在Server2上(使用链接服务器操作的帐户):

EXEC ('Use Database; SELECT * from Table') - Successful

有了以上三个我可以确定

  1. Server1上的登录可以到达所需的数据库,并且可以使用基本的select和Exec命令访问数据。
  2. Server2上的帐户可以运行Exec命令并传递"使用数据库";

然而,当我尝试使用下面的

Select * from openquery ([Linked], 'Exec (Use Database; Select * from Table)')

我得到以下错误:

OLE DB provider "SQLNCLI10" for linked server "172.20.11.123" returned message "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 7
Statement(s) could not be prepared.
Msg 102, Level 15, State 1, Line 7
Incorrect syntax near ')'.
Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'Use'.

我是否在OpenQuery中的任何地方弄乱了语法,或者USE命令永远不会通过OpenQuery传递。如果我试图用OpenQuery和USE做的是不可能的,那么是否有一种方法可以传递你想要的OpenQuery在语句中运行的数据库?

或者作为第二个想法,是否有一种方法将链接服务器帐户放在一起,以便它使用特定的数据库作为其默认数据库?

不,据我所知,如果您知道需要对哪个数据库执行,则可以这样做:

DECLARE @database sysname = N'Database1';
DECLARE @sql nvarchar(max) = N'SELECT * FROM dbo.Table;';
DECLARE @exec nvarchar(4000) = N'[Linked].' 
+ QUOTENAME(@database) + N'.sys.sp_executesql';
EXEC @exec @sql;

我不太确定这是想要完成什么:

Select * from openquery ([Linked], 
'Exec (Use Database; Select * from Table)')

但是如果你从中取出你试图告诉[Linked]EXEC的信息,它是:

Exec (Use Database; Select * from Table)

在任何地方都可以试试。坏了。你可以让它像这样工作,就像@AlwaysLearning建议的那样:

Select * from openquery ([Linked], 
'Exec (''Use Database; Select * from Table'')')

…但和上面的解决方案相比,这真的很恶心。除非你出于某种原因绝对需要从openquery中进行选择。

最新更新