web-dev-qa-db-fra.com

Couper des chaînes de texte dans SQL Server 2008

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!

43
user208662

Vous avez une fonction RTRIM et une fonction LTRIM . Vous pouvez les combiner pour obtenir la fonction de rognage souhaitée.

UPDATE Table
SET Name = RTRIM(LTRIM(Name))
98
Ronald Wildenberg

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))
16
mpenrow

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!)

4
CraigTP

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
2
Christoph

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:

Fonction de rognage définie par l'utilisateur

1
philips

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
0
Oday Fraiwan

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

0
user3742682