2011-03-11 282 views
18

我有一個SQL Server實例,我已經將鏈接服務器添加到另一個SQL實例。我在鏈接服務器上訪問的表包含空間類型。當我嘗試查詢表我收到一個錯誤:SQL Server空間和鏈接服務器

Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object.

如果我使用OPENQUERY具有相同的查詢,我得到另一個錯誤:

A severe error occurred on the current command. The results, if any, should be discarded.

有什麼辦法來查詢包含空間類型的表通過鏈接服務器?要解決此

回答

14

一種方式是通過空間數據NVARCHAR(MAX)

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=convert(nvarchar(max),go) from tempdb.dbo.geom') 

注:go是列名,簡稱幾何對象

或者使用功能,而不是明確的鑄造

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=go.STAsText() from tempdb.dbo.geom') 
+0

地理學,用途:地理:: STGeomFromText(去,4326) – 2014-03-10 09:57:56

4

我有另一種解決方法。它不適用於OP的問題,因爲他們試圖選擇空間數據。即使你沒有選擇包含空間數據的列,你仍然會得到這個錯誤。因此,如果您需要查詢這樣一個表,並且不需要檢索空間數據,那麼您可以爲該表創建一個視圖(僅選擇需要的列,不包括空間數據列),然後針對該視圖進行查詢。

11

我遇到了同樣的問題,但接受的解決方案在我的情況下不是一個選項,因爲許多應用程序無法更改以期望完全不同的查詢。

相反,我想我找到了一種欺騙系統的方法。在本地服務器上運行:

CREATE VIEW stage_table 
AS 
SELECT * 
FROM OPENQUERY([REMOTESERVER],'SELECT * FROM [REMOTEDB].[SCHEMA].TARGET_TABLE'); 
GO 
CREATE SYNONYM TARGET_TABLE FOR stage_table; 
GO 

瞧,你現在可以簡單地使用

SELECT * FROM TARGET_TABLE; 

這很有可能就是你的應用程序期望。

試圖與本地服務器上面的場景:SQLEXPRESS 2008 R2和遠程服務器的SQL Express 2014

+0

我遇到了「對象暴露列使用CLR類型在分佈式查詢中是不允許的。請使用傳遞查詢來訪問遠程對象':來自pkExec的提示解決了這個問題。 – AAsk 2015-11-26 15:15:51

+2

只需清楚。確切的轉換必要如下。如果[select * from [remoteservername]。[remotedatabasename]。[schemaname]。[tablename]'形式的查詢失敗,則簡單地用'select * from OPENQUERY([remoteservername],'select * from [remotedatabasename ] [SCHEMANAME] [表名]')'。基本上,必須將遠程服務器名稱(即不是它的域名或類似的東西,但是將其鏈接爲任意名稱)移到表標識符之外,並將其作爲參數傳遞給openquery。 – Triynko 2016-06-06 14:55:16

+0

@Triynko我的答案甚至涵蓋了查詢的形式是「SELECT * FROM table_name」的情況。如果您在評論中使用您提及的內容,那麼對於空間數據類型,查詢將失敗(按照AAsk的評論)。 – pkExec 2016-06-06 17:49:16