Sql server 在SQLServer2008中修剪文本字符串

Sql server 在SQLServer2008中修剪文本字符串,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我在SQLServer2008数据库中有一个表。此表有一个名为“Name”的nvarchar(256)列。不幸的是,此字段中的值包含额外的空格。例如,名称“Bill”实际上存储为表中的“Bill” 我想更新此表中的所有记录以删除多余的空格。然而,我惊讶地发现SQL并没有TRIM函数 如何一次更新所有记录以删除多余的空间 谢谢大家! 您确实有一个和一个函数。您可以将它们组合在一起以获得所需的修剪功能 UPDATE Table SET Name = RTRIM(LTRIM(Name)) 您可以使用

我在SQLServer2008数据库中有一个表。此表有一个名为“Name”的nvarchar(256)列。不幸的是,此字段中的值包含额外的空格。例如,名称“Bill”实际上存储为表中的“Bill”

我想更新此表中的所有记录以删除多余的空格。然而,我惊讶地发现SQL并没有TRIM函数

如何一次更新所有记录以删除多余的空间

谢谢大家!

您确实有一个和一个函数。您可以将它们组合在一起以获得所需的修剪功能

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

您可以使用RTrim函数从右侧修剪所有空白。使用LTrim从左侧修剪所有空白。比如说

UPDATE Table SET Name = RTrim(Name)
或用于左右两侧的修剪

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

SQLServer没有TRIM函数,而是有两个。一个用于从字符串()的“前面”修剪空间,另一个用于从字符串()的“结尾”修剪空间

类似于以下内容的内容将更新表中的每条记录,修剪varchar/nvarchar字段的所有无关空间(在前面或后面):

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

(奇怪的是,SSIS(Sql Server集成服务)确实只有一个功能!)

我知道这是一个老问题,但我刚刚找到了一个解决方案,它使用LTRIM和RTRIM创建了一个用户定义的功能。它不处理字符串中间的双空格。 然而,解决方案是直截了当的:

没有答案是正确的

真正的答案是编辑列到NVARCHAR,您会发现自动修剪执行,但这段代码 更新表 集合名称=RTRIM(LTRIM(名称))
仅与Nvarchar一起使用,如果与CHAR或NCHAR一起使用,它将不起作用

此函数从左到右修剪字符串。它还从字符串中删除回车符,这是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甚至不修剪新行字符!):

如果对象ID(N'dbo.IsWhiteSpace',N'FN')不为NULL
删除函数dbo.IsWhiteSpace;
去
--确定单个字符是否为空白(根据UNICODE标准)。
创建函数dbo.IsWhiteSpace(@c NCHAR(1))返回位
开始
如果(@c为NULL),则返回NULL;
声明@WHITESPACE-NCHAR(31);
选择@WHITESPACE=''+NCHAR(13)+NCHAR(10)+NCHAR(9)+NCHAR(11)+NCHAR(12)+NCHAR(133)+NCHAR(160)+NCHAR(5760)+NCHAR(8192)+NCHAR(8193)+NCHAR(8194)+NCHAR(8196)+NCHAR(8198)+NCHAR(8199)+NCHAR(8200)+NCHAR(8201)+NCHAR(8233)+NCHAR(8239)+NCHAR(8288)+NCHAR(6158)+NCHAR(8203)+NCHAR(8204)+NCHAR(8205)+NCHAR(8288)+NCHAR(65279);
IF(CHARINDEX(@c,@WHITESPACE)=0)返回0;
返回1;
结束
去
如果对象ID(N'dbo.Trim',N'FN')不为空
下降功能dbo.Trim;
去
--删除所有前导和尾随空格字符。NULL被转换为空字符串。
创建函数dbo.Trim(@TEXT-NVARCHAR(MAX))返回NVARCHAR(MAX)
开始
--检查小字符串(空、0或1个字符)
如果@TEXT为空,则返回N';
声明@TEXTLENGTH INT=LEN(@TEXT);
如果@TEXTLENGTH<2开始
IF(@TEXTLENGTH=0)返回@TEXT;
IF(dbo.IsWhiteSpace(SUBSTRING(@TEXT,1,1))=1)返回“”;
返回@TEXT;
结束
--检查我们是否必须进行LTRIM/RTRIM
声明@SKIPSTART INT;
选择@SKIPSTART=dbo.IsWhiteSpace(子字符串(@TEXT,1,1));
声明@SKIPEND INT;
选择@SKIPEND=dbo.IsWhiteSpace(子字符串(@TEXT,@TEXTLENGTH,1));
声明@INDEX INT;
如果(@SKIPSTART=1)开始
如果(@SKIPEND=1)开始
--完全修剪
--确定起始空白长度
选择@INDEX=2;
WHILE(@INDEX<@TEXTLENGTH)BEGIN--提示:最后一个字符已被选中
--如果没有空白,则停止循环
如果(dbo.IsWhiteSpace(SUBSTRING(@TEXT,@INDEX,1))=0)中断;
--否则,将索引指定为@SKIPSTART
选择@SKIPSTART=@INDEX;
--增加字符索引
选择@INDEX=(@INDEX+1);
结束
--如果整个字符串为空白,则返回“”
IF(@SKIPSTART=(@TEXTLENGTH-1))返回“”;
--确定结束空白长度
选择@INDEX=(@TEXTLENGTH-1);
当(@INDEX>1)开始时
--如果没有空白,则停止循环
如果(dbo.IsWhiteSpace(SUBSTRING(@TEXT,@INDEX,1))=0)中断;
--否则增加@SKIPEND
选择@SKIPEND=(@SKIPEND+1);
--减少字符索引
选择@INDEX=(@INDEX-1);
结束
--返回修剪字符串
返回子字符串(@TEXT、@SKIPSTART+1、@TEXTLENGTH-@SKIPSTART-@skippend);
结束
--利特里姆
--确定起始空白长度
选择@INDEX=2;
WHILE(@INDEX<@TEXTLENGTH)BEGIN--提示:最后一个字符已被选中
--如果没有空白,则停止循环
如果(dbo.IsWhiteSpace(SUBSTRING(@TEXT,@INDEX,1))=0)中断;
--否则,将索引指定为@SKIPSTART
选择@SKIPSTART=@INDEX;
--增加字符索引
选择@INDEX=(@INDEX+1);
结束
--返回修剪字符串
返回子字符串(@TEXT、@SKIPSTART+1、@TEXTLENGTH-@SKIPSTART);
结束,否则开始
--RTRIM
如果(@SKIPEND=1)开始
--确定结束空白长度
选择@INDEX=(@TEXTLENGTH-1);
当(@INDEX>1)开始时
--如果没有空白,则停止循环
如果(dbo.IsWhiteSpace(SUBSTRING(@TEXT,@INDEX,1))=0)中断;
--否则增加@SKIPEND
选择@SKIPEND=(@SKIPEND+1);
--减少字符索引
选择@INDEX=(@INDEX-1);
结束
--返回修剪字符串
返回子字符串(@TEXT,1,@TEXTLENGTH-@SKIPEND);
结束
结束
--不修剪
返回@TEXT;
结束

GO
这个答案应该是可以接受的,因为
LTRIM(RTRIM(Name))
可能比
RTRIM(LTRIM(Name))
更有效。这取决于内部实现语言