Запрос 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, а затем массово загружать (всю) вещь обратно в таблицу? Звучит правдоподобно, да?