替换TSQL中的换行符

替换TSQL中的换行符,tsql,newline,Tsql,Newline,我想替换(或删除)TSQL字符串中的换行符。 有什么想法吗 显而易见的 REPLACE(@string, CHAR(13), '') 只是不行…t-SQL中的换行符由CHAR(13)和CHAR(10)(回车+换行符)表示。因此,可以使用要替换换行符的文本创建替换语句 REPLACE(@string, CHAR(13) + CHAR(10), '') REPLACE(MyField, CHAR(13) + CHAR(10), 'something else') 实际上,SQL命令或脚本字符串

我想替换(或删除)TSQL字符串中的换行符。 有什么想法吗

显而易见的

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

只是不行…

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

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

实际上,SQL命令或脚本字符串中的新行可以是CR、LF或CR+LF中的任意一行。要获得所有这些,您需要以下内容:

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

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

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字符,但需要占位符(如

<br/>


或者,第一种方法更准确一些。

我参加聚会可能晚了一年,但我每天都在处理查询和MS-SQL,我厌倦了内置函数LTRIM()&RTRIM()(并且总是必须将它们一起调用),也厌倦了不捕捉最后有换行符的“脏”数据,所以我决定是时候实现更好的微调功能了。我欢迎同行的反馈

免责声明:这实际上删除了扩展形式的空格(制表符、换行符、回车符等)(替换为单个空格),因此从我的原始答案中,它被重命名为“CleanAndTrim”。这里的想法是,字符串中不需要额外的空格字符,因此,如果它们不出现在头/尾,则应替换为纯空格。如果您有意将这些字符存储在字符串中(例如,您将要运行此操作的数据列),请不要这样做!改进此函数或编写自己的函数,从字符串的端点而不是“正文”中删除这些字符

好了,现在免责声明已经更新,下面是代码

-- =============================================
-- 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对的注释和解决方法,即用单个替换替换特定的字符对

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

如果您遇到只想删除尾随字符的问题,可以尝试以下方法:

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报告中节省空间,我将它们删减。

如果列数据类型为“text”,则会收到一条错误消息,如下所示:

Msg 8116,级别16,状态1,第2行参数数据类型文本为 替换函数的参数1无效

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

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

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

至@Cerburus solution:for H2 for String“+”不受支持。因此:

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

上面/之前发布的答案报告替换了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 other”)
部分,并将返回以下不需要的结果:

'something else''something else'
而不是单一的预期结果:

'something else'
这将需要重写替换脚本,如下所示:

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')
由于流首先测试第一条/最左边的REPLACE语句,因此一旦失败,将继续测试下一条REPLACE语句。

有时

REPLACE(myString, CHAR(13) + CHAR(10), ' ')
不行。在这种情况下,请使用以下代码段:

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

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

  • 它在开始和结束时修剪,而不是在中间
  • \r和\n的顺序无关紧要
  • 我用它来修剪文件名的特殊字符

    Select Trim(char(10) + char(13) + ' *<>' from @fileName)
    
    从@fileName中选择Trim(字符(10)+字符(13)+'*')
    
    我想清理列的内容以生成一个csv文件,所以我想去掉varchar中的逗号(,)以及换行符和carrage返回

    我还希望最终使用生成的csv创建另一个脚本(将行插入另一个db),因此还需要将“在varchar中”更改为“”,因此最终得到了这个

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

    也许还有其他更好的方法,但它完成了任务。

    @NielsBrinch只要这是字符串中唯一的换行方式,它就可以很好地工作。但是SQLServer支持这三种类型。事实上,如果您提取过所有系统存储过程和脚本化视图,您可以找到Microsoft自己使用的所有三个实例。在我进行此更改之前,这对我很有效。复制和粘贴列数据将使光标位于文本末尾,并带有两个空格。在进行此更改后,复制并粘贴到记事本中,光标直接位于文本的末尾。这给我的前端GUI中的b/c造成了一个问题,新行char出现了。如果列数据类型是text,那么你需要先转换为nvarchar,然后替换选择replace(替换(cast(@str as nvarchar(max)),char(13),“”),char(10),“”)@Slint是的,很好。实际上,要从客户机代码中使用它,您应该添加一个列名。虽然很多时候你确实可以用
    .columns[0]
    来代替,但是对于我使用的Oracle版本,语句是CHR,而不是CHAR。以防有人试图从Oracle进行调试。否则,其他的一切都适用;接受的答案删除{13,10}的任何组合。th
    REPLACE(REPLACE(REPLACE(REPLACE(ErrorMessage, CHAR(13), ''), CHAR(10), ''),',',''),'''','''''')