Пространственные и связанные серверы SQL Server
У меня есть экземпляр SQL Server, который я добавил связанный сервер к другому экземпляру SQL. Таблица, к которой я обращаюсь на связанном сервере, содержит пространственные типы. Когда я пытаюсь выполнить запрос к таблице, я получаю сообщение об ошибке:
Объекты, отображающие столбцы с типами CLR, не разрешены в распределенных запросы. Пожалуйста, используйте сквозной запрос для доступа к удаленному объекту.
Если я использую OPENQUERY
с тем же запросом, я получаю еще одну ошибку:
Серьезная ошибка произошла в текущей команде. Результаты, если таковые имеются, следует отбросить.
Есть ли способ запросить таблицы, содержащие пространственные типы через связанные серверы?
Ответы
Ответ 1
Один из способов обойти это - передать пространственные данные как NVARCHAR (MAX)
select go=geometry::STGeomFromText(go,0)
from openquery([other\instance],
'select go=convert(nvarchar(max),go) from tempdb.dbo.geom')
note: go
- это имя столбца, сокращение от объекта geometry-object
Или используя функцию вместо явного литья
select go=geometry::STGeomFromText(go,0)
from openquery([other\instance],
'select go=go.STAsText() from tempdb.dbo.geom')
Ответ 2
Я столкнулся с той же проблемой, но принятое решение не было вариантом в моем случае из-за многих приложений, которые нельзя было изменить, чтобы ожидать совершенно другой запрос.
Вместо этого, я думаю, я нашел способ обмануть систему. На локальном сервере выполните:
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.
Ответ 3
У меня есть другое обходное решение. Это не относится к вопросу ОП, поскольку они пытались выбрать пространственные данные. Даже если вы не выбираете столбцы, содержащие пространственные данные, вы все равно получите эту ошибку. Поэтому, если вам нужно запросить такую таблицу и не нужно извлекать пространственные данные, вы можете создать представление для таблицы (выбирая только нужные столбцы, за исключением столбцов пространственных данных), а затем запрашивайте это представление вместо.