2010-08-20 4 views
6

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

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 

So:

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

Also, wie mache ich das? Wills Antwort ist nicht korrekt, aber seine Hilfe hat mich zu meiner Lösung geführt. – Martin

+0

Wenn Will seinen Kommentar über die Verwendung von SUBSTRING (naughtyfield, 1, LEN (naughtyfield) - 1) in seine Antwort bewegt, die das Problem lösen sollte? –

+0

Ja ... obwohl Ihre Antwort eleganter ist, glaube ich nicht, dass ich nur für diese "schnelle Lösung" eine Funktion in der Prod-Datenbank erstellen kann. Zu viel Papierkram. – Martin

Antwort

4

Does ...

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

... arbeiten?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) auf die Felder, die Null-terminierte Arbeiten sind - aber seien Sie vorsichtig, nicht auf nicht-NULL terminierte Strings zu verwenden, oder Sie werden Daten verlieren.

+0

Nein.Von meinem schnellen Test. 'Tabelle #t (col VARCHAR (50)) Einfügen in #t VALUES ('hgjh' + char (0) + 'gghg') UPDATE #t SET col = replace (col, char (0), '')'Erstelle –

+0

Gibt LEN (naughtyfield) die Länge einschließlich des Nullterminators in MSSQL zurück? –

+0

Ja, Len ('Die Zeichenfolge in der Spalte') = X, Len (naughtyfield) = X + 1 – Martin

10

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

Edit: Nur um diese Antwort einzulösen! Könnte nützlich sein für den allgemeineren Fall, dass eine Zeichenfolge \0 s eingebettet hat.

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) 
+0

Danke! Gut gemacht! – dyatchenko

1

Ich habe dieses Problem konfrontiert und es vor kurzem behoben. Es scheint, dass es immer am Ende einer Zeichenkette ist (da es ein Terminatorzeichen ist).

Auch, weil es nicht ein weißer Raum ist, verursacht es rtrim nicht auf den Feldern zu arbeiten, die zusätzliche hintere Räume haben (zum Beispiel 'California                         \ 0').

Der sicherste Weg, diese zu entfernen, ist von (0) bis substring (dem letzten Index der ‚\ 0‘ OR String-Länge, wenn ‚\ 0‘ nicht gefunden)

Hier ist, wie ich entfernte es sicher in mein Fall

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

Und hier ist das Entfernen und auch das Zuschneiden der zusätzlichen Leerzeichen.

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