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...
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...
@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.
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.
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), '')
Diese Methode habe ich zuerst ausprobiert, aber sie hat nicht bei allen Daten zuverlässig funktioniert. @RBarryYoung hat es oben richtig gesagt.
Danke, ich musste dies ein wenig ändern, damit es bei mir funktioniert, in meinem Fall ist es: replace(REPLACE(@string, CHAR(13) , ''),CHAR(10), '')
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
Frühere Nutzer beachten bitte die Änderung und den Haftungsausschluss - und ich entschuldige mich für die anfänglichen Annahmen über Nutzung und Zweck.
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).
Microsoft mochte Ihre TRIM-Funktion so sehr, dass sie sie in SQL Server 2017 aufgenommen haben ;)
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.
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 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.