2010-07-26 30 views
5

Tengo una tabla con un símbolo erróneo (' ') en varias filas en una columna.SQL Server 2008: reemplazar cadena

El script TSQL a continuación no funciona.

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...') 
FROM tblSacrifices S 

La columna en cuestión tiene el tipo de datos de nvarchar (230) y permite entradas nulas.

Los datos provienen de un archivo csv convertido desde Excel y d a través de una aplicación de Visual Studio Windows. Los datos originalmente eran '...', pero creo que quizás Word/Excel clasificó esto como un personaje (en lugar de 3 por separado '.'). Cuando mi aplicación leyó la cadena original del archivo CSV, (sin querer) reemplazó el '...' por ' ' antes de enviar los datos a la base de datos.

por favor ayuda

+0

¿Cuál es el tipo de datos de la columna afectada? –

+0

Hola Ed es nvarchar (230).Además, la columna permite nulos (si eso hace la diferencia). – Chris

+5

¿Está absolutamente seguro de que el símbolo en los datos es el diamante negro con el signo de interrogación y no que solo se muestra como tal debido a un problema de juego de caracteres? ¿O tal vez al ser un personaje no visualizable en la fuente con la que lo estás viendo? –

Respuesta

5

Lo he entendido. Gracias a todos por su ayuda.

Tuve que convertir a binario. Todos los caracteres Unicode por encima de 65500 requieren esto como el modo normal REEMPLAZAR() no funciona.

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, nchar(65533) COLLATE Latin1_General_BIN, '...') 
FROM tblSacrifices S 
+0

Está reemplazando un personaje por tres, por lo que el resultado puede ser más largo. ¿No puedes simplemente usar el carácter único elipsis 'N '...' '(de lo contrario, creo que necesitarás agrandar la columna o usar' LEFT' para truncar o' SET ANSI_WARNINGS OFF' para ignorar el error y permitir el truncamiento. –

+0

Veo gracias a Martin. Acabo de extender los caracteres máximos permitidos para la columna, ya que no quería perder ninguno de los datos. – Chris

1

intentar ser explícito de que el carácter que está buscando es nvarchar mediante el uso de una N que lleva:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, N'�', '...') 
FROM tblSacrifices S 

ACTUALIZACIÓN base a la discusión de la respuesta de Martín:

No tengo ninguna razón para pensar que esto es funcionalmente diferente de lo que he publicado anteriormente, pero podría intentarlo:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(65533), '...') 
FROM tblSacrifices S 

ACTUALIZACIÓN 2

no he leído el código de Martin cerca lo suficiente antes de actualizar mi respuesta. Debido a que utiliza la función de servidor de SQL UNICODE para mostrar los resultados, el carácter de error de hecho está enmascarado por 65533.

Ver here para los detalles de Unicode 65533 Char - es el valor Unicode genérico de datos erróneos.

+0

Gracias Ed, pero esto tampoco funciona. Por favor, vea mi respuesta a Martin en mi publicación original. Alguna información adicional puede ayudar a responder la pregunta. Gracias de nuevo – Chris

+0

+1 por Update2. Alguna idea si hay una manera alternativa? –

+0

Gracias a los dos. Como probablemente ya sabes, eso tampoco funciona. ¿Hay alguna manera de eliminar los "datos incorrectos" y luego reemplazarlos, pero entonces no sabríamos dónde ponerlos? ¡Estoy atascado! – Chris

1

Editar:

siguiente actualización en los comentarios tratan REPLACE(S.Offering_Details, nchar(65533), '...')

respuesta original:

Esto podría ayudar a solucionar problemas que

declare @s nvarchar(230) 

SELECT @s= ProblemCol 
FROM YourTable 
WHERE ProblemRowId = X; 


set @s = N'日本国'; /*For testing*/ 


WITH N AS 
    (SELECT 1 idx, 
      LEFT(@s,1)ch, 
      UNICODE(LEFT(@s,1)) C 

    UNION ALL 

    SELECT idx+1, 
      SUBSTRING(@s,idx+1,1), 
      UNICODE(SUBSTRING(@s,idx+1,1)) C 
    FROM N 
    WHERE idx<LEN(@s) 
    ) 


    SELECT idx, ch,C 
    FROM  N  

Resultado de la prueba

idx   ch C 
----------- ---- ----------- 
1   日 26085 
2   本 26412 
3   国 22269 
+0

Por cierto, "Results to text" en el estudio de administración parece manejar estos caracteres mejor que los resultados en la cuadrícula, al menos con mi configuración. –

+0

Gracias Martin, he puesto los resultados en la publicación original. Son lo mismo que el tuyo. Sin embargo, no estoy seguro de lo que significa esto. – Chris

+0

@Chris - Sí, lo siento, quise que eliminaras esta línea 'set @s = N '日本国';/* Para probar */'fue solo para dar una demostración de lo que devolvería. Una vez que descubra los códigos de caracteres problemáticos, podría reemplazarlos por 'nchar (26085)' o lo que sea, si solo desea deshacerse de ellos. –

0

utilizar la función Unicode como este, que podría ayudarle a:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...') 
FROM tblSacrifices S where S.Offering_Details like '%�%'