2011-08-31 13 views
6

Ho bisogno di un semplice ridimensionamento di una colonna da VARCHAR(36) a VARCHAR(40).È brutto usare ALTER TABLE per ridimensionare una colonna varchar con una dimensione maggiore?

Se si tenta di utilizzare SQL Server Enterprise Manager, lo script generato genera effettivamente una nuova tabella con la nuova struttura, inserendo tutti i dati dalla tabella esistente, eliminando la tabella esistente, rinominando la nuova tabella e ricreare qualsiasi indice.

Se si legge la documentazione (e molte risorse online tra cui SO), è possibile utilizzare un'istruzione ALTER per il ridimensionamento.

Il ALTER influisce sul modo in cui i dati vengono memorizzati in alcun modo? Indici? Statistiche? Voglio evitare colpi di prestazioni a causa di questa modifica dovuta al fatto che il tavolo può diventare grande.

risposta

12

Basta usare ALTER TABLE. SSMS è un po ', ehm, stupido a volte

Avrai bisogno di eliminare e ricreare i vincoli dipendenti (FK, unico nel suo genere, indice, verificare ecc)

Tuttavia, questo è solo un cambiamento di metadati e sarà molto veloce per qualsiasi tabella delle dimensioni (a meno che tu non modifichi NOT NULL in NULL o varchar in nvarchar o simili)

+0

non sarà questo spostare il campo fino alla fine delle righe sulle pagine però? Ho pensato che potesse creare indicatori e divisioni di pagina. – JNK

+0

@JNK: nah. nessun movimento di dati avverrà perché nessuno è necessario – gbn

+0

@JNK Questo è esattamente il motivo per cui stavo facendo la domanda, ma sembra che non sia vero. – Sumo

4

No, ALTER TABLE (http://msdn.microsoft.com/de-de/library/ms190273.aspx) è il modo in cui Microsoft intendeva fare questo tipo di modifica.

E se non si aggiungono opzioni extra al comando, nessun indice o statistica dovrebbe essere danneggiato. Non viene data neanche una possibilità di perdita di dati, perché stai semplicemente ingrandendo la colonna. Tutto dovrebbe andare bene.

2

Le modifiche alla struttura del database non devono MAI essere eseguite utilizzando SSMS in un ambiente di porduction per il solo motivo per cui sei stato richiamato. Può distruggere le prestazioni in un grande tavolo. La tabella ALTER è il metodo preferito, è più veloce e può essere archiviata nel controllo del codice sorgente come una modifica da spingere al pungolo dopo il test.

+2

È possibile utilizzare SSMS per * eseguire lo script DDL SQL * - no? :-) –

+0

sì. Ho fatto phse che wqrong, non dovresti usare la GUI per farlo. – HLGEM

2

In seguito dovrebbe essere il modo migliore per gestire questa

IF EXISTS (SELECT 1 
       FROM  INFORMATION_SCHEMA.COLUMNS 
       WHERE TABLE_NAME = '<tablename>' 
       AND  COLUMN_NAME = '<field>') 
    BEGIN 
     ALTER TABLE <tablename> ALTER COLUMN [<field>] varchar(xxxx) null 
    END 
ELSE 
Problemi correlati