2010-02-27 66 views
2

我用的sp_addlinkedserver訪問遠程計算機DB現在我對數據庫就像寫查詢明確,使用sql server查詢遠程數據庫?

SELECT * FROM [服務器\實例] .database.owner.tablename

這個

現在,

  1. [服務器\實例]:這必須明確提供
  2. [數據庫]:我們可以找到關於使用查詢像ms_ForEachDB指定實例的數據庫?
  3. [所有者]:我們可以使用查詢找到數據庫所有者名稱嗎?

如果使用查詢找到這些值,我們是否需要使用EXEC()來執行此操作,或者我們仍然可以使用漂亮的查詢來實現它?

感謝所有,

回答

6

在 「好」 的格式,你提的是一個簡單的4部分對象的引用。

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

3部分

select * from database.owner.tablename 

2部分

select * from owner.tablename 

如果要動態地更改任何服務器,數據庫或模式值,那麼你有一個選項:

EXEC (@sqlstring) 

但是,如果您只訪問stor編輯特效遠程...

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 

然而,改變對象引用的組件是沒有意義的爭論:如果你知道你要查詢的表,然後只需撥打該表在該數據庫中...

2

你應該做一個查詢字符串,然後通過exec()功能運行。

獲取服務器名稱:

SELECT @@SERVERNAME 

獲取當前數據庫的名稱:

SELECT DB_NAME() AS DataBaseName 
0

您不必使用EXEC你可以使用類似select * from openquery(MyLinkedServer,@sql)雖然我更喜歡EXEC(@sql) AT MyLinkedServer

但所有工作

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 >'''[email protected]+''';'; 
PRINT @sql; 
EXEC(@sql) AT linkedServer 

______

其中:

database.targetTable:出於某種原因,SSMS 2008 R2,如果你把它描述爲[數據庫]返回錯誤。 [targetTable],我不知道爲什麼會發生。

@yesterday:是要插入變量(這種情況下,含日期時間類元素的字符串)

PRINT @sql:只是爲了驗證是否引號都正確放置。

columnWithDateTime:「OPENQUERY不接受參數變量」應該是與日期時間格式類似於@yesterday可變格式列(例如「時間戳」,或

See Here(MSDN:OPENQUERY(Transact-SQL))。