簡體   English   中英

SQL Server空間和鏈接服務器

[英]SQL Server spatial and linked servers

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

在分布式查詢中不允許使用CLR類型公開列的對象。 請使用傳遞查詢來訪問遠程對象。

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

當前命令發生嚴重錯誤。 結果(如果有的話)應該被丟棄。

有沒有辦法通過鏈接服務器查詢包含空間類型的表?

解決此問題的一種方法是將空間數據作為NVARCHAR(MAX)傳遞

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

注意: go是列名,是geometry-object的縮寫

或者使用函數而不是顯式強制轉換

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

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

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

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。

我有另一個解決方法。 它不適用於OP的問題,因為他們試圖選擇空間數據。 即使您沒有選擇包含空間數據的列,您仍會收到此錯誤。 因此,如果您需要查詢此類表,並且不需要檢索空間數據,則可以為表創建一個視圖(僅選擇所需的列,排除空間數據列),然后針對該視圖進行查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM