J'ai une table dans une base de données SQL Server 2008. Cette table a une colonne nvarchar (256) appelée 'Nom'. Malheureusement, les valeurs de ce champ incluent des espaces supplémentaires. Par exemple, le nom "Bill" est en réalité enregistré sous le nom "Bill" dans la table.
Je souhaite mettre à jour tous les enregistrements de cette table pour supprimer les espaces supplémentaires. Cependant, j'ai été surpris d'apprendre que SQL n'a pas de fonction TRIM.
Comment mettre à jour tous les enregistrements à la fois pour supprimer les espaces supplémentaires?
Merci!
Vous pouvez utiliser la fonction RTrim pour supprimer tous les espaces de la droite. Utilisez LTrim pour supprimer tous les espaces de la gauche. Par exemple
UPDATE Table SET Name = RTrim(Name)
Ou pour les garnitures gauche et droite
UPDATE Table SET Name = LTrim(RTrim(Name))
SQL Server n'a pas de fonction TRIM, mais plutôt deux. Un chacun pour couper spécifiquement les espaces du "avant" d'une chaîne ( LTRIM ) et un pour couper les espaces de la "fin" d'une chaîne (- RTRIM ).
Quelque chose comme ce qui suit va mettre à jour chaque enregistrement de votre table, en coupant tout espace superposé (au début ou à la fin) d'un champ varchar/nvarchar:
UPDATE
[YourTableName]
SET
[YourFieldName] = LTRIM(RTRIM([YourFieldName]))
(Étrangement, SSIS (Sql Server Integration Services) n’a un seul TRIM une fonction!)
J'essaierais quelque chose comme ceci pour une fonction de rognage qui prend en compte tous les caractères d'espace blanc définis par le standard Unicode (LTRIM et RTRIM ne réduisent même pas les caractères de nouvelle ligne!):
IF OBJECT_ID(N'dbo.IsWhiteSpace', N'FN') IS NOT NULL
DROP FUNCTION dbo.IsWhiteSpace;
GO
-- Determines whether a single character is white-space or not (according to the UNICODE standard).
CREATE FUNCTION dbo.IsWhiteSpace(@c NCHAR(1)) RETURNS BIT
BEGIN
IF (@c IS NULL) RETURN NULL;
DECLARE @WHITESPACE NCHAR(31);
SELECT @WHITESPACE = ' ' + NCHAR(13) + NCHAR(10) + NCHAR(9) + NCHAR(11) + NCHAR(12) + NCHAR(133) + NCHAR(160) + NCHAR(5760) + NCHAR(8192) + NCHAR(8193) + NCHAR(8194) + NCHAR(8195) + NCHAR(8196) + NCHAR(8197) + NCHAR(8198) + NCHAR(8199) + NCHAR(8200) + NCHAR(8201) + NCHAR(8202) + NCHAR(8232) + NCHAR(8233) + NCHAR(8239) + NCHAR(8287) + NCHAR(12288) + NCHAR(6158) + NCHAR(8203) + NCHAR(8204) + NCHAR(8205) + NCHAR(8288) + NCHAR(65279);
IF (CHARINDEX(@c, @WHITESPACE) = 0) RETURN 0;
RETURN 1;
END
GO
IF OBJECT_ID(N'dbo.Trim', N'FN') IS NOT NULL
DROP FUNCTION dbo.Trim;
GO
-- Removes all leading and tailing white-space characters. NULL is converted to an empty string.
CREATE FUNCTION dbo.Trim(@TEXT NVARCHAR(MAX)) RETURNS NVARCHAR(MAX)
BEGIN
-- Check tiny strings (NULL, 0 or 1 chars)
IF @TEXT IS NULL RETURN N'';
DECLARE @TEXTLENGTH INT = LEN(@TEXT);
IF @TEXTLENGTH < 2 BEGIN
IF (@TEXTLENGTH = 0) RETURN @TEXT;
IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1)) = 1) RETURN '';
RETURN @TEXT;
END
-- Check whether we have to LTRIM/RTRIM
DECLARE @SKIPSTART INT;
SELECT @SKIPSTART = dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1));
DECLARE @SKIPEND INT;
SELECT @SKIPEND = dbo.IsWhiteSpace(SUBSTRING(@TEXT, @TEXTLENGTH, 1));
DECLARE @INDEX INT;
IF (@SKIPSTART = 1) BEGIN
IF (@SKIPEND = 1) BEGIN
-- FULLTRIM
-- Determine start white-space length
SELECT @INDEX = 2;
WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked
-- Stop loop if no white-space
IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
-- Otherwise assign index as @SKIPSTART
SELECT @SKIPSTART = @INDEX;
-- Increase character index
SELECT @INDEX = (@INDEX + 1);
END
-- Return '' if the whole string is white-space
IF (@SKIPSTART = (@TEXTLENGTH - 1)) RETURN '';
-- Determine end white-space length
SELECT @INDEX = (@TEXTLENGTH - 1);
WHILE (@INDEX > 1) BEGIN
-- Stop loop if no white-space
IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
-- Otherwise increase @SKIPEND
SELECT @SKIPEND = (@SKIPEND + 1);
-- Decrease character index
SELECT @INDEX = (@INDEX - 1);
END
-- Return trimmed string
RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART - @SKIPEND);
END
-- LTRIM
-- Determine start white-space length
SELECT @INDEX = 2;
WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked
-- Stop loop if no white-space
IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
-- Otherwise assign index as @SKIPSTART
SELECT @SKIPSTART = @INDEX;
-- Increase character index
SELECT @INDEX = (@INDEX + 1);
END
-- Return trimmed string
RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART);
END ELSE BEGIN
-- RTRIM
IF (@SKIPEND = 1) BEGIN
-- Determine end white-space length
SELECT @INDEX = (@TEXTLENGTH - 1);
WHILE (@INDEX > 1) BEGIN
-- Stop loop if no white-space
IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
-- Otherwise increase @SKIPEND
SELECT @SKIPEND = (@SKIPEND + 1);
-- Decrease character index
SELECT @INDEX = (@INDEX - 1);
END
-- Return trimmed string
RETURN SUBSTRING(@TEXT, 1, @TEXTLENGTH - @SKIPEND);
END
END
-- NO TRIM
RETURN @TEXT;
END
GO
Je sais que cette question est ancienne, mais je viens de trouver une solution qui crée une fonction définie par l'utilisateur à l'aide de LTRIM et de RTRIM. Il ne gère pas les doubles espaces au milieu d'une chaîne.
La solution est cependant simple:
Cette fonction coupe une chaîne de gauche et de droite. En outre, il supprime les retours chariot de la chaîne, action qui n'est pas effectuée par LTRIM et RTRIM.
IF OBJECT_ID(N'dbo.TRIM', N'FN') IS NOT NULL
DROP FUNCTION dbo.TRIM;
GO
CREATE FUNCTION dbo.TRIM (@STR NVARCHAR(MAX)) RETURNS NVARCHAR(MAX)
BEGIN
RETURN(LTRIM(RTRIM(REPLACE(REPLACE(@STR ,CHAR(10),''),CHAR(13),''))))
END;
GO
No Answer is true
La vraie réponse est Edit Column to NVARCHAR et vous avez trouvé l'option Automatically trim Execute, mais ce code UPDATE Table SET Name = RTRIM (LTRIM (Nom)) ne l'utilisez qu'avec Nvarchar s'il est utilisé avec CHAR ou NCHAR, cela ne fonctionnera