SQL Server空间和链接服务器

时间:2011-03-11 21:53:48

标签: sql-server sql-server-2008 spatial linked-server

我有一个SQL Server实例,我已经将链接服务器添加到另一个SQL实例。我在链接服务器上访问的表包含空间类型。当我尝试查询表时,收到错误:

  

在分布式中不允许使用CLR类型公开列的对象   查询。请使用传递查询来访问远程对象。

如果我使用OPENQUERY使用相同的查询,我会收到另一个错误:

  

当前命令发生严重错误。结果,如果有的话,   应该被丢弃。

有没有办法通过链接服务器查询包含空间类型的表?

3 个答案:

答案 0 :(得分:16)

解决此问题的一种方法是将空间数据作为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')

答案 1 :(得分:13)

我遇到了同样的问题,但在我的情况下,接受的解决方案不是一个选项,因为许多应用程序无法更改以期望完全不同的查询。

相反,我认为我找到了欺骗系统的方法。在本地服务器上运行:

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

Voila,您现在可以简单地使用

SELECT * FROM TARGET_TABLE;

这可能是您的应用程序所期望的。

尝试使用本地服务器执行上述方案:SQLEXPRESS 2008 R2和远程服务器SQL EXPRESS 2014.

答案 2 :(得分:5)

我有另一种解决方法。它不适用于OP的问题,因为他们试图选择空间数据。即使您没有选择包含空间数据的列,您仍会收到此错误。因此,如果您需要查询此类表,并且不需要检索空间数据,则可以为表创建一个视图(仅选择所需的列,排除空间数据列),然后针对该视图进行查询