Как удалить несколько символов между двумя специальными символами в столбце в выражении SSIS

Я хочу удалить несколько символов, начиная с «@» до «;» в выражении производного столбца в службах SSIS. Например,

мои значения входного столбца,

введите здесь описание изображения

и хотите получить результат как,

введите здесь описание изображения

Примечание. Длина после «@» не является фиксированной.

Уже пробовали в SQL, но хотите сделать это через производное выражение столбца SSIS.


person user3620085    schedule 18.01.2021    source источник


Ответы (1)


Прежде всего: Пожалуйста, не публикуйте фотографии. Мы предпочитаем копировать и вставлять образцы данных. И, пожалуйста, попробуйте предоставить минимальный, полный и воспроизводимый пример, который лучше всего использовать с 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