在Management Studio中,我試圖運行兩個鏈接服務器之間的查詢/連接。 這是使用連接數據庫服務器正確的語法:SQL Server鏈接服務器示例查詢
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,你只是在前面加上DB服務器名稱爲db.table?
在Management Studio中,我試圖運行兩個鏈接服務器之間的查詢/連接。 這是使用連接數據庫服務器正確的語法:SQL Server鏈接服務器示例查詢
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,你只是在前面加上DB服務器名稱爲db.table?
格式也許應該是:
<server>.<database>.<schema>.<table>
例如: DatabaseServer1.db1.dbo.table1
更新:我知道這是一個老問題,答案我有正確的;不過,我認爲任何其他人都應該知道這件事情。
即從鏈接服務器連接中的情況下對鏈接的服務器查詢整表時,將可能是爲了做連接操作下載到查詢從執行服務器。在OP的情況下,來自DB1
的table1
和來自DB2
的table1
兩者將全部轉移到執行查詢的服務器,推測其名稱爲DB3
。
如果你有大表,這個可能導致需要很長時間才能執行的操作。畢竟它現在受到網絡流量速度的限制,速度比內存或磁盤傳輸速度慢幾個數量級。
如果可能,對遠程服務器執行單個查詢,而無需連接到本地表,以將需要的數據提取到臨時表中。然後查詢。
這是不可能的,那麼你需要看看會導致SQL服務器必須在本地加載整個表的各種事情。例如使用GETDATE()
甚至某些連接。其他表現殺手包括沒有給予適當的權利。
請參閱http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/瞭解更多信息。
您需要指定模式/所有者(默認爲dbo)作爲參考的一部分。另外,最好使用更新的(ANSI-92)連接樣式。
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
如果仍然發現有問題......
括服務器名稱[]
小心:我用選擇使用[]執行了一個創建表,而不是在鏈接服務器上創建的,該表是在本地創建的,名稱爲'dbo.databaseserver1.db1.dbo.table1' – biscuit314 2017-06-13 15:59:55
select * from [Server].[database].[schema].[tablename]
這是調用正確的方法。 確保在執行查詢之前驗證服務器已鏈接!
要檢查鏈接服務器調用:
EXEC sys.sp_linkedservers
這不適用於一些非SQL Server連接的服務器。它引發錯誤,如...爲鏈接服務器「MyLinkedServer」的提供程序「MSDASQL」指定了無效的模式或目錄。 – brewmanz 2017-01-12 21:40:41
通常直接查詢不應該在鏈接服務器的情況下使用,因爲它大量使用SQL服務器的臨時數據庫。首先,數據被檢索到臨時數據庫中,然後進行過濾。有很多關於這個的線索。最好使用open OPENQUERY,因爲它將SQL傳遞給源鏈接服務器,然後返回過濾結果,例如
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
此答案不包括數據庫名稱 – 2016-04-22 10:37:27
我在創建鏈接服務器時提供了數據庫信息。有關詳細信息,請參閱下面的MSDN鏈接: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx – 2016-10-20 14:09:38
如果我的鏈接服務器要求身份驗證,並且我'只是試圖從我的PHP應用程序使用PDO查詢? – nekiala 2017-06-22 08:22:37
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
這可能會幫助你。
Upvoted。當你將MySQL鏈接到MS SQL時,這是有效的。 – 2017-02-07 01:27:27
換句話說,這是創建傳遞查詢。請記住,查詢語句必須寫入服務器的本機SQL中。 Oracle的語法與Teradata不同於SQL Server等。 – AxGryndr 2017-07-13 14:29:38
對於那些與這些其他答案麻煩,試着OPENQUERY
例子:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
適用於SQL Server – 2017-02-07 18:46:34
對於它的價值,我發現下面的語法最好的工作:
SELECT * FROM [LINKED_SERVER] ... [TABLE]
我無法得到其他人的建議使用數據庫名稱來工作。另外,這個數據源沒有模式。
select name from drsql01.test.dbo.employee
我希望它有助於理解,如何執行查詢鏈接服務器
如果數據庫eserver名稱有一個連字符,需要用方括號括起來 – bmw0128 2010-11-03 22:15:47
@ bmw0128:更好的是,使用雙引號:幾乎所有平臺都支持它,與微軟的方括號不同。 – 2012-07-03 22:29:10
當數據庫服務器名稱中包含句點時,還需要使用方括號或雙引號。 – 2014-05-09 21:55:57