替换SQL Server / T-SQL中的多余换行符

时间:2019-07-19 13:44:07

标签: sql-server tsql

我正在尝试重新格式化SQL Server 2012(SSMS v11.0.2100.60)中以自由格式文本提交的数据列的格式。它以带有CR / LF和制表符的标准段落格式格式化。问题在于数据是从HTML转换的,并且在重新格式化为文本后,数据中还有许多额外的CR / LF和选项卡,我正在尝试清理它们。

数据作为@vOut (varchar(max))传递到我的函数中。下面的代码将处于while循环中,直到找到匹配项。

DECLARE @vFind VARCHAR(MAX);
DECLARE @vFix VARCHAR(MAX);

SET @VFind = CONCAT(CHAR(13),CHAR(09),CHAR(13));
SET @VFix = CONCAT(CHAR(13),CHAR(13));

IF CHARINDEX(@VFind, @vOut) > 0
BEGIN
    SET @vOut = REPLACE(@vOut, @VFind, @VFix );
END

---------------

SET @VFind = CONCAT(CHAR(13),CHAR(13),CHAR(13));
SET @VFix = CONCAT(CHAR(13),CHAR(13));

IF CHARINDEX(@vOut, @VFind) > 0
BEGIN
    SET @vOut = REPLACE(@vOut, @VFind, @VFix );
END

结果集应将CHAR(13)+ CHAR(13)+ CHAR(13)替换为CHAR(13)+ CHAR(13),以保留基于段落的格式。

以上两个项目的charindex确实返回> 0的值,但是替换不起作用,因此返回的数据相同。

3 个答案:

答案 0 :(得分:0)

正如Larnu在评论中所写,您可能拥有CRLF-而不是CR-s。尝试使用这些行:

SET @VFind = CONCAT(CHAR(13),CHAR(10),CHAR(13),CHAR(10),CHAR(13),CHAR(10));
SET @VFix = CONCAT(CHAR(13),CHAR(10),CHAR(13),CHAR(10));

您也可能只有LF-s(如果文件来自Unix / Mac计算机),因此也请尝试以下操作:

SET @VFind = CONCAT(CHAR(10),CHAR(10),CHAR(10));
SET @VFix = CONCAT(CHAR(10),CHAR(10));

答案 1 :(得分:0)

是您要找的东西吗?

DECLARE @vOut VARCHAR(MAX)= 
's




K';
SELECT REPLACE( REPLACE( 
                    REPLACE(  
                            REPLACE(@vOut,CHAR(13)+CHAR(10),'<>')
                             ,'><','')
                ,'<>','<><>')
        ,'<>',CHAR(13))

答案 2 :(得分:0)

所以,我不确定它有什么区别,但是我更改了CONCAT方法,似乎有所不同。

SET @VFind = CONCAT(CHAR(13),CHAR(09),CHAR(13));
SET @VFix = CONCAT(CHAR(13),CHAR(13));
and
SET @VFind = CONCAT(CHAR(13),CHAR(13),CHAR(13));
SET @VFix = CONCAT(CHAR(13),CHAR(13));
to
SET @VFind = CHAR(13)+CHAR(09)+CHAR(13);
SET @VFix = CHAR(13)+CHAR(13);
and 
SET @VFind = CHAR(13)+CHAR(13)+CHAR(13);
SET @VFix = CHAR(13)+CHAR(13);