在SQL Server 2008中修剪文本string

我有一个SQL Server 2008数据库中的表。 该表有一个名为“Name”的nvarchar(256)列。 不幸的是,这个领域的价值包括额外的空间。 例如“Bill”这个名字实际上是作为“Bill”存储在表格中的。

我想更新此表中的所有logging以删除多余的空格。 但是,我惊讶地发现SQL没有TRIMfunction。

如何一次更新所有logging以删除多余的空格?

谢谢!

你有一个RTRIM和一个LTRIMfunction。 你可以结合他们来获得你想要的修剪function。

 UPDATE Table SET Name = RTRIM(LTRIM(Name)) 

您可以使用RTrim函数来修剪右侧的所有空白。 使用LTrim来修剪左侧的所有空白。 例如

 UPDATE Table SET Name = RTrim(Name) 

或者左右修剪

 UPDATE Table SET Name = LTrim(RTrim(Name)) 

SQL Server没有TRIMfunction,而是有两个。 一个用于从string“前”( LTRIM )专门修剪空格,另一个用于从string( RTRIM )的“结尾”修剪空格。

类似下面的内容会更新表中的每个logging,修剪varchar / nvarchar字段的所有无用空间(无论是在前端还是末端):

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

(奇怪的是,SSIS(Sql Server Integration Services) 确实有一个TRIMfunction!)

我知道这是一个老问题,但我刚刚find一个解决scheme,它使用LTRIM和RTRIM创build用户定义的函数。 它不处理string中间的双重空格。

然而,解决scheme很简单:

用户定义的修剪function

没有答案是真的

真正的答案是编辑列到NVARCHAR,你发现自动修剪执行,但这个代码更新表SET名称= RTRIM(LTRIM(名称))使用它只与Nvarchar如果使用它与CHAR或NCHAR它不会工作

该函数从左侧和右侧修剪一个string。 它还从string中删除回车符,这是LTRIM和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 

我会尝试这样一个Trim函数,它考虑到由Unicode标准定义的所有空白字符(LTRIM和RTRIM甚至不修剪换行字符):

 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