Sql Server - 从数据中删除结束字符串字符“\ 0”

时间:2010-08-20 17:26:24

标签: sql sql-server database sql-server-2005

我在数据库(SQL Server 2005)中有一个列,其末尾的数据为“\ 0”。在SQL Server中查询时,此字符不可见,并且“似乎”不存在。当我查看我的C#代码时,角色就在那里。此字符在我们的网站上导致错误,我们需要从所有受影响的行中删除它。

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

更新: 这似乎有效:

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

3 个答案:

答案 0 :(得分:10)

<击>     UPDATE tbl SET col = REPLACE(col,char(0),'')

编辑:只是为了兑换这个答案!对于字符串嵌入\0 s。

的更一般情况,可能会有用
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)

答案 1 :(得分:4)

...是否

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

...工作?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1)在那些以null结尾的字段上工作 - 但要注意不要在非NULL终止的字符串上使用它,否则你将丢失数据。

答案 2 :(得分:2)

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

另外,因为它不是空格,所以它会导致rtrim不能在具有额外尾随空格的字段上工作(例如'California \ 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 ) ) ))