Trimming text strings in SQL Server 2008

后端 未结 7 1707
无人共我
无人共我 2020-12-30 19:05

I have a table in a SQL Server 2008 database. This table has a nvarchar(256) column called \'Name\'. Unfortunately, the values in this field have extra spaces included. For

相关标签:
7条回答
  • 2020-12-30 19:15

    No Answer is true

    The true Answer is Edit Column to NVARCHAR and you found Automatically trim Execute but this code UPDATE Table SET Name = RTRIM(LTRIM(Name)) use it only with Nvarchar if use it with CHAR or NCHAR it will not work

    0 讨论(0)
  • 2020-12-30 19:20

    I would try something like this for a Trim function that takes into account all white-space characters defined by the Unicode Standard (LTRIM and RTRIM do not even trim new-line characters!):

    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

    0 讨论(0)
  • 2020-12-30 19:25

    You can use the RTrim function to trim all whitespace from the right. Use LTrim to trim all whitespace from the left. For example

    UPDATE Table SET Name = RTrim(Name)
    

    Or for both left and right trim

    UPDATE Table SET Name = LTrim(RTrim(Name))
    
    0 讨论(0)
  • 2020-12-30 19:26

    This function trims a string from left and right. Also it removes carriage returns from the string, an action which is not done by the LTRIM and 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 讨论(0)
  • 2020-12-30 19:28

    I know this is an old question but I just found a solution which creates a user defined function using LTRIM and RTRIM. It does not handle double spaces in the middle of a string.

    The solution is however straight forward:

    User Defined Trim Function

    0 讨论(0)
  • 2020-12-30 19:31

    You do have an RTRIM and an LTRIM function. You can combine them to get the trim function you want.

    UPDATE Table
    SET Name = RTRIM(LTRIM(Name))
    
    0 讨论(0)
提交回复
热议问题