7 Stimmen

Sql Server - Zeichen am Ende der Zeichenkette entfernen " \0 " Von Daten

Ich habe eine Spalte in der Datenbank (SQL Server 2005), die Daten mit einem " \0 " am Ende. Bei der Abfrage in SQL Server ist dieses Zeichen nicht sichtbar und "scheint" nicht zu existieren. Wenn ich in meinem C#-Code nachsehe, ist das Zeichen da. Dieses Zeichen verursacht einen Fehler auf unserer Website, und wir müssen es aus allen betroffenen Zeilen entfernen.

Gibt es eine Sql-Abfrage, die ich schreiben kann, um dieses Zeichen aus allen betroffenen Datensätzen zu entfernen? Ich kann alle betroffenen Datensätze abrufen, aber ich habe keine Möglichkeit, den Datensatz auf einen neuen Wert zu aktualisieren (ohne das " \0 ").

UPDATE: Dies scheint zu funktionieren:

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

Also:

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

11voto

Martin Smith Punkte 417623

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

Edit: Nur um diese Antwort einzulösen! Könnte für den allgemeineren Fall nützlich sein, dass eine Zeichenkette eingebettet ist \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

Dann

 UPDATE tbl SET col = dbo.RemoveNullChars (col)

3voto

Will A Punkte 24412

Hat...

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

...arbeiten?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) auf diese Felder, die mit Null beendet sind, funktioniert - aber seien Sie vorsichtig, dass Sie es nicht auf nicht NULL-beendete Zeichenketten anwenden, sonst gehen Daten verloren.

2voto

H7O Punkte 599

Ich hatte dieses Problem und habe es kürzlich behoben. Es scheint, dass es immer am Ende einer Zeichenfolge steht (da es ein Abschlusszeichen ist).

Da es sich nicht um ein Leerzeichen handelt, funktioniert rtrim auch nicht bei Feldern mit zusätzlichen Leerzeichen am Ende (z. B. 'California \0 ').

Der sicherste Weg, dies zu entfernen, ist eine Teilzeichenkette von (0) bis (zum letzten Index von ' \0 ' OR Länge der Zeichenfolge, wenn ' \0 ' nicht gefunden)

So habe ich ihn in meinem Fall sicher entfernt

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

Und hier wird sie entfernt und auch die zusätzlichen Leerzeichen werden abgeschnitten.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X