Ich versuche, Leerzeichen aus einer Zeichenfolge in SQL zu entfernen, aber LTRIM
- und RTRIM
-Funktionen scheinen nicht zu funktionieren?
Säule:
[ProductAlternateKey] [nvarchar](25) COLLATE Latin1_General_CS_AS NULL
Abfrage:
select REPLACE(ProductAlternateKey, ' ', '@'),
LEN(ProductAlternateKey),
LTRIM(RTRIM(ProductAlternateKey)) AS LRTrim,
LEN(LTRIM(RTRIM(ProductAlternateKey))) AS LRLen,
ASCII(RIGHT(ProductAlternateKey, 1)) AS ASCIIR,
ASCII(LEFT(ProductAlternateKey, 1)) AS ASCIIL,
ProductAlternateKey
from DimProducts
where ProductAlternateKey like '46783815%'
Ergebnis:
| COLUMN_0 | COLUMN_1 | LRTrim | LRLen | ASCIIR | ASCIIL | PRODUCTALTERNATEKEY |
---------------------------------------------------------------------------------
| 46783815 | 8 | 46783815| 8| 53 | 52 | 46783815 |
| 46783815 | 10|46783815 | 10| 10 | 52 | 46783815 |
Kann es andere Symbole geben, wenn LTRIM
und RTRIM
nicht funktionieren, wie "Enter"?
Mit ASCII(RIGHT(ProductAlternateKey, 1))
können Sie sehen, dass das rechte Zeichen in Zeile 2 ein Zeilenvorschub oder ein ASCII-Zeichen 10 ist.
Diese können nicht mit den Standardfunktionen LTrim
RTrim
entfernt werden.
Sie können jedoch (REPLACE(ProductAlternateKey, CHAR(10), '')
verwenden.
Möglicherweise möchten Sie auch Rückgaben und Registerkarten berücksichtigen. Diese drei (Zeilenvorschub, Wagenrücklauf und Registerkarten) sind die üblichen Schuldigen und können folgendermaßen entfernt werden:
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(ProductAlternateKey, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
Wenn Sie auf weitere Leerzeichen stoßen, die mit den obigen Angaben nicht entfernt werden können, versuchen Sie es mit einem oder allen der folgenden Zeichen:
--NULL
Replace([YourString],CHAR(0),'');
--Horizontal Tab
Replace([YourString],CHAR(9),'');
--Line Feed
Replace([YourString],CHAR(10),'');
--Vertical Tab
Replace([YourString],CHAR(11),'');
--Form Feed
Replace([YourString],CHAR(12),'');
--Carriage Return
Replace([YourString],CHAR(13),'');
--Column Break
Replace([YourString],CHAR(14),'');
--Non-breaking space
Replace([YourString],CHAR(160),'');
Diese Liste möglicher Leerzeichen kann zum Erstellen einer Funktion verwendet werden, z.
Create Function [dbo].[CleanAndTrimString]
(@MyString as varchar(Max))
Returns varchar(Max)
As
Begin
--NULL
Set @MyString = Replace(@MyString,CHAR(0),'');
--Horizontal Tab
Set @MyString = Replace(@MyString,CHAR(9),'');
--Line Feed
Set @MyString = Replace(@MyString,CHAR(10),'');
--Vertical Tab
Set @MyString = Replace(@MyString,CHAR(11),'');
--Form Feed
Set @MyString = Replace(@MyString,CHAR(12),'');
--Carriage Return
Set @MyString = Replace(@MyString,CHAR(13),'');
--Column Break
Set @MyString = Replace(@MyString,CHAR(14),'');
--Non-breaking space
Set @MyString = Replace(@MyString,CHAR(160),'');
Set @MyString = LTRIM(RTRIM(@MyString));
Return @MyString
End
Go
Das könntest du dann wie folgt verwenden:
Select
dbo.CleanAndTrimString(ProductAlternateKey) As ProductAlternateKey
from DimProducts
In diesem Fall steht kein Leerzeichen im Präfix/Suffix.
Die 1. Reihe sieht OK aus. Gehen Sie für den Inhalt der 2. Zeile wie folgt vor.
ASCII(RIGHT(ProductAlternateKey, 1))
und
ASCII(LEFT(ProductAlternateKey, 1))
Nach dem Text können 2 Leerzeichen stehen. Bestätigen Sie dies bitte. Sie können die Funktionen LTRIM
und RTRIM
auch verwenden, oder?
LTRIM(RTRIM(ProductAlternateKey))
Vielleicht ist der zusätzliche Speicherplatz kein gewöhnlicher Speicherplatz (ASCII 32, weicher Speicherplatz)? Vielleicht sind sie "harter Speicher", ASCII 160?
ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
Sieht aus wie der unsichtbare Charakter -
ALT+255
Versuche dies
select REPLACE(ProductAlternateKey, ' ', '@')
--type ALT+255 instead of space for the second expression in REPLACE
from DimProducts
where ProductAlternateKey like '46783815%'
Raj
Bearbeiten: Basierend auf den ASCII () - Ergebnissen versuchen Sie ALT+10
- verwenden Sie die numerische Tastatur
Wie wäre es damit?
CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey)))
FROM DimProducts
where ProductAlternateKey like '46783815%'