是否可以編寫使用位於不同服務器上的不同數據庫中的表的查詢?使用位於不同服務器上的兩個數據庫中的兩個表的寫入查詢
我有table_1
這在數據庫中存在「DB1」 Server1上並沒有存在於Server2上數據庫「DB2」另一個表table_2
。
我該怎麼做? 服務器可以是MySQL,HSQL或MS-SQL中的任何一種。這是主要的問題.........有沒有不同的服務器,但也是不同類型的服務器。
請問sp_addlinkedserver是否適合這種情況?
是否可以編寫使用位於不同服務器上的不同數據庫中的表的查詢?使用位於不同服務器上的兩個數據庫中的兩個表的寫入查詢
我有table_1
這在數據庫中存在「DB1」 Server1上並沒有存在於Server2上數據庫「DB2」另一個表table_2
。
我該怎麼做? 服務器可以是MySQL,HSQL或MS-SQL中的任何一種。這是主要的問題.........有沒有不同的服務器,但也是不同類型的服務器。
請問sp_addlinkedserver是否適合這種情況?
在MS SQL服務器上設置linked servers。然後,你可以查詢兩臺服務器像
SELECT * FROM [server1的]。[數據庫]。[DBO]。[表]
和
SELECT * FROM [服務器2]。[數據庫]。 [表]
或使用OPENQUERY(可能是首選的原因這只是發送命令到其它服務器而不是源服務器試圖解析它)
你需要使用的sp_addlinkedserver創建一個服務器鏈接。請參閱reference documentation的使用情況。一旦建立了服務器鏈接,就可以像平常一樣構建查詢,只需將數據庫名稱添加到其他服務器的前綴即可。即:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
一旦鏈路建立,還可以使用OPENQUERY到遠程服務器上執行SQL語句,只將數據傳送回給你。這可以更快一點,並且它可以讓遠程服務器優化您的查詢。如果您在上面的示例中將數據緩存在DB1上的臨時(或內存中)表中,那麼您將能夠查詢它,就像加入標準表一樣。例如:
-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')
-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID
查看OPENQUERY的文檔以查看更多示例。上面的例子很有意思。我肯定會在這個特定的例子中使用第一種方法,但使用OPENQUERY的第二個選項可以節省一些時間和性能,如果您使用查詢來過濾掉一些數據。
以下查詢將會有所幫助。
SELECT TS1.COLUMN01, TS2.COLUMN02
FROM Server1.DBName..TableName TS1, Server2.DBName..TableName TS2
WHERE TS1.COLUMN03 = TS2.COLUMN03
DBName後面有2個小點在查詢中? – caesar
是的,否則它會給錯誤消息像無效的對象名稱。 –
[SQL Server中選擇從兩個不同的服務器數據]的可能的複製(https://stackoverflow.com/questions/1144051/selecting-data-from-two-different-servers-in-sql-server ) –