Пространственные и связанные серверы SQL Server - PullRequest
20 голосов
/ 12 марта 2011

У меня есть экземпляр SQL Server, в который я добавил связанный сервер с другим экземпляром SQL. Таблица, к которой я обращаюсь на связанном сервере, содержит пространственные типы. Когда я пытаюсь запросить таблицу, я получаю сообщение об ошибке:

Объекты, выставляющие столбцы с типами CLR, не допускаются в распределенных запросы. Пожалуйста, используйте сквозной запрос для доступа к удаленному объекту.

Если я использую OPENQUERY с тем же запросом, я получаю еще одну ошибку:

Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует выбросить.

Есть ли способ запрашивать таблицы, содержащие пространственные типы, через связанные серверы?

Ответы [ 3 ]

16 голосов
/ 12 марта 2011

Один из способов обойти это - передать пространственные данные как NVARCHAR (MAX)

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

примечание: go - это имя столбца, сокращение от объекта geometry

Или используя функцию вместо явного приведения

select go=geometry::STGeomFromText(go,0)
from openquery([other\instance],
'select go=go.STAsText() from tempdb.dbo.geom')
13 голосов
/ 06 ноября 2015

Я столкнулся с той же проблемой, но в моем случае не было приемлемого решения, так как многие приложения не могли быть изменены, чтобы ожидать совершенно другой запрос.

Вместо этого, я думаю, я нашел способ обмануть систему. На локальном сервере запустите:

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.

5 голосов
/ 25 января 2013

У меня есть другой обходной путь. Это не относится к вопросу ОП, поскольку они пытались выбрать пространственные данные. Даже если вы не выбираете столбцы, содержащие пространственные данные, вы все равно получите эту ошибку. Поэтому, если вам нужно запросить такую ​​таблицу и не нужно извлекать пространственные данные, вы можете создать представление для таблицы (выбирая только нужные вам столбцы, исключая столбцы пространственных данных), а затем выполнить запрос к этому представлению. .

...