Zastąp nową linię w TSQL

Chciałbym zastąpić (lub usunąć) znak nowej linii w łańcuchu TSQL. Jakieś Pomysły?

Oczywistość

REPLACE(@string, CHAR(13), '')
Po prostu tego nie zrobię...
 342
Author: Blorgbeard, 2009-06-04

9 answers

W rzeczywistości nowa linia w poleceniu SQL lub łańcuchu skryptu może być dowolna z CR, LF lub CR+LF. Aby je wszystkie zdobyć, potrzebujesz czegoś takiego:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
 689
Author: RBarryYoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 03:36:22
REPLACE(@string, CHAR(13) + CHAR(10), '')
 136
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 14:15:58

Nowy wiersz w T-SQL jest reprezentowany przez CHAR(13) & CHAR (10) (powrót karetki + kanał linii). W związku z tym można utworzyć instrukcję REPLACE z tekstem, którym chcesz zastąpić nowy wiersz.

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
 31
Author: Cerebrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 16:17:14

Mogę spóźnić się o rok, ale pracuję nad zapytaniami i MS-SQL każdego dnia i zmęczyły mnie wbudowane funkcje LTRIM () i RTRIM () (i zawsze trzeba je wywoływać razem), i nie łapanie "brudnych" danych, które miały nowe linie na końcu, więc zdecydowałem, że nadszedł czas, aby zaimplementować lepszą funkcję TRIM. Mile widziane opinie rówieśników!

Disclaimer: to faktycznie usuwa (zastępuje pojedynczą białą spacją) rozszerzone formy białej spacji (tab, line-feed, przewóz-zwrot itp.), więc został przemianowany na "CleanAndTrim" z mojej pierwotnej odpowiedzi. Chodzi o to, że Twój ciąg znaków nie potrzebuje takich dodatkowych specjalnych znaków w środku, więc jeśli nie występują one na głowie/ogonie, powinny być zastąpione zwykłą spacją. Jeśli celowo zapisałeś takie znaki w swoim łańcuchu (powiedzmy kolumnę danych, na której masz zamiar to uruchomić), nie rób tego! Poprawić tę funkcję lub napisać własną, która dosłownie usuwa te znaki z punktów końcowych łańcucha, a nie z "body".

Ok, teraz, gdy zastrzeżenie zostało zaktualizowane, oto kod.
-- =============================================
-- 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
Zdrówko!

Another Disclaimer : Typowe łamanie linii Windows To CR + LF, więc jeśli twój ciąg zawiera te znaki, zamienisz je na "podwójne" spacje.

aktualizacja, 2016: Nowa wersja, która daje możliwość zastąpienia tych znaków specjalnych białymi znakami innymi znakami twój wybór! Obejmuje to również komentarz i obejście dla parowania systemu Windows CR + LF, tzn. zastępuje tę konkretną parę znaków pojedynczym zastąpieniem.

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
 28
Author: NateJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 18:16:04

Aby zrobić to, czego chce większość ludzi, Utwórz symbol zastępczy, który nie jest prawdziwym znakiem łamania linii. Wtedy można rzeczywiście połączyć podejścia dla:

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

W ten sposób można zastąpić tylko raz. Podejście:

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

Działa świetnie, jeśli chcesz po prostu pozbyć się znaków CRLF, ale jeśli chcesz mieć symbol zastępczy, taki jak
lub coś takiego, to pierwsze podejście jest trochę bardziej dokładne.

 21
Author: porkandcheese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 20:49:54

Jeśli twój typ danych kolumny to " text ", otrzymasz komunikat o błędzie jako

Msg 8116, Level 16, State 1, Line 2 Argument typ danych text is nieprawidłowy dla argumentu 1 funkcji replace.

W tym przypadku musisz oddać tekst jako nvarchar, a następnie zastąpić

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')
 4
Author: akd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 10:32:34

Jeśli masz problem, w którym chcesz usunąć tylko znaki końcowe , Możesz spróbować tego:

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

To rozwiązało problem, który miałem z adresami, gdzie procedura utworzyła pole z ustaloną liczbą linii, nawet jeśli te linie były puste. Aby zaoszczędzić miejsce w moim raporcie SSRS, wyciąłem je.

 3
Author: DaveX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 21:11:53

Jeśli masz otwartą procedurę z użyciem sp_helptext, po prostu skopiuj cały tekst w nowym zapytaniu sql i naciśnij Ctrl + H przycisk użyj wyrażenia regularnego, aby zastąpić i umieść ^\n w polu Znajdź Zastąp pustym . aby uzyskać więcej szczegółów, Sprawdź obraz.Wpisz tutaj opis obrazka

 1
Author: Rohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 13:05:54

Do @Cerebrus solution: for H2 for strings " + " is not suupported. Więc:

REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
 0
Author: GKislin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 10:44:04