2010-11-03 40 views
61

在Management Studio中,我試圖運行兩個鏈接服務器之間的查詢/連接。 這是使用連接數據庫服務器正確的語法:SQL Server鏈接服務器示例查詢

select foo.id 
from databaseserver1.db1.table1 foo, 
    databaseserver2.db1.table1 bar 
where foo.name=bar.name 

基本上,你只是在前面加上DB服務器名稱爲db.table?

回答

132

格式也許應該是:

<server>.<database>.<schema>.<table> 

例如: DatabaseServer1.db1.dbo.table1


更新:我知道這是一個老問題,答案我有正確的;不過,我認爲任何其他人都應該知道這件事情。

即從鏈接服務器連接中的情況下對鏈接的服務器查詢表時,將可能是爲了做連接操作下載到查詢從執行服務器。在OP的情況下,來自DB1table1和來自DB2table1兩者將全部轉移到執行查詢的服務器,推測其名稱爲DB3

如果你有大表,這個可能導致需要很長時間才能執行的操作。畢竟它現在受到網絡流量速度的限制,速度比內存或磁盤傳輸速度慢幾個數量級。

如果可能,對遠程服務器執行單個查詢,而無需連接到本地表,以將需要的數據提取到臨時表中。然後查詢。

這是不可能的,那麼你需要看看會導致SQL服務器必須在本地加載整個表的各種事情。例如使用GETDATE()甚至某些連接。其他表現殺手包括沒有給予適當的權利。

請參閱http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/瞭解更多信息。

+9

如果數據庫eserver名稱有一個連字符,需要用方括號括起來 – bmw0128 2010-11-03 22:15:47

+4

@ bmw0128:更好的是,使用雙引號:幾乎所有平臺都支持它,與微軟的方括號不同。 – 2012-07-03 22:29:10

+1

當數據庫服務器名稱中包含句點時,還需要使用方括號或雙引號。 – 2014-05-09 21:55:57

8

您需要指定模式/所有者(默認爲dbo)作爲參考的一部分。另外,最好使用更新的(ANSI-92)連接樣式。

select foo.id 
    from databaseserver1.db1.dbo.table1 foo 
     inner join databaseserver2.db1.dbo.table1 bar 
      on foo.name = bar.name 
+0

內部連接語法優於隱式連接? – bmw0128 2010-11-03 22:17:10

+2

@ bmw0128:是的,有幾個原因。恕我直言,最重要的是,當你在兩個不同的地方有你的表和連接時,意外地寫一個跨產品連接是太容易了。 – 2012-07-03 22:30:47

+0

請注意,4點零件不適用於某些非SQL Server連接的服務器。它可能引發錯誤,例如...爲鏈接服務器「MyLinkedServer」的提供程序「MSDASQL」指定了無效的模式或目錄。 – brewmanz 2017-01-12 21:45:29

7

如果仍然發現有問題......

括服務器名稱[]

+0

小心:我用選擇使用[]執行了一個創建表,而不是在鏈接服務器上創建的,該表是在本地創建的,名稱爲'dbo.databaseserver1.db1.dbo.table1' – biscuit314 2017-06-13 15:59:55

2
select * from [Server].[database].[schema].[tablename] 

這是調用正確的方法。 確保在執行查詢之前驗證服務器已鏈接!

要檢查鏈接服務器調用:

EXEC sys.sp_linkedservers 
+0

這不適用於一些非SQL Server連接的服務器。它引發錯誤,如...爲鏈接服務器「MyLinkedServer」的提供程序「MSDASQL」指定了無效的模式或目錄。 – brewmanz 2017-01-12 21:40:41

1

通常直接查詢不應該在鏈接服務器的情況下使用,因爲它大量使用SQL服務器的臨時數據庫。首先,數據被檢索到臨時數據庫中,然後進行過濾。有很多關於這個的線索。最好使用open OPENQUERY,因爲它將SQL傳遞給源鏈接服務器,然後返回過濾結果,例如

SELECT * 
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500') 
+0

此答案不包括數據庫名稱 – 2016-04-22 10:37:27

+2

我在創建鏈接服務器時提供了數據庫信息。有關詳細信息,請參閱下面的MSDN鏈接: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx – 2016-10-20 14:09:38

+0

如果我的鏈接服務器要求身份驗證,並且我'只是試圖從我的PHP應用程序使用PDO查詢? – nekiala 2017-06-22 08:22:37

8
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME') 

這可能會幫助你。

+0

Upvoted。當你將MySQL鏈接到MS SQL時,這是有效的。 – 2017-02-07 01:27:27

+1

換句話說,這是創建傳遞查詢。請記住,查詢語句必須寫入服務器的本機SQL中。 Oracle的語法與Teradata不同於SQL Server等。 – AxGryndr 2017-07-13 14:29:38

3

對於那些與這些其他答案麻煩,試着OPENQUERY

例子:

SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
+0

適用於SQL Server – 2017-02-07 18:46:34

0

對於它的價值,我發現下面的語法最好的工作:

SELECT * FROM [LINKED_SERVER] ... [TABLE]

我無法得到其他人的建議使用數據庫名稱來工作。另外,這個數據源沒有模式。

1
select name from drsql01.test.dbo.employee 
  • drslq01是servernmae --linked塞雷爾語
  • 測試數據庫名稱
  • DBO是架構-default模式
  • 員工表名

我希望它有助於理解,如何執行查詢鏈接服務器