Прежде всего: Пожалуйста, не публикуйте фотографии. Мы предпочитаем копировать и вставлять образцы данных. И, пожалуйста, попробуйте предоставить минимальный, полный и воспроизводимый пример, который лучше всего использовать с DDL, INSERT и кодом, как я делаю это здесь для вас.
И просто упомянем следующее: если вы управляете вводом, вы не должны смешивать информацию в одной строке... Если это необходимо, попробуйте использовать настоящий текстовый контейнер, такой как XML или JSON.
SQL-сервер не предназначен для манипуляций со строками. Соответствие регулярному выражению или повторяющемуся/вложенному шаблону отсутствует. Поэтому нам пришлось бы использовать рекурсивный/процедурный/циклический подход. Но - если производительность не так важна - вы можете использовать XML-хак.
--DDL и ВСТАВИТЬ
DECLARE @tbl TABLE(ID INT IDENTITY,YourString VARCHAR(1000));
INSERT INTO @tbl VALUES('Here is one without')
,('One@some comment;in here')
,('Two comments@some comment;in here@here is the second;and some more text')
--Запрос
SELECT t.ID
,t.YourString
,CAST(REPLACE(REPLACE((SELECT t.YourString AS [*] FOR XML PATH('')),'@','<!--'),';','--> ') AS XML) SeeTheIntermediateXML
,CAST(REPLACE(REPLACE((SELECT t.YourString AS [*] FOR XML PATH('')),'@','<!--'),';','--> ') AS XML).value('.','nvarchar(max)') CleanedValue
FROM @tbl t
Результат
+----+-------------------------------------------------------------------------+-----------------------------------------+
| ID | YourString | CleanedValue |
+----+-------------------------------------------------------------------------+-----------------------------------------+
| 1 | Here is one without | Here is one without |
+----+-------------------------------------------------------------------------+-----------------------------------------+
| 2 | One@some comment;in here | One in here |
+----+-------------------------------------------------------------------------+-----------------------------------------+
| 3 | Two comments@some comment;in here@here is the second;and some more text | Two comments in here and some more text |
+----+-------------------------------------------------------------------------+-----------------------------------------+
Идея вкратце:
- Используя некоторые строковые методы, мы можем обернуть нежелательный текст в XML-комментарии.
Посмотри на это
Two comments<!--some comment--> in here<!--here is the second--> and some more text
- При чтении этого XML с помощью
.value()
содержимое будет возвращено без комментариев.
Подсказка 1: используйте '-->;'
в качестве замены, чтобы сохранить точку с запятой в качестве разделителя.
Подсказка 2: если где-то в строке может быть точка с запятой ;
, в результате вы увидите -->
. В этом случае вам понадобится третий REPLACE()
против полученной строки.
person
Shnugo
schedule
18.01.2021