Вы можете попробовать кое-что по этому поводу:
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()
, чтобы упростить реконкатенацию.