4

我已经使用 sp_addlinkedserver 来访问远程计算机数据库,现在我正在数据库上显式编写查询,例如,

从 [server\instance].database.owner.tablename 中选择 *

现在有了这个,

  1. [Server\instance] :必须明确提供
  2. [数据库]:我们可以使用 ms_ForEachDB 之类的查询在指定实例上查找数据库吗?
  3. [所有者]:我们可以使用查询找到数据库所有者名称吗?

如果使用查询找到这些值,我们是否需要使用 EXEC() 来执行它,或者我们仍然可以使用不错的查询来实现它?

谢谢大家,

4

4 回答 4

8

您提到的“好”格式只是一个 4 部分对象引用。

select * from [server\instance].database.owner.tablename

3 部分

select * from database.owner.tablename

2 部分

select * from owner.tablename

如果您想动态更改任何服务器、数据库或模式值,那么您有一个选择:

EXEC (@sqlstring)

但是,如果您只远程访问存储的过程......

DECLARE @RemoteSP varchar(500)

SET @RemoteSP = '[server\instance].database2.schema.proc2'
EXEC @RemoteSP @p1, @p2, @p3 OUTPUT

SET @RemoteSP = '[server\instance].database1.schema.proc1'
EXEC @RemoteSP @p4, @p5, @p6 OUTPUT

但是,更改对象引用的组件毫无意义:如果您知道要查询一个表,那么只需在该数据库中调用该表...

于 2010-02-28T09:10:23.920 回答
2

您应该创建一个查询字符串,然后按exec()函数运行它。

获取服务器名称:

SELECT @@SERVERNAME

获取当前数据库名称:

SELECT DB_NAME() AS DataBaseName
于 2010-02-27T11:50:55.710 回答
0

你不必使用EXEC你可以使用类似的东西select * from openquery(MyLinkedServer,@sql)虽然我更喜欢EXEC(@sql) AT MyLinkedServer

但所有工作

于 2010-03-01T11:58:32.183 回答
0

如果碰巧您需要在参数中使用某种变量(例如,从昨天开始收集远程服务器的更新):

DECLARE @yesterday NVARCHAR(20) = '2016-09-23 08:16:20';
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM database.targetTable AS origin
                          WHERE origin.columnWithDateTime >'''+@yesterday+''';';
PRINT @sql;
EXEC(@sql) AT linkedServer

______

其中:

database.targetTable:由于某种原因,如果您将其描述为 [database].[targetTable],SSMS 2008 R2 会返回错误,我不知道为什么会这样。

@yesterday:是您要插入的变量(在这种情况下,是一个包含类似日期时间元素的字符串)

PRINT @sql:只是为了验证引号是否正确放置。

columnWithDateTime:应该是具有日期时间格式的列(例如“时间戳”,或类似于@yesterday变量格式。

“OPENQUERY 不接受其参数的变量。”:请参阅此处(MSDN:OPENQUERY (Transact-SQL))。

于 2016-09-27T14:20:33.213 回答