2010-08-20 12 views
6

Mam kolumnę w bazie danych (SQL Server 2005), która ma dane z "\ 0" na końcu. Podczas wysyłania zapytań w SQL Server ta postać nie jest widoczna i "nie wydaje się" istnieć. Kiedy patrzę w mój kod C#, postać jest tam. Ta postać powoduje błąd w naszej witrynie i musimy go usunąć ze wszystkich powiązanych wierszy.Serwer Sql - Usuń końcowy ciąg znaków " 0" z danych

Czy istnieje kwerenda sql można napisać, aby łatwo usunąć ten znak ze wszystkich rekordów, których dotyczy? Mogę uzyskać wszystkie rekordy, których dotyczy ten problem, ale nie mam sposobu na zaktualizowanie rekordu do nowej wartości (bez "\ 0").

UPDATE: To wydaje się działać:

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

Więc:

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

Jak to zrobić? Odpowiedź Willa nie jest prawidłowa, ale jego pomoc doprowadziła mnie do mojego rozwiązania. – Martin

+0

Jeśli Will przesunie swój komentarz dotyczący użycia 'SUBSTRING (naughtyfield, 1, LEN (naughtyfield) - 1)' w swojej odpowiedzi, która powinna rozwiązać problem? –

+0

Tak ... chociaż twoja odpowiedź jest bardziej elegancka, nie sądzę, że mogę utworzyć funkcję w bazie danych Prod tylko dla tej "szybkiej naprawy". Za dużo papierkowej roboty. – Martin

Odpowiedz

4

Czy ...

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

... działa?

w tych polach, które są zakończone znakiem NUL - ale należy uważać, aby nie używać go w łańcuchach zakończonych niepustą NULL lub utracisz dane.

+0

Nie.Z mojego szybkiego testu. 'create table #t (col varchar (50)) wstaw do #t wartości ('hgjh' + char (0) + 'gghg') UPDATE #t SET col = REPLACE (col, char (0), '') –

+0

Czy LEN (naughtyfield) zwraca długość zawierającą terminator o wartości null w MSSQL? –

+0

Tak, Len ("Ciąg w kolumnie") = X, Len (niegrzeczny) = X + 1 – Martin

10

UPDATE tbl SET kolumna = Replace (kol, char (0), '')

Edycja: Tylko w celu realizacji tej odpowiedzi! Może być przydatny dla bardziej ogólnego przypadku, w którym ciąg znaków został osadzony w postaci \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 

Następnie

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

Dzięki! Dobra robota! – dyatchenko

1

Napotykałem ten problem i naprawiłem go niedawno. Wydaje się, że zawsze jest na końcu ciągu znaków (ponieważ jest to znak końca).

Ponadto, ponieważ to nie jest białe znaki, nie powoduje RTRIM do pracy na polach, które mają dodatkowe spacje (np 'California                         \ 0').

Najbezpieczniejszym sposobem na usunięcie tego celu jest podciąg z (0) do (ostatniego indeksu „\ 0” lub ciąg długości czy „\ 0” nie znaleziono)

Oto jak bezpiecznie usunąć go w mój przypadek:

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

Tutaj usunięto go, a także przycinano dodatkowe przestrzenie.

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