2012-05-18 7 views
10

Ho una colonna che credo sia stata dichiarata in modo errato. Contiene dati e non voglio perdere i dati.Modifica di un tipo di colonna con dati, senza cancellare i dati

Desidero modificare la definizione da varchar (max) a varchar (un numero intero). Avevo l'impressione che non potessi semplicemente alterare il tipo di colonna?

È il metodo migliore per creare una colonna temp, "column2", trasferire i dati in questa colonna, dalla colonna con il tipo problematico, eliminare la colonna del problema e quindi rinominare la colonna temp nella colonna problematica originale?

In tal caso, come faccio a copiare i valori dalla colonna del problema alla nuova colonna?

MODIFICA: per chiunque abbia lo stesso problema, è possibile utilizzare solo le istruzioni ALTER.

risposta

16

Fintanto che i tipi di dati sono in qualche modo "correlati" - sì, è assolutamente possibile farlo.

È possibile modificare un INT in un BIGINT - l'intervallo di valori del secondo tipo è maggiore, quindi non si corre il rischio di "perdere" alcun dato.

È possibile cambiare un VARCHAR(50) in un VARCHAR(200) - ancora, i tipi sono compatibili, le dimensioni si stanno ingrandendo - nessun rischio di troncare nulla.

In pratica, basta

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

o qualsiasi altra cosa. Finché non hai una stringa più lunga di quei 200 caratteri, starai bene. Non sei sicuro di cosa succederebbe se avessi stringhe più lunghe - la conversione fallirà con un errore, o andrà avanti e ti dirà che alcuni dati potrebbero essere stati troncati. Quindi suggerisco di provare prima questo su un copia dei dati :-)

Si diventa un po 'più complicato, se avete bisogno di cambiare un VARCHAR a un INT o qualcosa del genere -, ovviamente, se si dispone di valori di colonna non "adattarsi" al nuovo tipo, la conversione fallirà. Ma anche l'utilizzo di una nuova colonna "temporanea" separata non risolverà questo problema: è necessario gestire questi casi "non compatibili" in qualche modo (ignorarli, lasciare NULL lì, impostarli su un valore predefinito - qualcosa).

Inoltre, il passaggio da VARCHAR a NVARCHAR può risultare complicato se si dispone ad es. caratteri non europei occidentali - potresti perdere determinate voci in fase di conversione, poiché non possono essere rappresentate nell'altro formato, o la conversione "predefinita" da un tipo all'altro non funziona come previsto.

+1

Funziona per 'CHAR' su' VARCHAR' e riduce persino il riempimento. –

+0

Ho problemi a passare da VARCHAR a TEXT, qualche idea? – Murilo

+1

@Murilo: poiché 'TEXT' è già ** deprecato ** e sarà rimosso molto presto, vorrei ** NON ** modificare una colonna * in * tipo di dati' TEXT' - usare 'VARCHAR (MAX)' invece, se hai davvero bisogno di più di 8000 caratteri di dati –

0

aggiungere una colonna temp2 con tipo varchar (NN), eseguire update tbl set column2 = column, verificare se si verificano errori; se tutto è a posto, modifica la colonna originale, copia i dati e rimuovi column2.

1

Calcolare la lunghezza massima della memoria dati int quella colonna di quella tabella.

Select max(len(fieldname)) from tablename 

Ora è possibile ridurre la dimensione di tale colonna fino al risultato ottenuto nella query precedente.

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

Questo primo passo è necessario se guardi lo SCHEMA del tavolo in primo luogo? –

+0

si desidera ridurre un campo varchar, quindi questo dovrebbe essere il primo passo. –

+1

Mi scuso. Ho letto male e ho pensato che si stava espandendo, non restringendosi. –

Problemi correlati