SQL Server 空间和链接服务器

问题描述 投票:0回答:4

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

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

如果我在相同的查询中使用

OPENQUERY
,我会收到另一个错误:

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

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

sql-server sql-server-2008 spatial linked-server
4个回答
19
投票

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

19
投票

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

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

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 尝试上述场景。


7
投票

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


0
投票

为了澄清/扩展@pkExec提供的答案,如果您想要做一个

SELECT * INTO
,那么您可以通过执行以下操作来实现:

SELECT *
INTO [LOCAL_DB].[LOCAL_SCHEMA].[LOCAL_TABLE]
FROM OPENQUERY([LINKED_SERVER], 'SELECT * FROM [REMOTE_DB].[REMOTE_SCHEMA].[REMOTE_TABLE[');

当然,在执行此操作之前,您需要确保已设置链接服务器。

© www.soinside.com 2019 - 2024. All rights reserved.