Antworten:
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.
REPLACE(@string, CHAR(13) + CHAR(10), '')
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.
-- =============================================
-- 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
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.
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
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.
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
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:
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 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.
Wenn Ihr Spaltendatentyp " Text " ist, erhalten Sie eine Fehlermeldung als
Meldung 8116, Ebene 16, Status 1, Zeile 2 Der Text des Argumentdatentyps ist für Argument 1 der Ersetzungsfunktion ungültig.
In diesem Fall müssen Sie den Text als nvarchar umwandeln und dann ersetzen
SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')
Wenn Sie ein Problem haben, bei dem Sie nur nachfolgende Zeichen entfernen möchten , können Sie Folgendes versuchen:
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
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.
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
Zur @ Cerebrus-Lösung: Für H2 für Zeichenfolgen wird "+" nicht unterstützt. Damit:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
Die oben / früher veröffentlichte Antwort, die CHAR (13) CHAR (10) Wagenrücklauf ersetzen soll:
REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')
Kommt nie zu dem REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
Teil des Codes und gibt das unerwünschte Ergebnis von zurück:
'something else''something else'
Und NICHT das gewünschte Ergebnis einer Single:
'something else'
Dazu müsste das REPLACE-Skript als solches neu geschrieben werden:
REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')
Wenn der Fluss zuerst die REPLACE-Anweisung 1st / Furthest Left testet, wird bei einem Fehler die nächste REPLACE-Anweisung weiter getestet.