SQL Server空间和链接服务器

Bry*_*ceH 20 sql-server spatial linked-server sql-server-2008

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

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

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

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

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

Ric*_*iwi 17

解决此问题的一种方法是将空间数据作为NVARCHAR(MAX)传递

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

note:go是列名,是geometry-object的缩写

或者使用函数而不是显式强制转换

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


pkE*_*xec 14

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

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

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

瞧,你现在可以简单地使用了

SELECT * FROM TARGET_TABLE;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要清楚.必要的精确变换如下.如果查询形式为`select*from [remoteservername].[remotedatabasename].[schemaname].[tablename]`失败,则只需将其替换为`select*from OPENQUERY([remoteservername],'select*from [remotedatabasename ] [SCHEMANAME] [表名]')`.您基本上必须在表标识符之外移动远程服务器名称(即不是其域名或类似的东西......但是将其链接的任意名称),并将其作为参数传递给openquery. (2认同)

Ans*_*sss 5

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