代码之家  ›  专栏  ›  技术社区  ›  Martin

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

  •  7
  • Martin  · 技术社区  · 14 年前

    我是否可以编写一个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 回复  |  直到 14 年前
        1
  •  4
  •   Will A    14 年前

    做。。。

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

    …工作?

    SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) 在那些以null结尾的字段上是有效的-但是小心不要在非null结尾的字符串上使用它,否则会丢失数据。

        2
  •  10
  •   Martin Smith    14 年前

    UPDATE tbl SET col=REPLACE(列,字符(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)
    
        3
  •  2
  •   H7O    10 年前

    我最近解决了这个问题。它似乎总是在字符串的末尾(因为它是一个终止符字符)。

    另外,因为它不是空白,所以它会导致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 ) ) ))