2010-06-24 12 views
6

Sto recuperando da un bug in un sistema che ho creato dove non tenevo conto che IE genera Windows in stile newlines (\ r \ n) e altri browser generano newline in stile Unix (\ n) quando si pubblicano moduli HTML con aree di testo. Ora ho bisogno di convertire tutte le newline in stile Windows (\ r \ n) in newline in stile Unix (\ n) attraverso i campi varchar e nvarchar nel mio database SQL-Server.Come convertire le newline (sostituisci r n con n) attraverso tutti i campi varchar e nvarchar in un database

C'è un modo per scorrere tutte le tabelle/righe in T-SQL e sostituire le istanze di '\ r \ n' con '\ n' per i campi varchar e nvarchar?

EDIT: Penso che la sostituzione parte sarebbe qualcosa di simile

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

La parte difficile sta facendo questo in tutti i campi varchar e nvarchar.

risposta

9

Qualcosa di simile? È quindi possibile eseguire dinamicamente queste stringhe o semplicemente tagliare/incollare i risultati ed eseguirli in una finestra di query.

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

Fantastica idea, mi piace la creatività e la brevità. Grazie. Nota: ho aggiunto una condizione nella parte inferiore del modulo "dove sc.name in ('my_schema-1', 'my_schema_2', ...)" per limitarlo ai miei schemi. Ho anche aggiunto un punto e virgola alla fine della stringa nella prima riga per consentire di incollare ed eseguire i risultati in una finestra di query. –

1

È possibile scorrere le viste di sistema in INFORMATION_SCHEMA ed eseguire SQL dinamico per farlo. La vista rilevante dovrebbe essere INFORMATION_SCHEMA.COLUMNS.

Un approccio migliore è probabilmente quello di avere l'interfaccia utente con esso quando deve visualizzare i valori. Hai un metodo per evitare che valori come questi entrino nel DB in futuro?

Ecco alcuni esempi di codice che dovrebbe iniziare:

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 

Se si dispone di tabelle di grandi dimensioni, questo potrebbe richiedere molto tempo per l'esecuzione. Inoltre, in modo ottimale si aggiornerebbe ogni tabella una sola volta, mentre questa verrà aggiornata una volta per ogni colonna di stringhe nella tabella. Se lo stavo facendo su un grande database, avrei cambiato lo script per renderlo conto - ordina il tuo cursore secondo lo schema della tabella e il nome della tabella, aggiungi alla parte SET della stringa per ogni colonna nella tabella, solo EXEC (@ cmd) quando la tabella cambia e quindi ripristina la stringa SET.

+0

Sì, ho modificato il codice del client di sostituire \ r \ n \ n sul modulo di presentazione ... ma sto ancora lasciato con tutto il testo nel database che è stato generato fino ad ora. –

+0

+1 - grazie per aver pubblicato un codice T-SQL di esempio. –

Problemi correlati