在TSQL中替换换行符

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

明显的

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

只是不会做...


#1楼

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

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字符,但是如果您想要一个占位符(例如,
或其他东西,那么第一种方法会更准确。


#2楼

我可能晚了一年,但是我每天都要处理查询和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配对的解决方法,即用单个替换替换该特定的字符对。

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

#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报告中的空间,我将其缩减。


#4楼

如果您的列数据类型为' text ',则您将收到一条错误消息,提示为

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

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

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

#5楼

如果您具有使用sp_helptext的开放过程,则只需将所有文本复制到新的sql查询中,然后按ctrl + h按钮,使用正则表达式替换并将^ \\ n放在find字段中,并用blank替换。 有关更多详细信息,请检查图像。 在此处输入图片说明


#6楼

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

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

#7楼

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

#8楼

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

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

#9楼

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

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
发布了0 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/104235016