Pour toute personne utilisant SQL Server 2017 ou plus récent
vous pouvez utiliser la fonction intégrée TRIM . Par exemple:
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'~';
Veuillez noter que le comportement par défaut de TRIM
est de supprimer uniquement les espaces, afin de supprimer également les tabulations et les sauts de ligne (CR + LF), vous devez spécifier la characters FROM
clause.
En outre, j'ai utilisé NCHAR(0x09)
pour les caractères de tabulation dans la @Test
variable afin que l'exemple de code puisse être copié-collé et conserver les caractères corrects. Sinon, les tabulations sont converties en espaces lorsque cette page est rendue.
Pour toute personne utilisant SQL Server 2016 ou une version antérieure
Vous pouvez créer une fonction, soit en tant qu'UDF scalaire SQLCLR, soit en tant que TVF en ligne T-SQL (iTVF). Le TVF T-SQL Inline serait le suivant:
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
Et l'exécuter comme suit:
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;
Retour:
proof
----
~this
content~
Et vous pouvez l'utiliser dans une UPDATE
utilisation 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
Comme mentionné au début, cela est également très facile via SQLCLR car .NET comprend une Trim()
méthode qui effectue exactement l'opération souhaitée . Vous pouvez soit coder le vôtre pour appeler SqlString.Value.Trim()
, soit installer la version gratuite de la bibliothèque SQL # (que j'ai créée, mais cette fonction est dans la version gratuite) et utiliser soit String_Trim (qui ne fait que de l'espace blanc) ou String_TrimChars où vous passez les caractères à couper des deux côtés (tout comme l'iTVF illustré ci-dessus).
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];
Et il renvoie exactement la même chaîne que celle montrée ci-dessus dans l'exemple de sortie iTVF. Mais étant un UDF scalaire, vous l'utiliseriez comme suit dans un UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
L'une ou l'autre des solutions ci-dessus doit être efficace pour une utilisation sur des millions de lignes. Les TVF en ligne sont optimisables contrairement aux TVF à instructions multiples et aux FDU scalaires T-SQL. De plus, les FDU scalaires SQLCLR peuvent être utilisés dans des plans parallèles, tant qu'ils sont marqués comme IsDeterministic=true
et ne définissent aucun des deux types d'accès aux données Read
(la valeur par défaut pour l'accès aux données utilisateur et système est None
), et ces deux conditions sont true pour les deux fonctions SQLCLR notées ci-dessus.
UPDATE
requête commeLTRIM
/RTRIM
, quelque chose dans les lignes deUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
avec uneTRIM( expression, charlist )
fonction acceptant une liste de caractères à rogner comme l'ont fait de nombreux langages de script.update
déclaration.J'ai juste eu un problème avec cette situation particulière, j'avais besoin de trouver et de nettoyer chaque champ avec des espaces blancs, mais j'ai trouvé 4 types d'espaces blancs possibles dans mes champs de base de données (référence à la table de code ASCII):
Peut-être que cette requête peut vous aider.
la source
Vous devez analyser le deuxième exemple car LTRIM / RTRIM ne coupe que les espaces. Vous voulez réellement couper ce que SQL considère comme des données (/ r, / t, etc.). Si vous connaissez les valeurs que vous recherchez, utilisez simplement REMPLACER pour les remplacer. Mieux encore, écrivez une fonction et appelez-la.
la source
Si vous le souhaitez, utilisez ma fonction élégante:
la source
L'utilisation de la fonction sur des données volumineuses peut prendre un certain temps d'exécution. J'ai un ensemble de données de 8 millions de lignes, l'utilisation de la fonction a pris plus de 30 minutes à exécuter.
replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')
n'a pris que 5 sec. Merci a tous. Je te vois @ sami.almasagedi et @Colin 't Hartla source