Удаление строки между двумя символами возврата каретки tsql - PullRequest
0 голосов
/ 28 мая 2019

Очень плохо знаком с SQL, поэтому я заранее ценю ваше терпение. У меня есть столбец в таблице, в котором хранится определенный набор инструкций; каждая инструкция заключена в возврат каретки.
например: char(13)+ @instruction1 + char(13) ...
@Instruction1 - строка переменной длины, но я знаю определенную часть строки, например: @instruction1 = some string + @knownstring + some string.
Итак, у нас есть char(13) + (some string + @knownstring + some string) +char(13).
Я хочу заменить всю эту строку на ''.
Идентифицируя это просто используя @knownstring.

Возможно ли это?

Благодарю вас всех еще раз, я очень ценю вашу помощь

select replace(replace(column,@knownsting,''),char(13),'') 
from table 
where key=1235

Заменяет только @knownstring, но мне также нужно заменить окружающий текст между двумя char(13)

1 Ответ

0 голосов
/ 28 мая 2019

Вы можете попробовать кое-что по этому поводу:

DECLARE @KnownString VARCHAR(50)='Keep This'
DECLARE @YourString VARCHAR(MAX)='blah' + CHAR(13) + 'dummy keep this dummy more' + CHAR(13) + 'Something without the known part' + CHAR(13) + 'Again with Keep THIS';

SELECT STUFF(
(
    SELECT CHAR(13) + CASE WHEN CHARINDEX(@KnownString,LineText)>0 THEN @KnownString ELSE LineText END
    FROM (SELECT CAST('<x>' + REPLACE(@YourString,CHAR(13),'</x><x>') + '</x>' AS XML)) A(Casted)
    CROSS APPLY Casted.nodes('/x') B(fragment)
    OUTER APPLY (SELECT fragment.value('text()[1]','nvarchar(max)')) C(LineText)
    FOR XML PATH(''),TYPE
).value('.','nvarchar(max)'),1,1,'');

Результат

blah
Keep This
Something without the known part
Keep This

Идея

Строка преобразуется в XML путем замены разрывов строк наXML-теги.Теперь мы можем запрашивать все текстовые строки отдельно, проверять их на наличие известной строки, выполнять необходимые манипуляции и, наконец, повторно объединять все фрагменты, используя XML-трюк (вместе с STUFF, чтобы избавиться от ведущего CHAR(13)).

Замечания

Используя v2016, я бы использовал подход с разделенной строкой с OPENJSON, а начиная с v2017 есть STRING_AGG(), чтобы упростить реконкатенацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...