Sandeep Vemulapalli Ответов: 1

Запрос Sql geo-spatial linked server


У меня есть один вопрос по запросу TSQL Linked Server. Связанный сервер-это ГИС-система, поэтому мы передаем координаты тому серверу, который возвращает данные со связанного сервера. Пожалуйста, найдите ниже рабочий запрос.

DECLARE @input varchar(max), @sql varchar(max);

SET @input = N'((-119.470830216356 46.2642458295079,-119.470722927989 46.2642050348762,-119.470076515615 46.2647075484513,-119.470240130371 46.2647075484512,-119.470830216356 46.2642458295079))'
BEGIN
    SELECT @sql = 'select * from openquery([LinkedServerName],''DECLARE @b geometry;
                    SET @b = geometry::STGeomFromText(''''POLYGON '+ @input + ' '''', 4326);
                    SET @b = @b.MakeValid();  
                    SELECT * from [Database].[Table] AS b
                    where b.Shape.STIntersects(@b.STCentroid()) = 1'')'
END

EXEC(@sql)


Но проблема в том, что иногда нам приходится передавать более 8000 символов входному параметру @input, так как это varchar(max), а команда EXEC имеет ограничение в 8000 символов. Поэтому мы пытаемся избавиться от динамического SQL, чтобы мы могли передавать входные данные с помощью 2 входных переменных (мы реализовали разделение входных данных на подмножества, каждое из которых содержит 8000 символов в нашем коде C#, и отправляем их в качестве 2 различных входных данных в SQL-запрос). Мы попробовали выполнить приведенный ниже запрос на реальном сервере (связанном сервере), который работает нормально.

DECLARE @b geometry

SET @input = N'((-119.470830216356 46.2642458295079,-119.470722927989 46.2642050348762,'
SET @input2 = N'-119.470076515615 46.2647075484513,-119.470240130371 46.2647075484512,-119.470830216356 46.2642458295079))'

SELECT @b = geometry::STGeomFromText('POLYGON ' + @input + @input2 + '', 4326)
SELECT @b = @b.MakeValid()
SELECT * FROM [Database].[TableName] AS b
WHERE b.Shape.STIntersects(@b.STCentroid()) = 1


Что я уже пробовал:

DECLARE @input varchar(max), @input2 varchar(max);

SET @input = N'((-119.470830216356 46.2642458295079,-119.470722927989 46.2642050348762,'
SET @input2 = N'-119.470076515615 46.2647075484513,-119.470240130371 46.2647075484512,-119.470830216356 46.2642458295079))'

SELECT * FROM OPENQUERY([LinkedServerName],
'DECLARE @b geometry;
SELECT @b = geometry::STGeomFromText(''''POLYGON ' + @input + @input2 + '' ', 4326);
SELECT @b = @b.MakeValid(); 
SELECT * FROM [DatabaseName].[TableName] AS b 
where b.Shape.STIntersects(@b.STCentroid()) = 1') AS AD

Но получаю ниже ошибки
Msg 102, Level 15, State 1, Line 11
Incorrect syntax near '+'.

Выбрасывание ошибки здесь в приведенном выше запросе
POLYGON ' + @input

RedDk

Просто догадка ... вы когда-нибудь пробовали использовать BCP и выводить результаты SELECT в формате .csv, а затем массово загружать (всю) вещь обратно в таблицу? Звучит правдоподобно, да?

1 Ответов

Рейтинг:
0

Gerry Schmitz

Ваши "до и после" одинарные кавычки "изменились". Вам нужно "упростить" обработку строк, чтобы вы лучше понимали, что происходит.

SET @b = geometry::STGeomFromText(''''POLYGON '+ @input + ' '''', 4326);


SELECT @b = geometry::STGeomFromText(''''POLYGON ' + @input + @input2 + '' ', 4326);