Ich möchte ein Zeilenumbruchzeichen in einer TSQL-Zeichenfolge ersetzen (oder entfernen). Irgendwelche Ideen?
Das Offensichtliche
REPLACE(@string, CHAR(13), '')
werde es einfach nicht tun ...
Tatsächlich kann eine neue Zeile in einem SQL-Befehl oder einer Skriptzeichenfolge CR, LF oder CR + LF sein. Um sie alle zu bekommen, brauchen Sie so etwas:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
.columns[0]
stattdessen zu verwenden.quelle
Ich bin vielleicht ein Jahr zu spät zur Party, aber ich arbeite jeden Tag an Abfragen und MS-SQL und habe die integrierten Funktionen LTRIM () und RTRIM () satt (und muss sie immer zusammen aufrufen) Ich entschied, dass es höchste Zeit war, eine bessere TRIM-Funktion zu implementieren, um keine "schmutzigen" Daten abzufangen, die am Ende Zeilenumbrüche hatten. Ich würde Peer-Feedback begrüßen!
Haftungsausschluss : Dadurch werden tatsächlich erweiterte Leerzeichen (Tabulator, Zeilenvorschub, Wagenrücklauf usw.) entfernt (durch ein einzelnes Leerzeichen ersetzt) und aus meiner ursprünglichen Antwort in "CleanAndTrim" umbenannt. Die Idee dabei ist , dass die Zeichenfolge nicht nicht brauchen solche zusätzlichen Sonder Leerzeichen im Inneren, und so , wenn sie am Kopf / Schwanz nicht auftreten, sollten sie mit einem einfachen Raum ersetzt werden. Wenn Sie solche Zeichen absichtlich in Ihrer Zeichenfolge gespeichert haben (z. B. in Ihrer Datenspalte, in der Sie dies ausführen möchten), TUN SIE ES NICHT! Verbessern Sie diese Funktion oder schreiben Sie eine eigene, die diese Zeichen buchstäblich nur von den Endpunkten der Zeichenfolge entfernt, nicht vom 'Körper'.
Okay, jetzt, da der Haftungsausschluss aktualisiert wurde, ist hier der Code.
Prost!
Ein weiterer Haftungsausschluss : Ihr typischer Windows-Zeilenumbruch ist CR + LF. Wenn Ihre Zeichenfolge diese enthält, werden Sie sie am Ende durch "doppelte" Leerzeichen ersetzen.
UPDATE, 2016 : Eine neue Version, mit der Sie diese Leerzeichen durch andere Zeichen Ihrer Wahlersetzen können! Dies umfasst auch Kommentare und die Umgehung der Windows CR + LF-Kopplung, dh das Ersetzen dieses bestimmten Zeichenpaars durch eine einzelne Ersetzung.
quelle
Die Newline in T-SQL wird durch CHAR (13) & CHAR (10) (Wagenrücklauf + Zeilenvorschub) dargestellt. Dementsprechend können Sie eine REPLACE-Anweisung mit dem Text erstellen, durch den Sie die neue Zeile ersetzen möchten.
quelle
Um das zu tun, was die meisten Leute wollen, erstellen Sie einen Platzhalter, der kein Zeilenumbruchzeichen ist. Dann können Sie tatsächlich die Ansätze kombinieren für:
Auf diese Weise ersetzen Sie nur einmal. Der Ansatz von:
Funktioniert hervorragend, wenn Sie nur die CRLF-Zeichen entfernen möchten, aber wenn Sie einen Platzhalter wie
oder etwas anderes möchten , ist der erste Ansatz etwas genauer.
quelle
Wenn Ihr Spaltendatentyp " Text " ist, erhalten Sie eine Fehlermeldung als
In diesem Fall müssen Sie den Text als nvarchar umwandeln und dann ersetzen
quelle
Wenn Sie ein Problem haben, bei dem Sie nur nachfolgende Zeichen entfernen möchten , können Sie Folgendes versuchen:
Dies löste ein Problem mit Adressen, bei denen eine Prozedur ein Feld mit einer festen Anzahl von Zeilen erstellte, selbst wenn diese Zeilen leer waren. Um Platz in meinem SSRS-Bericht zu sparen, habe ich sie gekürzt.
quelle
Wenn Sie eine offene Prozedur mit sp_helptext haben, kopieren Sie einfach den gesamten Text in eine neue SQL-Abfrage und drücken Sie Strg + H. Verwenden Sie den regulären Ausdruck, um ^ \ n in das Suchfeld zu ersetzen und durch Leerzeichen zu ersetzen. Weitere Details finden Sie im Bild. Geben Sie hier die Bildbeschreibung ein
quelle
Zur @ Cerebrus-Lösung: Für H2 für Zeichenfolgen wird "+" nicht unterstützt. Damit:
quelle
Die oben / früher veröffentlichte Antwort, die CHAR (13) CHAR (10) Wagenrücklauf ersetzen soll:
Kommt nie zu dem
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
Teil des Codes und gibt das unerwünschte Ergebnis von zurück:Und NICHT das gewünschte Ergebnis einer Single:
Dazu müsste das REPLACE-Skript als solches neu geschrieben werden:
Wenn der Fluss zuerst die REPLACE-Anweisung 1st / Furthest Left testet, wird bei einem Fehler die nächste REPLACE-Anweisung weiter getestet.
quelle