使用sql server查询远程数据库?

时间:2010-02-27 11:13:12

标签: sql-server tsql linked-server

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

从[server \ instance] .database.owner.tablename

中选择*

现在有了这个,

  1. [Server \ instance]:必须明确提供
  2. [数据库]:我们可以使用像ms_ForEachDB这样的查询在指定实例上查找数据库吗?
  3. [owner]:我们可以使用查询找到数据库所有者名称吗?
  4. 如果使用查询找到这些值,我们是否需要使用EXEC()来执行此操作,或者我们仍然可以使用不错的查询来实现它?

    全心全意,

4 个答案:

答案 0 :(得分:7)

您提到的“漂亮”格式只是一个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

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

答案 1 :(得分:2)

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

获取服务器名称:

SELECT @@SERVERNAME

获取当前的数据库名称:

SELECT DB_NAME() AS DataBaseName

答案 2 :(得分:0)

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

但所有的工作

答案 3 :(得分:0)

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

bool empty() const
{
    return size() == 0 ;
}

______

地点:

  

database.targetTable :出于某种原因,如果您将SSMS 2008 R2描述为[数据库]。[targetTable],则会返回错误,并且我不知道为什么会发生这种情况。

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

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

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

" OPENQUERY不接受其参数的变量。":See Here(MSDN:OPENQUERY(Transact-SQL))。