2010-11-09 65 views
2

首先是原始問題:可以從一個遠程執行t-sql內的查詢嗎?

假設有2個DB:DB1和DB2。我是否可以連接到DB1,在DB2上執行查詢,就像我登錄到DB2一樣? 所以基本上:

  • 我連接到DB1
  • 從內TSQL我莫名其妙地連接到DB2
  • 我在本地執行的查詢(等待)
  • 我關閉連接和我回DB1
  • ,我做了查詢的其餘部分。

因此我知道我可以做interDB查詢,如:select * from DB2.somedb.dbo.sometable,但這不是我所追求的。

背景:

是有數據坐在2臺獨立的數據庫機器。我必須以這樣的方式查詢數據,以便合併來自兩臺機器上的表的數據。

我已經試過的場景很多的,每次它要麼運行速度很慢,或查詢無法做到,由於XML列存在於一個表或其他。

它不工作(雖然手動)的解決方案是:

  • 登錄到DB2並做查詢的一半到一些臨時表
  • 在複製不是Temptable到DB1
  • 登錄到DB1並執行查詢的第二部分。

perferably我要讓這一切一個腳本,這樣我就可以自動執行它

回答

3

你是否看了OPENQUERY功能在SQL Server:

EXEC sp_addlinkedserver 'OracleSvr', 
    'Oracle 7.3', 
    'MSDAORA', 
    'ORCLDB' 
GO 
SELECT * 
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') 
GO 

甚至OPENROWSET功能:

SELECT a.* 
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;', 
    'SELECT GroupName, Name, DepartmentID 
     FROM AdventureWorks.HumanResources.Department 
     ORDER BY GroupName, Name') AS a; 

使用SQL Server聯機叢書更詳細,或嘗試過你的GOOGL EFU

+0

不知道這是否會與原生的XML列一起工作,您可能需要使用一個視圖來覆蓋有趣的數據從表格轉換爲本地列。 – Guy 2010-11-09 11:07:40

+0

此外,與鏈接的SQL Server,你可以發出像這樣的查詢:SELECT * FROM SERVER1.database.dbo.tablename INNER JOIN SERVER2.database.dbo.tablename ON ...等等等等 – 2010-11-09 11:20:21

+0

似乎正是我所需要的! – Toad 2010-11-09 11:37:24

1

首先,您必須將兩個SQL服務器(SQL1和SQL2)鏈接。您需要在SQL1上創建一個朝向SQL2的鏈接服務器,並在遠程數據庫上擁有適當的權限。關於MSDN的更多信息 - How to create a link server

創建鏈接服務器後,您應該既可以使用鏈接服務器功能,也可以使用openquery功能。

使用直接鏈接服務器(通過執行從SQL1網絡指定的傳遞查詢到SQL2-多個I/O)

select * from [LINKED_SERVER_SQL2].[DATABASE_NAME].dbo.[TABLE_NAME] 

使用OPENQUERY執行該查詢從SQL1執行查詢(執行給定的鏈接服務器上指定的傳遞查詢 - 免得I/O)

select * from openquery (LINKED_SERVER_SQL2, 'select * from [DATABASE_NAME].dbo.[TABLE_NAME]') 

此外,答案爲XML列的特殊性能被發現在this pos噸,我寫了幾天前的博客關於我發現相同的問題

+0

有關如何處理XML列的有用信息。謝謝。 – Guy 2010-11-10 09:47:31

+0

不客氣! – yrushka 2010-11-10 09:52:30

相關問題