Trimming text strings in SQL Server 2008

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 instance the name 'Bill' is actually stored as 'Bill ' in the table.

I want to update all of the records in this table to remove the extra spaces. However, I was surprised to learn that SQL does not have a TRIM function.

How do I update all of the records at once to remove the extra spaces?

Thank you!


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

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

SQL Server does not have a TRIM function, but rather it has two. One each for specifically trimming spaces from the "front" of a string (LTRIM) and one for trimming spaces from the "end" of a string (RTRIM).

Something like the following will update every record in your table, trimming all extraneous space (either at the front or the end) of a varchar/nvarchar field:

UPDATE 
   [YourTableName]
SET
   [YourFieldName] = LTRIM(RTRIM([YourFieldName]))

(Strangely, SSIS (Sql Server Integration Services) does have a single TRIM function!)


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