2010-08-20 11 views
6

Tengo una columna en la base de datos (SQL Server 2005) que tiene datos con un "\ 0" al final. Al realizar consultas en SQL Server, este carácter no es visible y "parece" que no existe. Cuando miro en mi código C#, el personaje está allí. Este personaje está causando un error en nuestro sitio web, y lo necesitamos eliminar de todas las filas afectadas.Servidor sql - Eliminar el carácter de cadena final " 0" De los datos

¿Existe una consulta SQL que pueda escribir para eliminar fácilmente este carácter de todos los registros que se ven afectados? Puedo obtener todos los registros afectados, pero no tengo una forma de actualizar el registro a un nuevo valor (sin el "\ 0").

ACTUALIZACIÓN: Esto parece funcionar:

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

Así:

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

Entonces, ¿cómo puedo hacer esto? La respuesta de Will no es correcta, pero su ayuda me llevó a mi solución. – Martin

+0

Si Will mueve su comentario sobre el uso de 'SUBSTRING (naughtyfield, 1, LEN (naughtyfield) - 1)' en su respuesta que debería resolver el problema? –

+0

Sí ... aunque su respuesta es más elegante, no creo que pueda crear una función en la base de datos Prod solo para esta "solución rápida". Demasiado papeleo. – Martin

Respuesta

4

hace ...

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

... trabajar?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) en aquellos campos que son trabajos terminados en nulo, pero tenga cuidado de no utilizarlo en cadenas terminadas que no sean NULL o perderá datos.

+0

No.De mi prueba rápida. 'create table #t (col varchar (50)) insertar en valores #t ('hgjh' + char (0) + 'gghg') ACTUALIZAR #t SET col = REPLACE (col, char (0), '')' –

+0

¿LEN (naughtyfield) devuelve la longitud incluyendo el terminador nulo en MSSQL? –

+0

Sí, Len ('La cadena en la columna') = X, Len (naughtyfield) = X + 1 – Martin

10

ACTUALIZACIÓN TBL SET col = SUSTITUIR (col, char (0), '')

Editar: ¡Solo para canjear esta respuesta! Puede ser útil para el caso más general que una cadena ha incrustado \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 

Entonces

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

Gracias! ¡Buen trabajo! – dyatchenko

1

Me enfrenté a este problema y lo arreglé recientemente. Parece que siempre está al final de una cadena (ya que es un carácter terminador).

Además, debido a que no es un espacio en blanco, no provoca rtrim para trabajar en campos que tienen espacios finales adicionales (por ejemplo, 'California                         \ 0').

La forma más segura de eliminar esta es la subcadena a partir de (0) a (el último índice de longitud '\ 0' O cadena si '\ 0' no encontrado) se

Aquí es cómo eliminar de forma segura en mi caso

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

Y aquí está quitándolo y también recortando los espacios adicionales.

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