2010-08-20 144 views
6

我在数据库中有一列(SQL Server 2005),数据在最后有一个“\ 0”。在SQL Server中查询时,该字符不可见,也不“看起来”存在。当我查看我的C#代码时,角色就在那里。此人物在我们的网站上造成错误,我们需要将其从所有受影响的行中移除。Sql Server - 从数据中删除结束字符串字符“ 0”

是否有我可以写入的sql查询轻松地从受影响的所有记录中删除此字符?我可以获取所有受影响的记录,但我没有办法将记录更新为新值(没有“\ 0”)。

UPDATE: 这似乎工作:

Select * from TABLE 
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0 

所以:

Update TABLE 
SET naughtyField = SUBSTRING(naughtyField, 1, LEN(naughtyField) - 1) 
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0 
+0

那么,我该怎么做?威尔的回答是不正确的,但他的帮助使我找到了解决办法。 – Martin 2010-08-20 18:03:29

+0

如果Will将他关于使用'SUBSTRING(naughtyfield,1,LEN(naughtyfield)1)'的评论转移到他的答案中来解决问题吗? – 2010-08-20 18:06:19

+0

是的...虽然你的答案更优雅,但我不认为我可以在Prod数据库上创建一个功能,只是为了“快速修复”。文书工作太多。 – Martin 2010-08-20 18:08:14

回答

4

是否......

UPDATE mytable 
SET myfield = REPLACE(myfield, CHAR(0), '') 

...工作?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1)在那些空终止的作品 - 但要小心不要使用它在非NULL终止的字符串或您将丢失数据。

+0

从我的快速测试。 'create table #t(col varchar(50))insert into #t values('hgjh'+ char(0)+'gghg')UPDATE #t SET col = REPLACE(col,char(0),'') – 2010-08-20 17:33:56

+0

LEN(naughtyfield)是否返回包含MSSQL中null结束符的长度? – 2010-08-20 17:36:03

+0

是的,Len('列中的字符串')= X,Len(naughtyfield)= X + 1 – Martin 2010-08-20 17:37:56

10

UPDATE TBL SET列= REPLACE(COL,CHAR(0), '')

编辑:只为赎回这个答案!可能对字符串嵌入的更一般情况有用。

CREATE FUNCTION dbo.RemoveNullChars 
(
    @string NVARCHAR(MAX) 
) 
RETURNS NVARCHAR(MAX) WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
DECLARE @Result NVARCHAR(MAX) 
SET @Result = '' 

DECLARE @counter INT 

SET @counter = 0 

WHILE (@counter <= LEN(@string)) 
    BEGIN 
    IF UNICODE(SUBSTRING(@string,@counter,1)) <> 0 
     SET @Result = @Result + SUBSTRING(@string,@counter,1) 
    SET @counter = @counter + 1  
    END 
RETURN @Result 
END 

然后

UPDATE tbl SET col = dbo.RemoveNullChars (col) 
+0

谢谢!做得好! – dyatchenko 2016-09-29 22:33:10

1

我遇到了这个问题,最近修复了它。它似乎总是在一个字符串的末尾(因为它是一个终结符字符)。

而且,因为它不是一个空白,它会导致RTRIM不上有多余的尾随空格领域工作(例如 '加州                        \ 0')。

去除最安全的方法是(0)向子串(“\ 0”或字符串长度的最后一个索引,如果“\ 0”未找到)

这里是我如何安全地删除它我的情况

substring([field], 0, (LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1)) 

这里是删除它,也修剪额外的空间。

ltrim(rtrim(substring([field], 0, (LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1))))