519 Stimmen

Ersetzen eines Zeilenumbruchs in TSQL

Ich möchte ein Zeilenumbruchszeichen in einem TSQL-String ersetzen (oder entfernen). Irgendwelche Ideen?

Das Offensichtliche

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

wird es einfach nicht tun...

1024voto

RBarryYoung Punkte 53364

Eine neue Zeile in einem SQL-Befehl oder einer Skriptzeichenfolge kann aus CR, LF oder CR+LF bestehen. Um sie alle zu erhalten, brauchen Sie etwas wie dies:

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

5 Stimmen

@NielsBrinch Das funktioniert gut, solange dies die einzige Art von Zeilenumbruch in Ihren Zeichenfolgen ist. Aber SQL Server unterstützt alle drei Typen. Wenn Sie einmal alle gespeicherten Systemprozeduren und skriptgesteuerten Ansichten extrahiert haben, finden Sie Instanzen aller drei Typen, wie sie von Microsoft selbst verwendet werden.

0 Stimmen

Das hat bei mir funktioniert, denn bevor ich diese Änderung vorgenommen habe, stand der Cursor beim Kopieren und Einfügen der Spaltendaten am Ende des Textes mit zwei Leerzeichen. Nachdem ich diese Änderung vorgenommen hatte, stand der Cursor beim Kopieren und Einfügen in Notepad direkt am Ende des Textes. Dies verursachte ein Problem für mich, da in unserer Front-End-GUI das neue Zeilenzeichen angezeigt wurde.

10 Stimmen

Wenn der Datentyp der Spalte Text ist, müssen Sie zuerst in nvarchar umwandeln und dann ersetzen SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

164voto

Mitch Wheat Punkte 287474
REPLACE(@string, CHAR(13) + CHAR(10), '')

2 Stimmen

Diese Methode habe ich zuerst ausprobiert, aber sie hat nicht bei allen Daten zuverlässig funktioniert. @RBarryYoung hat es oben richtig gesagt.

1 Stimmen

Danke, ich musste dies ein wenig ändern, damit es bei mir funktioniert, in meinem Fall ist es: replace(REPLACE(@string, CHAR(13) , ''),CHAR(10), '')

0 Stimmen

Danke, das hat funktioniert, die obere Antwort aus irgendeinem Grund nicht

54voto

NateJ Punkte 1835

Ich bin vielleicht ein Jahr zu spät dran, aber ich arbeite jeden Tag an Abfragen und MS-SQL, und ich hatte genug von den eingebauten Funktionen LTRIM() und RTRIM() (und davon, sie immer zusammen aufrufen zu müssen), und davon, "schmutzige" Daten mit Zeilenumbrüchen am Ende nicht abzufangen. Ich würde mich über Feedback von anderen freuen!

Haftungsausschluss : das ist eigentlich beseitigt (ersetzt durch ein einzelnes Leerzeichen) erweiterte Formen von Leerzeichen (Tabulator, Zeilenvorschub, Wagenrücklauf, etc.), so dass es als "CleanAndTrim" aus meiner ursprünglichen Antwort umbenannt wurde. Die Idee dahinter ist, dass Ihre Zeichenkette nicht brauchen solche zusätzlichen Sonderzeichen für Leerzeichen innerhalb des Textes, und wenn sie nicht am Kopf/Schwanz vorkommen, sollten sie durch ein einfaches Leerzeichen ersetzt werden. Wenn Sie solche Zeichen absichtlich in Ihrer Zeichenkette gespeichert haben (z.B. in Ihrer Datenspalte, die Sie jetzt bearbeiten wollen), dann tun Sie es nicht! Verbessern Sie diese Funktion oder schreiben Sie eine eigene, die diese Zeichen buchstäblich nur aus den Endpunkten der Zeichenkette entfernt, nicht aus dem "Körper".

Okay, jetzt, wo der Haftungsausschluss aktualisiert ist, hier ist der Code.

-- =============================================
-- 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

Zum Wohl!

Ein weiterer Haftungsausschluss : Der typische Windows-Zeilenumbruch ist CR+LF. Wenn Ihre Zeichenkette also solche Zeilenumbrüche enthält, müssen Sie sie durch "doppelte" Leerzeichen ersetzen.

UPDATE, 2016 : Eine neue Version, die Ihnen die Möglichkeit gibt, diese Sonderzeichen durch Leerzeichen zu ersetzen andere Zeichen Ihrer Wahl! Dazu gehören auch Kommentare und die Umgehung der Windows CR+LF-Paarung, d. h. die Ersetzung dieses spezifischen Zeichenpaars durch eine einzige Ersetzung.

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

0 Stimmen

Frühere Nutzer beachten bitte die Änderung und den Haftungsausschluss - und ich entschuldige mich für die anfänglichen Annahmen über Nutzung und Zweck.

1 Stimmen

Neues Update! Testfälle können hier gefunden werden: sqlfiddle.com/#!6/585a2/1/0 -- SQLFiddle schien auf meinem tatsächlichen Lauf der Testfälle zu ersticken, so stattdessen baute ich eine "Test-Case Query Builder"-Tabelle & geben Sie die 9 Anweisungen zu kopieren-Einfügen in Ihr eigenes SSMS-Fenster zu laufen (nach der Erstellung des Schemas natürlich, dh die Funktion & die TestStrings-Tabelle).

3 Stimmen

Microsoft mochte Ihre TRIM-Funktion so sehr, dass sie sie in SQL Server 2017 aufgenommen haben ;)

36voto

Cerebrus Punkte 25410

Der Zeilenumbruch wird in T-SQL durch CHAR(13) & CHAR(10) (Carriage Return + Line Feed) dargestellt. Dementsprechend können Sie eine REPLACE-Anweisung mit dem Text erstellen, durch den Sie den Zeilenumbruch ersetzen möchten.

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

12 Stimmen

Dies ist nicht ganz dasselbe wie die akzeptierte Antwort; die akzeptierte Antwort entfernt jede Kombination von {13, 10}. Dies entfernt nur die spezifische Kombination von 13 und 10. Es macht keinen Unterschied für Windows-Zeilenenden, aber andere Kodierungen werden hier vermisst.

32voto

porkandcheese Punkte 261

Um das zu tun, was die meisten Leute wollen, erstellen Sie einen Platzhalter, der kein echtes Zeilenumbruchzeichen ist. Dann können Sie tatsächlich die Ansätze für kombinieren:

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

Auf diese Weise ersetzen Sie nur einmal. Der Ansatz von:

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

Funktioniert gut, wenn Sie nur die CRLF-Zeichen loswerden wollen, aber wenn Sie einen Platzhalter brauchen, wie z. B.

<br/>

oder so, dann ist der erste Ansatz etwas genauer.

0 Stimmen

Ich habe die Zeilenumbrüche anstelle von '' durch ein Leerzeichen ersetzt. Das ist in Ordnung, wenn Sie CR oder LF haben, erhalten Sie nur ein Leerzeichen, aber wenn Sie ein CRLF haben, erhalten Sie zwei. Also habe ich eine weitere Ersetzung um das Ganze gewickelt, um doppelte Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen: REPLACE(REPLACE(REPLACE(Kundenname, CHAR(13), ' '), CHAR(10), ' '),' ',' ')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X