2010-06-24 16 views
6

Me estoy recuperando de un error en un sistema que construí donde no tuve en cuenta que IE genera estilo Windows newlines (\ r \ n) y otros navegadores generan líneas nuevas de estilo Unix (\ n) al publicar formularios HTML con áreas de texto. Ahora necesito convertir todas las líneas nuevas de estilo de Windows (\ r \ n) a líneas nuevas de estilo Unix (\ n) a través de los campos varchar y nvarchar en mi base de datos SQL-Server.Cómo convertir líneas nuevas (reemplazar r n con n) en todos los campos varchar y nvarchar en una base de datos

¿Hay alguna forma de recorrer todas las tablas/filas en T-SQL y reemplazar instancias de '\ r \ n' con '\ n' para los campos varchar y nvarchar?

EDIT: Creo que el sustituir una parte sería algo así como

REPLACE(@fieldContents, CHAR(13)+CHAR(10), CHAR(10)) 

La parte difícil está haciendo esto en todos los campos varchar y nvarchar.

Respuesta

9

¿Algo como esto? A continuación, puede ejecutar dinámicamente estas cadenas o simplemente cortar/pegar los resultados y ejecutarlos en una ventana de consulta.

select 'update ' + sc.name + '.' + t.name + ' set ' + c.name + ' = replace(' + c.name + ', CHAR(13)+CHAR(10), CHAR(10))' 
from sys.columns c 
    inner join sys.systypes st 
     on c.system_type_id = st.xtype 
      and CHARINDEX('varchar', st.name) <> 0 
    inner join sys.tables t 
     on c.object_id = t.object_id 
    inner join sys.schemas sc 
     on t.schema_id = sc.schema_id 
+0

idea impresionante, me gusta la creatividad y la brevedad. Gracias. Nota: Agregué una condición en la parte inferior del formulario "donde sc.name in ('my_schema-1', 'my_schema_2', ...)" para restringirlo a mis propios esquemas. También agregué un punto y coma al final de la cadena en la primera línea para permitir pegar y ejecutar los resultados en una ventana de consulta. –

1

Puede recorrer las vistas del sistema en INFORMATION_SCHEMA y ejecutar SQL dinámico para hacerlo. La vista relevante debe ser INFORMATION_SCHEMA.COLUMNS.

Un mejor enfoque es probablemente tener su interfaz de usuario frente a él cuando tiene que mostrar los valores. ¿Tiene un método para evitar que valores como ese ingresen en el DB en el futuro?

He aquí algunos ejemplos de código que debe empezar:

DECLARE 
    @table_schema SYSNAME, 
    @table_name SYSNAME, 
    @column_name SYSNAME, 
    @cmd   VARCHAR(MAX) 

DECLARE cur_string_columns AS 
    SELECT 
     TABLE_SCHEMA, 
     TABLE_NAME, 
     COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.COLUMNS 
    WHERE 
     DATA_TYPE IN ('VARCHAR', 'CHAR') AND -- NVARCHAR and NCHAR? 
     CHARACTER_MAXIMUM_LENGTH > 1 

OPEN cur_string_columns 

FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @cmd = 'UPDATE 
    ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' 
SET ' + QUOTENAME(@column_name) + ' = REPLACE(' + QUOTENAME(@column_name) + ', CHAR(13) + CHAR(10), CHAR(10))' 

    EXEC(@cmd) 

    FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name 
END 

CLOSE cur_string_columns 

DEALLOCATE cur_string_columns 

Si tiene tablas grandes, esto podría tardar mucho tiempo para funcionar. Además, de forma óptima solo actualizaría cada tabla una vez, mientras que esto lo actualizará una vez para cada columna de cadena en la tabla. Si estuviera haciendo esto en una gran base de datos, cambiaría la secuencia de comandos para dar cuenta de eso - ordene su cursor por el esquema de la tabla y el nombre de la tabla, anexe a la parte SET de la cadena para cada columna en la tabla, solo EXEC (@ cmd) cuando la tabla cambia y luego reinicia tu cadena SET.

+0

Sí, he modificado el código de cliente para reemplazar \ r \ n \ n en el envío del formulario ... pero todavía me quedo con todo el texto en la base de datos que se ha generado hasta ahora. –

+0

+1 - gracias por publicar el código T-SQL de muestra. –

Cuestiones relacionadas