删除两个回车之间的字符串将返回tsql

时间:2019-05-28 11:51:05

标签: string tsql replace

SQL的新手,非常感谢您的耐心配合。 我在表中有一列,用于存储一组特定的指令;每条指令都由回车符封装。
例如:char(13)+ @instruction1 + char(13) ...
@Instruction1是一个可变长度的字符串,但我确实知道该字符串的某个部分,例如:@instruction1 = some string + @knownstring + some string.
所以我们有了char(13) + (some string + @knownstring + some string) +char(13)
我想用''。替换整个行。
只需使用@knownstring即可识别。

这可能吗?

再次感谢大家,非常感谢您的协助

使用SSMS V17.9

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

仅替换@knownstring,但我还需要替换两个char(13)之间的周围文本

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

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()可以使重新组合变得更加容易。