Чтобы ответить на ваш вопрос об эффективности, в данном конкретном случае я не думаю, что Заменить против RegEx будет такой большой разницей. Все, что мы действительно меняем, - это некоторые скобки и запятые. Лично я предпочитаю делать вещи в TSQL для веб-приложений, потому что я могу перенести вычислительную работу на SQL Server вместо веб-сервера. В моем случае у меня есть много данных, которые я генерирую для карты, и поэтому не хочу перегружать веб-сервер большим количеством преобразований данных. Кроме того, для повышения производительности я обычно отдаю больше мощности SQL-серверу, чем веб-серверу, поэтому, даже если между этими двумя функциями есть некоторая разница, если Заменить менее эффективен, он по крайней мере обрабатывается сервер с гораздо большим количеством ресурсов. В общем, я хочу, чтобы мой веб-сервер обрабатывал соединения с клиентами, а мой SQL-сервер обрабатывал вычисления данных. Это также сохраняет мои скрипты веб-сервера чистыми и эффективными. Поэтому я предлагаю следующее:
Написать функцию Scalar TSQL в вашей базе данных. Он использует функцию SQL REPLACE и является довольно грубой силой, но он работает действительно хорошо. Эта функция может использоваться непосредственно в операторе SELECT или для создания вычисляемых столбцов в таблице, если вы действительно хотите упростить код веб-сервера. В настоящее время этот пример поддерживает только POINT, POLYGON и MULTIPOLYGON и предоставляет элемент JSON "geometry" для формата geoJSON.
Скалярная функция GetGeoJSON
CREATE FUNCTION GetGeoJSON (@geo geography) /*this is your geography shape*/
RETURNS varchar(max)
WITH SCHEMABINDING /*this tells SQL SERVER that it is deterministic (helpful if you use it in a calculated column)*/
AS
BEGIN
/* Declare the return variable here*/
DECLARE @Result varchar(max)
/*Build JSON "geometry" element for geoJSON*/
SELECT @Result = '"geometry":{' +
CASE @geo.STGeometryType()
WHEN 'POINT' THEN
'"type": "Point","coordinates":' +
REPLACE(REPLACE(REPLACE(REPLACE(@geo.ToString(),'POINT ',''),'(','['),')',']'),' ',',')
WHEN 'POLYGON' THEN
'"type": "Polygon","coordinates":' +
'[' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@geo.ToString(),'POLYGON ',''),'(','['),')',']'),'], ',']],['),', ','],['),' ',',') + ']'
WHEN 'MULTIPOLYGON' THEN
'"type": "MultiPolygon","coordinates":' +
'[' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@geo.ToString(),'MULTIPOLYGON ',''),'(','['),')',']'),'], ',']],['),', ','],['),' ',',') + ']'
ELSE NULL
END
+'}'
/* Return the result of the function*/
RETURN @Result
END
Далее, используйте вашу GetGeoJSON
функцию в вашем выражении SELECT
, например:
SELECT dbo.GetGeoJSON([COLUMN]) as Geometry From [TABLE]
Я надеюсь, что это даст некоторое понимание и поможет другим, ищущим методологию, удачи!