我有一个SQL Server实例,我已经将链接服务器添加到另一个SQL实例。我在链接服务器上访问的表包含空间类型。当我尝试查询表时,收到错误:
在分布式中不允许使用CLR类型公开列的对象 查询。请使用传递查询来访问远程对象。
如果我使用OPENQUERY
使用相同的查询,我会收到另一个错误:
当前命令发生严重错误。结果,如果有的话, 应该被丢弃。
有没有办法通过链接服务器查询包含空间类型的表?
答案 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的问题,因为他们试图选择空间数据。即使您没有选择包含空间数据的列,您仍会收到此错误。因此,如果您需要查询此类表,并且不需要检索空间数据,则可以为表创建一个视图(仅选择所需的列,排除空间数据列),然后针对该视图进行查询