在SQL中替换换行符

时间:2009-06-04 16:10:34

标签: tsql newline

我想替换(或删除)TSQL字符串中的换行符。 任何想法?

显而易见的

REPLACE(@string, CHAR(13), '')

就是不会这样做......

13 个答案:

答案 0 :(得分:761)

实际上,SQL命令或脚本字符串中的新行可以是CR,LF或CR + LF中的任何一行。为了得到它们,你需要这样的东西:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

答案 1 :(得分:140)

REPLACE(@string, CHAR(13) + CHAR(10), '')

答案 2 :(得分:31)

T-SQL中的换行符由CHAR(13)& CHAR(10)(回车+换行)。因此,您可以使用要替换换行符的文本创建REPLACE语句。

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')

答案 3 :(得分:31)

我可能迟到了一年,但我在查询和工作方面工作。每天都有MS-SQL,我厌倦了内置函数LTRIM()& RTRIM()(并且总是必须一起调用它们),并且没有捕获最后有换行符的“脏”数据,因此我认为现在是实现更好的TRIM功能的时候了。我欢迎同行反馈!

免责声明:这实际上删除(替换为单个空格)扩展形式的空白(制表符,换行符,回车符等),所以它是从我的原始答案重命名为“CleanAndTrim”。这里的想法是你的字符串里面没有需要这样的额外特殊空白字符,因此如果它们不在头/尾发生,它们应该用普通空格替换。如果您故意在字符串中存储此类字符(例如,您要将其运行的数据列),请不要这样做!改进这个功能或编写你自己的功能,只是从字符串的端点中删除那些字符,而不是从'body'中删除。

好的,现在免责声明已更新,这是代码。

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

干杯!

另一个免责声明: 典型的Windows换行符是CR + LF,所以如果你的字符串包含那些,你最终会用“双”空格替换它们。

2016年更新 : 一个新版本,您可以选择使用您选择的其他字符替换这些特殊空格字符!这还包括Windows CR + LF配对的评论和解决方法,即用一次替换替换特定的char-pair。

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char's from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO

答案 4 :(得分:22)

要执行大多数人想要的操作,请创建一个不是实际换行符的占位符。然后你可以实际结合以下方法:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

这样您只需更换一次。方法:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

如果您只是想摆脱CRLF字符,那么效果很好,但如果你想要一个占位符,比如
什么,那么第一种方法就更准确了。

答案 5 :(得分:5)

如果您的列数据类型为“文字”,则会收到错误消息

  

消息8116,级别16,状态1,行2参数数据类型文本是   对于替换函数的参数1无效。

在这种情况下,您需要将文本转换为nvarchar,然后替换

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

答案 6 :(得分:3)

如果您遇到只想删除尾随字符的问题,可以试试这个:

WHILE EXISTS
(SELECT * FROM @ReportSet WHERE
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32)
BEGIN
    UPDATE @ReportSet
    SET addr_3 = LEFT(addr_3,LEN(addr_3)-1)
    WHERE 
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32
END

这解决了我在地址中遇到的问题,其中一个过程创建了一个具有固定行数的字段,即使这些行是空的。为了节省我的SSRS报告中的空间,我将其删除了。

答案 7 :(得分:3)

有时

REPLACE(myString, CHAR(13) + CHAR(10), ' ')

不起作用。在这种情况下,请使用以下代码段:

REPLACE(REPLACE(myString, CHAR(13),''), CHAR(10), ' ')

答案 8 :(得分:2)

在SQL Server 2017及更高版本中,使用Trim

Select Trim(char(10) + char(13) from @str)
  1. 它在开始和结尾处修剪,而不是在中间
  2. \ r和\ n的顺序无关紧要

我用它来修剪文件名的特殊字符

Select Trim(char(10) + char(13) + ' *<>' from @fileName)

答案 9 :(得分:1)

如果你有使用sp_helptext的开放程序,那么只需复制新sql查询中的所有文本,然后按ctrl + h按钮使用正则表达式替换并将^ \ n放入查找字段替换为空白。 有关详细信息,请查看图片。enter image description here

答案 10 :(得分:1)

对于@Cerebrus解决方案:对于H2,不支持字符串“ +”。所以:

REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')

答案 11 :(得分:0)

上面/之前发布的答案被报告为替换CHAR(13)CHAR(10)回车:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

将永远不会到达代码的REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')部分,并且将返回不想要的结果:

'something else''something else'

而不是单个结果:

'something else'

这将需要将REPLACE脚本重写为:

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')

当流程首先测试第一个/最左边的REPLACE语句时,然后在失败时将继续测试下一个REPLACE语句。

答案 12 :(得分:0)

我想清理一列的内容以生成一个 csv 文件,所以想去掉 varchar 中的逗号 (,) 以及换行符和回车符。

我还想最终使用生成的 csv 创建另一个脚本(将行插入到另一个数据库中),因此还需要将 varchar 中的 ' 更改为 '' 所以最终得到了这个...

REPLACE(REPLACE(REPLACE(REPLACE(ErrorMessage, CHAR(13), ''), CHAR(10), ''),',',''),'''','''''')

可能还有其他更好的方法,但它完成了工作。