我有一个 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的问题,因为他们试图选择空间数据。即使您没有选择包含空间数据的列,您仍然会收到此错误。因此,如果您需要查询这样的表,并且不需要检索空间数据,那么您可以为该表创建一个视图(仅选择您需要的列,不包括空间数据列),然后针对该视图进行查询.
为了澄清/扩展@pkExec提供的答案,如果您想要做一个
SELECT * INTO
,那么您可以通过执行以下操作来实现:
SELECT *
INTO [LOCAL_DB].[LOCAL_SCHEMA].[LOCAL_TABLE]
FROM OPENQUERY([LINKED_SERVER], 'SELECT * FROM [REMOTE_DB].[REMOTE_SCHEMA].[REMOTE_TABLE[');
当然,在执行此操作之前,您需要确保已设置链接服务器。