Für alle, die SQL Server 2017 oder höher verwenden
Sie können die integrierte TRIM -Funktion verwenden. Beispielsweise:
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~'
+ TRIM(NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A) FROM @Test)
+ N'~';
Beachten Sie, dass das Standardverhalten von darin TRIM
besteht, nur Leerzeichen zu entfernen. Um also auch die Tabulatoren und Zeilenumbrüche (CR + LFs) zu entfernen, müssen Sie die characters FROM
Klausel angeben .
Außerdem habe ich NCHAR(0x09)
für die Tabulatorzeichen in der @Test
Variablen verwendet, damit der Beispielcode kopiert und eingefügt werden kann und die richtigen Zeichen beibehalten werden. Andernfalls werden Registerkarten beim Rendern dieser Seite in Leerzeichen umgewandelt.
Für alle, die SQL Server 2016 oder älter verwenden
Sie können eine Funktion entweder als SQLCLR Scalar UDF oder als T-SQL Inline TVF (iTVF) erstellen. Die T-SQL Inline TVF wäre wie folgt:
CREATE
--ALTER
FUNCTION dbo.TrimChars(@OriginalString NVARCHAR(4000), @CharsToTrim NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
WITH cte AS
(
SELECT PATINDEX(N'%[^' + @CharsToTrim + N']%', @OriginalString) AS [FirstChar],
PATINDEX(N'%[^' + @CharsToTrim + N']%', REVERSE(@OriginalString)) AS [LastChar],
LEN(@OriginalString + N'~') - 1 AS [ActualLength]
)
SELECT cte.[ActualLength],
[FirstChar],
((cte.[ActualLength] - [LastChar]) + 1) AS [LastChar],
SUBSTRING(@OriginalString, [FirstChar],
((cte.[ActualLength] - [LastChar]) - [FirstChar] + 2)) AS [FixedString]
FROM cte;
GO
Und wie folgt laufen lassen:
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~' + tc.[FixedString] + N'~' AS [proof]
FROM dbo.TrimChars(@Test, NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) tc;
Kehrt zurück:
proof
----
~this
content~
Und Sie können das in einer UPDATE
Verwendung verwenden CROSS APPLY
:
UPDATE tbl
SET tbl.[Column] = itvf.[FixedString]
FROM SchemaName.TableName tbl
CROSS APPLY dbo.TrimChars(tbl.[Column],
NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) itvf
Wie eingangs erwähnt, ist dies auch über SQLCLR sehr einfach, da .NET eine Trim()
Methode enthält, die genau die gewünschte Operation ausführt . Sie können entweder Code Ihr eigen zu nennen SqlString.Value.Trim()
, oder Sie können einfach die kostenlose Version der Installation von SQL # Bibliothek (die ich erstellt, aber diese Funktion ist in der Free - Version) und die Nutzung entweder String_Trim (die nur Leerraum der Fall ist) oder String_TrimChars wo Sie geben die Zeichen ein, um sie von beiden Seiten zu trimmen (genau wie beim oben gezeigten iTVF).
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~' + SQL#.String_Trim(@Test) + N'~' AS [proof];
Und es gibt genau die gleiche Zeichenfolge zurück, die oben in der iTVF-Beispielausgabe gezeigt wurde. Als skalare UDF würden Sie sie jedoch wie folgt verwenden UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
Eine der oben genannten Methoden sollte für die Verwendung in Millionen von Zeilen effizient sein. Inline-TVFs sind im Gegensatz zu TVFs mit mehreren Anweisungen und skalaren T-SQL-UDFs optimierbar. SQLCLR-skalare UDFs können möglicherweise in parallelen Plänen verwendet werden, sofern sie als gekennzeichnet sind IsDeterministic=true
und keinen der beiden DataAccess-Typen auf setzen Read
(die Standardeinstellung für den Benutzer- und Systemdatenzugriff ist None
), und beide Bedingungen sind erfüllt true für beide oben genannten SQLCLR-Funktionen.
UPDATE
Abfrage wieLTRIM
/ verwendet werden kannRTRIM
, etwas in den ZeilenUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
einerTRIM( expression, charlist )
Funktion, die eine Liste von Zeichen zum Trimmen akzeptiert wie viele Skriptsprachen haben.update
Anweisung verwenden würden.Ich hatte gerade ein Problem mit dieser speziellen Situation, ich musste jedes Feld mit Leerzeichen finden und bereinigen, aber ich fand 4 Arten von möglichen Leerzeichen in meinen Datenbankfeldern (Verweis auf ASCII-Codetabelle):
Vielleicht kann Ihnen diese Abfrage helfen.
quelle
Sie müssten das zweite Beispiel analysieren, da LTRIM / RTRIM nur Leerzeichen trimmt. Sie möchten tatsächlich kürzen, was SQL als Daten betrachtet (/ r, / t usw.). Wenn Sie die gesuchten Werte kennen, ersetzen Sie sie einfach durch REPLACE. Besser noch, schreiben Sie eine Funktion und rufen Sie sie auf.
quelle
Wenn Sie möchten, nutzen Sie meine elegante Funktion:
quelle
Die Verwendung der Funktion für große Datenmengen kann lange Ausführungszeiten dauern. Ich habe einen Datensatz von 8 Millionen Zeilen. Die Ausführung der Funktion dauerte mehr als 30 Minuten.
replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')
dauerte nur 5 sek. Vielen Dank an alle. Ich sehe dich @ sami.almasagedi und @Colin 't Hartquelle