web-dev-qa-db-fra.com

Comment supprimer des espaces blancs d'une chaîne dans SQL Server

J'essaie de supprimer les espaces d'une chaîne en SQL mais les fonctions LTRIM et RTRIM ne semblent pas fonctionner

Colonne:

[ProductAlternateKey] [nvarchar](25) COLLATE Latin1_General_CS_AS NULL

Question:

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%'

Résultat:

|  COLUMN_0 | COLUMN_1 | LRTrim | LRLen | ASCIIR | ASCIIL | PRODUCTALTERNATEKEY |
---------------------------------------------------------------------------------
|  46783815 |        8 | 46783815|     8|   53   |   52   |            46783815 |
| 46783815  |        10|46783815  |   10|   10   |   52   |           46783815  |

Peut-il s'agir d'autres symboles si LTRIM et RTRIM ne fonctionnent pas, comme "Entrée"?

27
Justin

En utilisant ASCII(RIGHT(ProductAlternateKey, 1)), vous pouvez voir que le caractère le plus à droite de la ligne 2 est un saut de ligne ou un caractère ascii 10.

Ceci ne peut pas être supprimé à l’aide des fonctions standard LTrimRTrim.

Vous pouvez cependant utiliser (REPLACE(ProductAlternateKey, CHAR(10), '')

Vous voudrez peut-être aussi rendre compte des retours et des onglets. Ces trois (sauts de ligne, retours à la ligne et tabulations) sont les coupables habituels et peuvent être supprimés avec les éléments suivants:

LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(ProductAlternateKey, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))

Si vous rencontrez plus de caractères "d'espace blanc" qui ne peuvent pas être supprimés, essayez l'une ou l'ensemble des opérations ci-dessous:

--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),'');

Cette liste de caractères d'espaces blancs potentiels pourrait être utilisée pour créer une fonction telle que:

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

Que vous pouvez ensuite utiliser comme suit:

Select 
    dbo.CleanAndTrimString(ProductAlternateKey) As ProductAlternateKey
from DimProducts
63
DMK

Dans ce cas, ce n'est pas un espace qui est en préfixe/suffixe.
La 1ère rangée semble OK. Procédez comme suit pour le contenu de la 2e rangée.

ASCII(RIGHT(ProductAlternateKey, 1))

et 

ASCII(LEFT(ProductAlternateKey, 1))
4
shahkalpesh

Il peut y avoir 2 espaces après le texte, veuillez confirmer. Vous pouvez également utiliser les fonctions LTRIM et RTRIM?

LTRIM(RTRIM(ProductAlternateKey))

Peut-être que l'espace supplémentaire n'est pas un espace ordinaire (ASCII 32, espace modéré)? Peut-être qu'il s'agit d'un "espace dur", ASCII 160?

ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
3
TechDo

On dirait que le personnage invisible - 

ALT+255

Essaye ça

select REPLACE(ProductAlternateKey, ' ', '@')
--type ALT+255 instead of space for the second expression in REPLACE 
from DimProducts
where ProductAlternateKey  like '46783815%'

Raj

Edit: sur la base des résultats ASCII (), essayez ALT+10 - utilisez le pavé numérique 

0
Raj

Que dis-tu de ça?

CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey))) 
FROM DimProducts
where ProductAlternateKey  like '46783815%'
0
mr_eclair