ALTER TABLE (Transact-SQL)

Modifica una definizione di tabella mediante la modifica, l'aggiunta o l'eliminazione di colonne e vincoli, la riassegnazione di partizioni, la disabilitazione o l'abilitazione di vincoli e trigger.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
        [ type_schema_name. ] type_name [ ( { precision [ , scale ] 
            | max | xml_schema_collection } ) ] 
        [ COLLATE collation_name ] 
        [ NULL | NOT NULL ] [ SPARSE ]

    | {ADD | DROP } 
        { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
    } 
        | [ WITH { CHECK | NOCHECK } ]

    | ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
      | <column_set_definition> 
    } [ ,...n ]

    | DROP 
     {
         [ CONSTRAINT ] 
         { 
              constraint_name 
              [ WITH 
               ( <drop_clustered_constraint_option> [ ,...n ] ) 
              ] 
          } [ ,...n ]
          | COLUMN 
          {
              column_name 
          } [ ,...n ]
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT 
        { ALL | constraint_name [ ,...n ] } 

    | { ENABLE | DISABLE } TRIGGER 
        { ALL | trigger_name [ ,...n ] }

    | { ENABLE | DISABLE } CHANGE_TRACKING 
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]

    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table 
        [ PARTITION target_partition_number_expression ]

    | SET ( FILESTREAM_ON = { partition_scheme_name | filegroup | 
                "default" | "NULL" } )

    | REBUILD 
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ] 
      | [ PARTITION = partition_number 
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]

    | <table_option>

    | <filetable_option>

}
[ ; ]

-- ALTER TABLE options


<column_set_definition> ::= 
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<drop_clustered_constraint_option> ::=  
    { 
        MAXDOP = max_degree_of_parallelism 
      | ONLINE = {ON | OFF }
      | MOVE TO { partition_scheme_name ( column_name ) | filegroup
          | "default" }
    }
<table_option> ::=
    {
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    }

<filetable_option> ::=
    {
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]
    }
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE} }
}

Argomenti

  • database_name
    Nome del database in cui è stata creata la tabella.

  • schema_name
    Nome dello schema a cui appartiene la tabella.

  • table_name
    Nome della tabella che si desidera modificare. Se la tabella non è inclusa nel database corrente o nello schema di proprietà dell'utente corrente, è necessario specificare in modo esplicito il database e lo schema.

  • ALTER COLUMN
    Specifica che la colonna denominata deve essere cambiata o modificata.

    Non è consentita la modifica delle colonne seguenti:

    • Colonne con tipo di dati timestamp.

    • Colonna ROWGUIDCOL della tabella.

    • Colonne calcolate o utilizzate in una colonna calcolata.

    • Colonne utilizzate in statistiche generate dall'istruzione CREATE STATISTICS. Fanno eccezione le colonne per cui il tipo di dati è varchar, nvarchar o varbinary oppure è rimasto invariato e le nuove dimensioni sono uguali o maggiori di quelle precedenti oppure si tratta di colonne modificate da non Null a Null. È innanzitutto necessario rimuovere le statistiche utilizzando l'istruzione DROP STATISTICS. Le statistiche generate in modo automatico da Query Optimizer vengono eliminate automaticamente da ALTER COLUMN.

    • Colonne utilizzate in un vincolo PRIMARY KEY o [FOREIGN KEY] REFERENCES.

    • Colonne utilizzate in un vincolo CHECK o UNIQUE. È tuttavia possibile modificare la lunghezza di una colonna a lunghezza variabile utilizzata in un vincolo CHECK o UNIQUE.

    • Colonne associate a una definizione DEFAULT. Se il tipo di dati non viene modificato, è tuttavia possibile modificare la lunghezza, la precisione o la scala di una colonna.

      Il tipo di dati di colonne text, ntext e image può essere modificato solo nei modi seguenti:

      • text in varchar(max), nvarchar(max) o xml

      • ntext in varchar(max), nvarchar(max) o xml

      • image in varbinary(max)

      Alcune modifiche del tipo di dati possono comportare la modifica dei dati. La sostituzione, ad esempio, del tipo di dati nchar o nvarchar di una colonna in char o varchar può causare la conversione di caratteri estesi. Per ulteriori informazioni, vedere CAST e CONVERT (Transact-SQL). La riduzione della precisione o della scala di una colonna può causare il troncamento dei dati.

      Non è possibile modificare il tipo di dati di una colonna di una tabella partizionata.

    Il tipo di dati di colonne incluse in un indice non può essere modificato. Fanno eccezione le colonne per cui il tipo di dati è varchar, nvarchar o varbinary e le nuove dimensioni sono uguali o maggiori di quelle precedenti.

    Una colonna inclusa in un vincolo di chiave primaria non può essere modificata da NOT NULL a NULL.

  • column_name
    Nome della colonna da modificare, aggiungere o eliminare. column_name può essere composto da un massimo di 128 caratteri. Nel caso di nuove colonne create con il tipo di dati timestamp, è possibile omettere column_name. Se per una colonna con tipo di dati timestamp non è specificato alcun valore column_name, viene utilizzato il nome timestamp.

  • [ type_schema_name**.** ] type_name
    Nuovo tipo di dati per la colonna modificata o tipo di dati per la colonna aggiunta. type_name non può essere specificato per colonne esistenti di tabelle partizionate. I valori possibili di type_name sono i seguenti:

    • Tipo di dati di sistema di SQL Server.

    • Tipo di dati alias basato su un tipo di dati di sistema di SQL Server. Per consentirne l'utilizzo in una definizione di tabella, i tipi di dati alias vengono creati con l'istruzione CREATE TYPE.

    • Tipo definito dall'utente (UDT) di .NET Framework e lo schema a cui appartiene. I tipi definiti dall'utente (UDT) di .NET Framework devono essere creati con l'istruzione CREATE TYPE prima che sia possibile utilizzarli in una definizione di tabella.

    Di seguito sono riportati i criteri per type_name di una colonna modificata:

    • Il tipo di dati precedente deve supportare la conversione implicita nel nuovo tipo di dati.

    • type_name non può essere di tipo timestamp.

    • I valori predefiniti di ANSI_NULL sono sempre attivi per ALTER COLUMN. Se non diversamente specificato, la colonna ammette i valori Null.

    • Il riempimento con ANSI_PADDING è sempre attivo per ALTER COLUMN.

    • Se la colonna modificata è una colonna Identity, il tipo di dati di new_data_type deve supportare la proprietà Identity.

    • L'impostazione corrente di SET ARITHABORT viene ignorata. Il funzionamento di ALTER TABLE presume l'impostazione di ARITHABORT su ON.

    [!NOTA]

    Se la clausola COLLATE è omessa, la modifica del tipo di dati di una colonna causerà la modifica delle regole di confronto predefinite del database.

  • precision
    Precisione del tipo di dati specificato. Per ulteriori informazioni sui valori di precisione validi, vedere Precisione, scala e lunghezza (Transact-SQL).

  • scale
    Scala per il tipo di dati specificato. Per ulteriori informazioni sui valori di scala validi, vedere Precisione, scala e lunghezza (Transact-SQL).

  • max
    Viene applicato solo ai tipi di dati varchar, nvarchar, e varbinary per l'archiviazione di 2^31-1 byte di dati di tipo carattere, binario e Unicode.

  • xml_schema_collection
    Viene applicato solo al tipo di dati xml per l'associazione di uno XML Schema con il tipo. Prima di tipizzare una colonna xml in una raccolta di schemi, è necessario creare la raccolta nel database utilizzando CREATE XML SCHEMA COLLECTION.

  • COLLATE < collation_name >
    Specifica le nuove regole di confronto per la colonna modificata. Se viene omesso, alla colonna vengono assegnate le regole di confronto predefinite del database. È possibile utilizzare nomi di regole di confronto di Windows o SQL. Per un elenco e ulteriori informazioni, vedere Windows_collation_name (Transact-SQL) e Nome delle regole di confronto di SQL Server (Transact-SQL).

    La clausola COLLATE consente di modificare le regole di confronto solo delle colonne del tipo di dati char, varchar, nchar e nvarchar. Per modificare le regole di confronto di una colonna con un tipo di dati alias definito dall'utente, è necessario eseguire istruzioni ALTER TABLE separate in modo da modificare il tipo di dati della colonna in un tipo di dati di sistema di SQL Server e le relative regole di confronto. Si dovrà quindi ripristinare un tipo di dati alias per la colonna.

    Non è possibile specificare una modifica delle regole di confronto per ALTER COLUMN se si verifica una delle condizioni seguenti:

    • Un vincolo CHECK o FOREIGN KEY o una colonna calcolata fa riferimento alla colonna modificata.

    • Nella colonna viene creato un indice, un indice full-text o una serie di statistiche. Le statistiche create automaticamente nella colonna modificata vengono eliminate se si modificano le regole di confronto della colonna.

    • Una vista associata allo schema o una funzione fa riferimento alla colonna.

    Per ulteriori informazioni, vedere COLLATE (Transact-SQL).

  • NULL | NOT NULL
    Specifica se la colonna consente valori Null. L'istruzione ALTER TABLE consente di aggiungere colonne che non consentono valori Null solo se alle colonne è associato un valore predefinito oppure se la tabella è vuota. È possibile specificare NOT NULL per le colonne calcolate solo se è specificato PERSISTED. Le nuove colonne che consentono valori Null ma a cui non è associato alcun valore predefinito contengono un valore Null per ogni riga della tabella. Se a una nuova colonna che consente valori Null viene aggiunta una definizione DEFAULT, è possibile utilizzare WITH VALUES per l'archiviazione del valore predefinito nella nuova colonna per ogni riga della tabella.

    Se la nuova colonna non consente valori Null e la tabella non è vuota, è necessario aggiungervi una definizione DEFAULT. Il valore predefinito viene quindi caricato automaticamente in ogni riga esistente della nuova colonna.

    È possibile specificare NULL in ALTER COLUMN per forzare l'utilizzo di valori Null nelle colonne NOT NULL, ad eccezione delle colonne nei vincoli PRIMARY KEY. È possibile specificare NOT NULL in ALTER COLUMN solo se la colonna non contiene valori Null. Per utilizzare ALTER COLUMN NOT NULL, è necessario aggiornare i valori Null con un valore specifico, ad esempio:

    UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
    ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;
    

    Quando si crea o si modifica una tabella mediante un'istruzione CREATE TABLE o ALTER TABLE, le impostazioni del database e della sessione influiscono sull'impostazione che consente l'utilizzo dei valori Null del tipo di dati utilizzato in una definizione di colonna. In questo caso, tale impostazione può essere sostituita. Nel caso di colonne non calcolate, è consigliabile definire sempre in modo esplicito una colonna come NULL o NOT NULL.

    Se si aggiunge una colonna con un tipo di dati definito dall'utente, è consigliabile definire per la colonna la stessa impostazione relativa al supporto di valori Null del tipo di dati definito dall'utente e specificare un valore predefinito per la colonna. Per ulteriori informazioni, vedere CREATE TABLE (Transact-SQL).

    [!NOTA]

    Se si specifica NULL o NOT NULL con ALTER COLUMN, è necessario inoltre specificare new_data_type [(precision [, scale ])]. Se il tipo di dati, la precisione e la scala non vengono modificati, specificare i valori correnti della colonna.

  • [ {ADD | DROP} ROWGUIDCOL ]
    Specifica l'aggiunta o l'eliminazione della proprietà ROWGUIDCOL dalla colonna specificata. ROWGUIDCOL indica che la colonna è di tipo rowguid. È possibile designare come colonna ROWGUIDCOL una sola colonna uniqueidentifier per tabella e assegnare la proprietà ROWGUIDCOL a una sola colonna uniqueidentifier. Non è possibile assegnare ROWGUIDCOL a una colonna con un tipo di dati definito dall'utente.

    ROWGUIDCOL non impone l'unicità dei valori archiviati nella colonna e non genera automaticamente valori per le nuove righe inserite nella tabella. Per generare valori univoci per ogni colonna, è necessario utilizzare la funzione NEWID con istruzioni INSERT o specificare la funzione NEWID come valore predefinito della colonna.

  • [ {ADD | DROP} PERSISTED ]
    Specifica l'aggiunta o l'eliminazione della proprietà PERSISTED dalla colonna specificata. La colonna interessata deve essere una colonna calcolata definita con un'espressione deterministica. Per le colonne specificate come PERSISTED, nel Motore di database sono archiviati fisicamente i valori calcolati nella tabella e aggiornati i valori durante l'aggiornamento delle altre colonne da cui le colonne calcolate dipendono. Se si contrassegna una colonna calcolata come PERSISTED, è possibile creare indici in colonne calcolate definite in base a espressioni deterministiche ma imprecise. Per ulteriori informazioni, vedere Indici per le colonne calcolate.

    Tutte le colonne calcolate utilizzate come colonne di partizionamento di tabelle partizionate devono essere contrassegnate come PERSISTED in modo esplicito.

  • DROP NOT FOR REPLICATION
    Specifica che i valori vengono incrementati nelle colonne Identity quando gli agenti di replica eseguono operazioni di inserimento. Questa clausola può essere specificata solo se column_name corrisponde a una colonna Identity.

  • SPARSE
    Indica che la colonna è di tipo sparse. L'archiviazione delle colonne di tipo sparse è ottimizzata per valori Null. Non è possibile designare le colonne di tipo sparse come NOT NULL. La conversione di una colonna di tipo sparse in una non di tipo sparse o viceversa provoca il blocco della tabella per la durata dell'esecuzione del comando. Potrebbe essere necessario utilizzare la clausola REBUILD per recuperare spazio. Per ulteriori restrizioni e informazioni relative alle colonne di tipo sparse, vedere Utilizzo di colonne di tipo sparse.

  • WITH CHECK | WITH NOCHECK
    Specifica se i dati nella tabella vengono convalidati in base a un vincolo FOREIGN KEY o CHECK nuovo o riabilitato. Se viene omesso, viene utilizzata la clausola WITH CHECK per nuovi vincoli e WITH NOCHECK per vincoli riabilitati.

    Se non si desidera verificare nuovi vincoli CHECK o FOREIGN KEY in base ai dati esistenti, utilizzare WITH NOCHECK. È tuttavia consigliabile effettuare questa scelta solo in casi rari. Il nuovo vincolo viene valutato in tutti gli aggiornamenti successivi dei dati. Le eventuali violazioni del vincolo soppresse da WITH NOCHECK quando si aggiunge il vincolo possono causare il mancato completamento dei successivi aggiornamenti di righe contenenti dati che violano il vincolo.

    Query Optimizer non considera i vincoli definiti con WITH NOCHECK, i quali vengono ignorati finché non vengono riabilitati mediante ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

  • ADD
    Specifica l'aggiunta di una o più definizioni di colonna, definizioni di colonna calcolata o vincoli di tabella.

  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    Specifica che constraint_name o column_name viene rimosso dalla tabella. È possibile elencare più colonne e vincoli.

    Il nome del vincolo definito dall'utente o di sistema può essere determinato mediante l'esecuzione di una query sulle viste del catalogo sys.check_constraint, sys.default_constraints, sys.key_constraints e sys.foreign_keys.

    Se nella tabella è presente un indice XML, non è possibile eliminare un vincolo PRIMARY KEY.

    Non è possibile eliminare una colonna se:

    • Viene utilizzata in un indice.

    • Viene utilizzata in un vincolo CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.

    • È associata a un valore predefinito creato con la parola chiave DEFAULT o a un oggetto predefinito.

    • È associata a una regola.

    [!NOTA]

    L'eliminazione di una colonna non consente di recuperare lo spazio su disco corrispondente. Può essere necessario recuperare lo spazio su disco di una colonna rimossa quando le dimensioni delle righe della tabella sono prossime al limite o lo hanno superato. Per recuperare spazio, creare in indice cluster nella tabella o ricompilare un indice cluster esistente utilizzando ALTER INDEX. Per informazioni sull'impatto dell'eliminazione di tipi di dati LOB, vedere questo intervento sul blog di CSS.

  • WITH <drop_clustered_constraint_option>
    Specifica l'impostazione di una o più opzioni di eliminazione dei vincoli cluster.

  • MAXDOP = max_degree_of_parallelism
    Consente di ignorare l'opzione di configurazione Max Degree of Parallelism solo per la durata dell'operazione. Per ulteriori informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.

    L'opzione MAXDOP consente di limitare il numero di processori utilizzati per l'esecuzione di piani paralleli. Il valore massimo è 64 processori.

    I possibili valori di max_degree_of_parallelism sono i seguenti:

    • 1
      Disattiva la generazione di piani paralleli.

    • >1
      Limita il numero massimo di processori utilizzati in un'operazione parallela sull'indice in base al numero specificato.

    • 0 (predefinito)
      Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.

    Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici.

    [!NOTA]

    Le operazioni parallele sugli indici sono disponibili solo in alcune edizioni di SQL Server. Per ulteriori informazioni, vedere Funzionalità supportate dalle edizioni di SQL Server 2012.

  • ONLINE = { ON | OFF }
    Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e per la modifica dei dati durante l'operazione sull'indice. Il valore predefinito è OFF. L'opzione REBUILD può essere eseguita come operazione ONLINE.

    • ON
      I blocchi di tabella a lungo termine non vengono mantenuti per la durata dell'operazione sull'indice. Durante la fase principale dell'operazione viene mantenuto solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine, in modo da consentire l'esecuzione di query o l'aggiornamento della tabella sottostante e degli indici. All'inizio dell'operazione viene mantenuto un blocco condiviso (S) sull'oggetto di origine per un periodo molto breve. Al termine dell'operazione di creazione di un indice non cluster, per un breve periodo viene acquisito un blocco condiviso (S) sull'origine. Al termine dell'operazione di creazione o di eliminazione di un indice cluster online o di ricompilazione di un indice cluster o non cluster, viene acquisito un blocco di modifica dello schema (SCH-M). L'opzione ONLINE non può essere impostata su ON quando viene creato un indice per una tabella temporanea locale. È consentita solo l'operazione di ricompilazione dell'heap a thread singolo.

    • OFF
      I blocchi di tabella vengono applicati per la durata dell'operazione sugli indici. Un'operazione sugli indici offline che crea, ricompila o elimina un indice cluster oppure ricompila o elimina un indice non cluster acquisisce un blocco di modifica dello schema (SCH-M) sulla tabella. Il blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione. Un'operazione sugli indici offline che crea un indice non cluster acquisisce un blocco condiviso (S) sulla tabella. Tale blocco impedisce l'aggiornamento della tabella sottostante ma consente operazioni di lettura, ad esempio l'esecuzione di istruzioni SELECT. Sono consentite operazioni di ricompilazione dell'heap multi-thread.

    Per ulteriori informazioni, vedere Funzionamento delle operazioni sugli indici online.

    [!NOTA]

    Le operazioni sugli indici online sono disponibili solo in alcune edizioni di SQL Server. Per ulteriori informazioni, vedere Funzionalità supportate dalle edizioni di SQL Server 2012.

  • MOVE TO { partition_scheme_name**(column_name [ 1,** ... n] ) | filegroup | "default" }
    Specifica una posizione in cui spostare le righe di dati attualmente presenti a livello foglia nell'indice cluster. La tabella viene spostata nella nuova posizione. Questa opzione è valida solo per i vincoli che creano un indice cluster.

    [!NOTA]

    In questo contesto, default non è una parola chiave, ma un identificatore per il filegroup predefinito e deve essere delimitato, come in MOVE TO "default" o MOVE TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

  • { CHECK | NOCHECK } CONSTRAINT
    Specifica l'abilitazione o la disabilitazione di constraint_name. È possibile utilizzare questa opzione solo con vincoli FOREIGN KEY e CHECK. Quando si specifica NOCHECK, il vincolo viene disabilitato e gli inserimenti o gli aggiornamenti successivi della colonna non vengono convalidati in base alle condizioni del vincolo. I vincoli DEFAULT, PRIMARY KEY e UNIQUE non possono essere disabilitati.

  • ALL
    Specifica che tutti i vincoli sono disabilitati con l'opzione NOCHECK o abilitati con l'opzione CHECK.

  • { ENABLE | DISABLE } TRIGGER
    Specifica l'abilitazione o la disabilitazione di trigger_name. Un trigger disabilitato è comunque disponibile nella tabella. Quando si esegue un'istruzione INSERT, UPDATE o DELETE sulla tabella, tuttavia, le azioni nel trigger vengono eseguite solo dopo che il trigger stesso è stato abilitato nuovamente.

  • ALL
    Specifica l'abilitazione o la disabilitazione di tutti i trigger della tabella.

  • trigger_name
    Specifica il nome del trigger da abilitare o disabilitare.

  • { ENABLE | DISABLE } CHANGE_TRACKING
    Specifica se il rilevamento delle modifiche è abilitato o disabilitato per la tabella. Per impostazione predefinita, il rilevamento delle modifiche è disabilitato.

    Questa opzione è disponibile solo quando il rilevamento delle modifiche è abilitato per il database. Per ulteriori informazioni, vedere Opzioni ALTER DATABASE SET (Transact-SQL).

    Per abilitare il rilevamento delle modifiche, nella tabella deve essere presente una chiave primaria.

  • WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
    Specifica se nel Motore di database viene tenuta traccia delle colonne con rilevamento delle modifiche abilitato che sono state aggiornate. Il valore predefinito è OFF.

  • SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name**.** ] target_table [ PARTITION target_ partition_number_expression ]
    Trasferisce un blocco di dati in uno dei modi seguenti:

    • Riassegna tutti i dati di una tabella come partizione a una tabella partizionata già esistente.

    • Sposta una partizione da una tabella partizionata a un'altra.

    • Riassegna tutti i dati in una partizione di una tabella partizionata a una tabella non partizionata esistente.

    Se table è una tabella partizionata, è necessario specificare source_partition_number_expression. Se target_table è partizionata, è necessario specificare target_partition_number_expression. Se si riassegnano i dati di una tabella come partizione a una tabella esistente già partizionata o se si sposta una partizione da una tabella partizionata a un'altra, la partizione di destinazione deve essere già esistente e vuota.

    Se si riassegnano i dati di una partizione per formare un'unica tabella, la tabella di destinazione deve essere già stata creata ed essere vuota. Sia la tabella o la partizione di origine che la tabella o la partizione di destinazione devono trovarsi nello stesso filegroup. È inoltre necessario che gli indici o le partizioni degli indici corrispondenti si trovino nello stesso filegroup. Al trasferimento di partizioni vengono applicate molte ulteriori restrizioni. table e target_table non possono corrispondere. target_table può essere un identificatore in più parti.

    source_partition_number_expression e target_partition_number_expression sono espressioni costanti che possono fare riferimento a variabili e funzioni, incluse variabili con tipo definito dall'utente (UDT) e funzioni definite dall'utente, ma che non possono fare riferimento a espressioni Transact-SQL.

    Per la restrizione SWITCH durante l'utilizzo della replica, vedere Replica di tabelle e indici partizionati.

  • SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })
    Specifica dove vengono archiviati i dati FILESTREAM.

    L'istruzione ALTER TABLE con la clausola SET FILESTREAM_ON verrà eseguita in modo corretto solo se nella tabella non sono presenti colonne FILESTREAM. Tali colonne possono essere aggiunte tramite una seconda istruzione ALTER TABLE.

    Se partition_scheme_name è specificato, vengono applicate le regole per CREATE TABLE. La tabella deve già essere partizionata per i dati delle righe e nel relativo schema di partizione devono essere utilizzate la stessa funzione e le stesse colonne di partizione dello schema di partizione FILESTREAM.

    filestream_filegroup_name specifica il nome di un filegroup FILESTREAM. È necessario che per il filegroup sia definito un file mediante un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.

    "default" specifica il filegroup FILESTREAM con il set di proprietà DEFAULT. Se non è presente alcun filegroup FILESTREAM, viene generato un errore.

    "NULL" specifica che tutti i riferimenti al filegroup FILESTREAM per la tabella verranno rimossi. È necessario eliminare innanzitutto tutte le colonne FILESTREAM. È necessario inoltre utilizzare SET FILESTREAM_ON**="NULL"** per eliminare tutti i dati FILESTREAM associati a una tabella.

  • SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    Specifica i metodi consentiti di escalation blocchi per una tabella.

    • AUTO
      Questa opzione consente al Motore di database di SQL Server di selezionare la granularità dell'escalation blocchi appropriata per lo schema della tabella.

      • Se la tabella è partizionata, l'escalation blocchi è consentita per la partizione. Una volta eseguita l'escalation del blocco al livello di partizione, non verrà eseguita alcuna successiva escalation del blocco nella granularità TABLE.

      • Se la tabella non è partizionata, l'escalation blocchi verrà eseguita nella granularità TABLE.

    • TABLE
      L'escalation blocchi viene eseguita con una granularità a livello di tabella, indipendentemente dal partizionamento o meno della tabella. Questo avviene anche in SQL Server 2005. TABLE rappresenta il valore predefinito.

    • DISABLE
      Evita che venga eseguita l'escalation blocchi nella maggior parte dei casi. I blocchi a livello di tabella non vengono completamente disattivati. Quando si esegue l'analisi di una tabella in cui non è presente alcun indice cluster a livello di isolamento serializzabile, ad esempio, il Motore di database deve acquisire un blocco di tabella per proteggere l'integrità dei dati.

  • REBUILD
    Utilizzare la sintassi REBUILD WITH per ricompilare un'intera tabella che include tutte le partizioni in una tabella partizionata. Se nella tabella è presente un indice cluster, l'opzione REBUILD consente di ricompilare l'indice stesso. L'opzione REBUILD può essere eseguita come operazione ONLINE.

    Utilizzare la sintassi REBUILD PARTITION per ricompilare un'unica partizione in una tabella partizionata.

  • PARTITION = ALL
    Ricompila tutte le partizioni in caso di modifica delle impostazioni di compressione della partizione.

  • REBUILD WITH ( <rebuild_option> )
    Tutte le opzioni vengono applicate a una tabella con un indice cluster. Se nella tabella non è presente un indice cluster, sulla struttura di heap influiranno solo alcune opzioni.

    Se con l'operazione REBUILD non viene indicata un'impostazione di compressione specifica, verrà utilizzata l'impostazione di compressione corrente per la partizione. Per restituire l'impostazione corrente, eseguire una query sulla colonna data_compression nella vista del catalogo sys.partitions.

    Per una descrizione completa delle opzioni di ricompilazione, vedere index_option (Transact-SQL).

  • DATA_COMPRESSION
    Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificato. Sono disponibili le opzioni seguenti:

    • NONE
      La tabella o le partizioni specificate non vengono compresse.

    • ROW
      La tabella o le partizioni specificate vengono compresse utilizzando la compressione di riga.

    • PAGE
      La tabella o le partizioni specificate vengono compresse utilizzando la compressione di pagina.

    Per ricompilare contemporaneamente più partizioni, vedere index_option (Transact-SQL). Se la tabella non dispone di un indice cluster, la modifica della compressione dei dati comporta la ricompilazione dell'heap e degli indici non cluster. Per ulteriori informazioni sulla compressione, vedere Compressione dei dati.

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    Nome del set di colonne. Un set di colonne è una rappresentazione XML non tipizzata che combina tutte le colonne di tipo sparse di una tabella in un output strutturato. Un set di colonne non può essere aggiunto a una tabella che contiene colonne di tipo sparse. Per ulteriori informazioni sui set di colonne, vedere Utilizzare set di colonne.

  • { ENABLE | DISABLE } FILETABLE_NAMESPACE
    Consente di abilitare o disabilitare i vincoli definiti dal sistema su una tabella FileTable. Può essere utilizzato solo con una tabella FileTable.

  • SET ( FILETABLE_DIRECTORY = directory_name )
    Specifica un nome di directory FileTable compatibile con Windows. Questo nome deve essere univoco tra tutti i nomi di directory FileTable nel database. Il confronto di univocità non supporta la distinzione tra maiuscole e minuscole, indipendentemente dalle impostazioni delle regole di confronto SQL. Può essere utilizzato solo con una tabella FileTable.

Osservazioni

Per aggiungere nuove righe di dati, utilizzare INSERT. Per rimuovere righe di dati, utilizzare DELETE o TRUNCATE TABLE. Per modificare i valori nelle righe esistenti, utilizzare UPDATE.

Se la cache delle procedure include piani di esecuzione che fanno riferimento alla tabella, l'istruzione ALTER TABLE li contrassegna per la ricompilazione durante l'esecuzione successiva.

Modifica delle dimensioni di una colonna

È possibile modificare la lunghezza, la precisione o la scala di una colonna specificando nuove dimensioni per il tipo di dati della colonna nella clausola ALTER COLUMN. Se nella colonna sono presenti dati, le nuove dimensioni non possono essere minori delle dimensioni massime dei dati. La colonna inoltre non può essere definita in un indice, tranne nel caso in cui il tipo di dati della colonna sia varchar, nvarchar o varbinary e l'indice sia diverso dal risultato di un vincolo PRIMARY KEY. Vedere l'esempio P.

Blocchi e ALTER TABLE

Le modifiche specificate in ALTER TABLE vengono implementate immediatamente. Se le modifiche richiedono l'alterazione delle righe nella tabella, le righe vengono aggiornate tramite ALTER TABLE. ALTER TABLE acquisisce un blocco di modifica dello schema (SCH-M) sulla tabella per verificare che durante la modifica nessun'altra connessione faccia riferimento ai dati o ai metadati della tabella, ad eccezione delle operazioni sugli indici online al termine delle quali è richiesto un blocco SCH-M molto breve. In un'operazione ALTER TABLE…SWITCH il blocco viene acquisito sia sulle tabelle di origine che su quelle di destinazione. Le modifiche apportate alla tabella vengono registrate e possono essere recuperate completamente. Le modifiche che influiscono su tutte le righe di tabelle di grandi dimensioni, ad esempio l'eliminazione di una colonna o, in alcune edizioni di SQL Server, l'aggiunta di una colonna NOT NULL con un valore predefinito, possono richiedere molto tempo e generare un elevato numero di record del log. Tali istruzioni ALTER TABLE devono essere eseguite con la stessa attenzione dedicata alle istruzioni INSERT, UPDATE e DELETE quando queste influiscono su molte righe.

Aggiunta di colonne NOT NULL come operazione online

In SQL Server 2012 Enterprise Edition l'aggiunta di una colonna NOT NULL con un valore predefinito è un'operazione online quando il valore predefinito è una costante di runtime. L'operazione viene pertanto completata quasi istantaneamente indipendentemente dal numero di righe nella tabella, in quanto le righe esistenti nella tabella non vengono aggiornate durante l'operazione, ma il valore predefinito viene archiviato solo nei metadati della tabella e il valore viene cercato in base alle necessità nelle query che accedono a tali righe. Questo comportamento è automatico. Oltre la sintassi ADD COLUMN, non è necessaria alcuna sintassi aggiuntiva per implementare l'operazione online. Una costante di runtime è un'espressione che produce lo stesso valore durante il runtime per ogni riga nella tabella indipendentemente dal relativo determinismo. Esempi di costanti di runtime sono l'espressione costante "Dati temporanei personali" o la funzione di sistema GETUTCDATETIME(). Al contrario, le funzioni NEWID() o NEWSEQUENTIALID() non sono costanti di runtime perché viene prodotto un valore univoco per ogni riga della tabella. L'aggiunta di una colonna NOT NULL con un valore predefinito che non è una costante di runtime viene eseguita sempre offline e per tutta la durata dell'operazione viene acquisito un blocco esclusivo (SCH-M).

Mentre le righe esistenti fanno riferimento al valore archiviato nei metadati, il valore predefinito viene archiviato nella riga per tutte le nuove righe inserite e che non specificano un altro valore per la colonna. Il valore predefinito archiviato nei metadati viene spostato in una riga esistente quando la riga viene aggiornata, anche se la colonna effettiva non viene specificata nell'istruzione UPDATE, o se la tabella o l'indice cluster viene ricompilato.

Le colonne di tipo varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography o i tipi CLR definiti dall'utente (UDT) non possono essere aggiunti in un'operazione online. Non è possibile aggiungere una colonna online se con tale operazione le dimensioni massime possibili per la riga superano il limite di 8.060 byte. In tal caso, la colonna viene aggiunta come operazione offline.

Esecuzione di piani paralleli

In Microsoft SQL Server 2012 Enterprise il numero di processori utilizzati per eseguire un'unica istruzione ALTER TABLE ADD (basata su indici) CONSTRAINT o DROP (indice cluster) CONSTRAINT viene determinato dall'opzione di configurazione Massimo grado parallelismo e dal carico di lavoro corrente. Se Motore di database rileva che il sistema è occupato, il grado di parallelismo dell'operazione viene ridotto automaticamente prima dell'avvio dell'esecuzione dell'istruzione. È possibile configurare manualmente il numero di processori utilizzati per eseguire l'istruzione mediante l'opzione MAXDOP. Per ulteriori informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.

Tabelle partizionate

Oltre all'esecuzione di operazioni SWITCH che interessano tabelle partizionate, è possibile utilizzare ALTER TABLE per modificare lo stato di colonne, vincoli e trigger di tali tabelle così come per le tabelle non partizionate. Non è tuttavia possibile utilizzare questa istruzione per modificare il modo di partizione della tabella stessa. Per ripartizionare una tabella partizionata, utilizzare ALTER PARTITION SCHEME e ALTER PARTITION FUNCTION. Non è inoltre possibile modificare il tipo di dati di una colonna di una tabella partizionata.

Restrizioni per le tabelle con viste associate a schema

Le restrizioni che si applicano a istruzioni ALTER TABLE eseguite su tabelle con viste associate a schema sono le stesse che vengono applicate alla modifica di tabelle con un indice semplice. È possibile aggiungere una colonna mentre non è consentito rimuovere o modificare una colonna che fa parte di una vista associata a schema. Se l'istruzione ALTER TABLE richiede la modifica di una colonna utilizzata in una vista associata allo schema, ALTER TABLE ha esito negativo e Motore di database genera un messaggio di errore. Per ulteriori informazioni sull'associazione di schema e sulle viste indicizzate, vedere CREATE VIEW (Transact-SQL).

La creazione di una vista associata a schema che fa riferimento a tabelle di base non influisce sull'aggiunta o sulla rimozione di trigger in tali tabelle.

Indici e ALTER TABLE

Gli indici creati nell'ambito di un vincolo vengono eliminati con l'eliminazione del vincolo. Gli indici creati mediante CREATE INDEX devono essere eliminati mediante DROP INDEX. È possibile utilizzare l'istruzione ALTER INDEX per ricompilare un indice che costituisce una parte di una definizione di vincolo. Non è necessario eliminare e quindi aggiungere nuovamente il vincolo con ALTER TABLE.

Tutti gli indici e i vincoli basati su una colonna devono essere rimossi prima della rimozione della colonna.

Quando si elimina un vincolo con cui è stato creato un indice cluster, le righe di dati archiviate a livello foglia nell'indice cluster vengono archiviate in una tabella non cluster. È possibile eliminare l'indice cluster e spostare la tabella risultante in un altro filegroup o schema di partizione in una singola transazione specificando l'opzione MOVE TO. Per l'opzione MOVE TO vengono applicate le seguenti restrizioni:

  • MOVE TO non può essere utilizzata per viste indicizzate o indici non cluster.

  • Lo schema di partizione o il filegroup deve essere già esistente.

  • Se non si specifica MOVE TO, la tabella viene inserita nello stesso schema di partizione o nello stesso filegroup definito per l'indice cluster.

Quando si elimina un indice cluster, è possibile specificare l'opzione ONLINE = ON per evitare che la transazione DROP INDEX blocchi l'esecuzione di query e modifiche sui dati sottostanti e gli indici non cluster associati.

Per l'opzione ONLINE = ON vengono applicate le seguenti restrizioni:

  • ONLINE = ON non è valida per gli indici cluster che sono inoltre disabilitati. Per l'eliminazione degli indici disabilitati è necessario utilizzare ONLINE = OFF.

  • È possibile eliminare un solo indice alla volta.

  • ONLINE = ON non è valida per viste indicizzate, indici non cluster o indici su tabelle temporanee locali.

Per l'eliminazione di un indice cluster, lo spazio su disco temporaneo deve essere uguale alle dimensioni dell'indice cluster esistente. Questo spazio aggiuntivo viene rilasciato al termine dell'operazione.

[!NOTA]

Le opzioni elencate in <drop_clustered_constraint_option> si applicano a indici cluster nelle tabelle e non possono essere applicate a indici cluster nelle viste o a indici non cluster.

Replica delle modifiche dello schema

Per impostazione predefinita, quando si esegue ALTER TABLE su una tabella pubblicata in un server di pubblicazione SQL Server tale modifica viene propagata a tutti i Sottoscrittori SQL Server. Questa funzionalità presenta alcune restrizioni e può essere disabilitata. Per ulteriori informazioni, vedere Modifiche allo schema nei database di pubblicazione.

Compressione dei dati

Le tabelle di sistema non possono essere abilitate per la compressione. . Se la tabella è un heap, l'operazione di ricompilazione per la modalità ONLINE sarà a thread singolo. Utilizzare la modalità OFFLINE per un'operazione di ricompilazione di heap multithread. Per ulteriori informazioni sulla compressione dei dati, vedere Compressione dei dati.

Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un indice o una partizione, utilizzare la stored procedure sp_estimate_data_compression_savings.

Alle tabelle partizionate vengono applicate le restrizioni seguenti:

  • Non è possibile modificare l'impostazione di compressione di una singola partizione se la tabella include indici non allineati.

  • La sintassi ALTER TABLE <table> REBUILD PARTITION ... consente di ricompilare la partizione specificata.

  • La sintassi ALTER TABLE <table> REBUILD WITH ... consente di ricompilare tutte le partizioni.

Eliminazione di colonne NTEXT

Quando si eliminano colonne NTEXT, la pulizia dei dati eliminati viene eseguita come operazione serializzata in tutte le righe e può richiedere una notevole quantità di tempo. Quando si elimina una colonna NTEXT in una tabella con un numero elevato di righe, aggiornare in primo luogo la colonna NTEXT al valore NULL e, successivamente, eliminare la colonna. Questa operazione può essere eseguita in parallelo con altre e può risultare molto più rapida.

Supporto della compatibilità

L'istruzione ALTER TABLE supporta unicamente nomi di tabella in due parti (schema.oggetto). In SQL Server 2012 l'utilizzo di un nome di tabella basato sui formati seguenti comporta la generazione dell'errore 117 in fase di compilazione.

  • server.database.schema.tabella

  • .database.schema.tabella

  • ..schema.tabella

Nelle versioni precedenti l'utilizzo del formato server.database.schema.tabella genera l'errore 4902. L'utilizzo del formato .database.schema.tabella o ..schema.tabella è supportato.

Per risolvere il problema, rimuovere l'utilizzo di un prefisso in quattro parti.

Autorizzazioni

È necessario disporre dell'autorizzazione ALTER per la tabella.

Le autorizzazioni ALTER TABLE si applicano a entrambe le tabelle coinvolte in un'istruzione ALTER TABLE SWITCH. Tutti i dati trasferiti ereditano la sicurezza della tabella di destinazione.

Se nell'istruzione ALTER TABLE si definiscono colonne di tipo Common Language Runtime (CLR) definito dall'utente (UDT) o di tipo alias, è necessaria l'autorizzazione REFERENCES per il tipo desiderato.

Per l'aggiunta di una colonna mediante la quale vengono aggiornate le righe della tabella è necessaria l'autorizzazione UPDATE per la tabella, ad esempio l'aggiunta di una colonna NOT NULL con un valore predefinito o l'aggiunta di una colonna Identity quando la tabella non è vuota.

Esempi

Categoria

Elementi di sintassi inclusi

Aggiunta di colonne e vincoli

ADD • PRIMARY KEY con opzioni per gli indici • colonne di tipo sparse e set di colonne •

Eliminazione di colonne e vincoli

DROP

Modifica di una definizione di colonna

cambiare tipo di dati • cambiare dimensioni delle colonna • regole di confronto

Modifica della definizione di una tabella

DATA_COMPRESSION • SWITCH PARTITION OF • LOCK ESCALATION • rilevamento delle modifiche

Disabilitazione e abilitazione di vincoli e trigger

CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER

Aggiunta di colonne e vincoli

Negli esempi di questa sezione viene illustrata l'aggiunta di colonne e vincoli a una tabella.

A.Aggiunta di una nuova colonna

Nell'esempio seguente viene aggiunta una colonna che consente valori Null e alla quale non sono forniti valori mediante una definizione DEFAULT. In ogni riga della nuova colonna sarà indicato NULL.

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO

B.Aggiunta di una colonna con un vincolo

Nell'esempio seguente viene aggiunta una nuova colonna con un vincolo UNIQUE.

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL 
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

C.Aggiunta di un vincolo CHECK non verificato a una colonna esistente

Nell'esempio seguente viene aggiunto un vincolo a una colonna esistente nella tabella. Nella colonna è presente un valore che viola il vincolo. Pertanto, viene utilizzato WITH NOCHECK per evitare che il vincolo venga convalidato in base alle righe esistenti e consentire l'aggiunta del vincolo.

CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK 
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

D.Aggiunta di un vincolo DEFAULT a una colonna esistente

Nell'esempio seguente viene creata una tabella con due colonne e viene inserito un valore nella prima colonna mentre i valori nell'altra colonna rimangono NULL. Viene quindi aggiunto un vincolo DEFAULT alla seconda colonna. Per verificare l'applicazione del vincolo, viene inserito un altro valore nella prima colonna e viene eseguita una query sulla tabella.

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

E.Aggiunta di più colonne con vincoli

Nell'esempio seguente vengono aggiunte più colonne con vincoli. I vincoli vengono definiti con la nuova colonna. Alla prima colonna è associata la proprietà IDENTITY. Nella colonna Identity di ogni riga della tabella sono presenti nuovi valori incrementali.

CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD 

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY, 

-- Add a column that references another column in the same table.
column_c INT NULL  
CONSTRAINT column_c_fk 
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that 
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL 
CONSTRAINT column_d_chk
CHECK 
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

F.Aggiunta di una colonna che ammette i valori Null con valori predefiniti

Nell'esempio seguente viene aggiunta una colonna che ammette i valori Null con una definizione DEFAULT e viene specificato WITH VALUES per l'assegnazione di valori a ogni riga della tabella. Se non si utilizza WITH VALUES, a ogni riga della nuova colonna viene associato il valore NULL.

USE AdventureWorks2012 ; 
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf 
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

G.Creazione di un vincolo PRIMARY KEY con opzioni per gli indici

Nell'esempio seguente viene creato il vincolo PRIMARY KEY PK_TransactionHistoryArchive_TransactionID e vengono impostate le opzioni FILLFACTOR, ONLINE e PAD_INDEX. All'indice cluster risultante sarà assegnato lo stesso nome del vincolo.

USE AdventureWorks2012;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK 
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO

H.Aggiunta di una colonna di tipo sparse

Negli esempi seguenti si illustrano l'aggiunta e la modifica di colonne di tipo sparse nella tabella T1. Il codice per creare la tabella T1 è il seguente:

CREATE TABLE T1
(C1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL,
C3 int SPARSE NULL,
C4 int ) ;
GO

Per aggiungere una colonna di tipo sparse aggiuntiva C5, eseguire l'istruzione riportata di seguito.

ALTER TABLE T1
ADD C5 char(100) SPARSE NULL ;
GO

Per convertire la colonna non di tipo sparse C4 in una colonna di tipo sparse, eseguire l'istruzione riportata di seguito.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Per convertire la colonna di tipo sparse C4 in una colonna non di tipo sparse, eseguire l'istruzione riportata di seguito.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

I.Aggiunta di un set di colonne

Negli esempi seguenti viene illustrata l'aggiunta di una colonna alla tabella T2. Un set di colonne non può essere aggiunto a una tabella che contiene già colonne di tipo sparse. Il codice per creare la tabella T2 è il seguente:

CREATE TABLE T2
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

Le tre istruzioni seguenti aggiungono un set di colonne denominato CS, quindi modificano le colonne C2 e C3 in SPARSE.

ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO

ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ; 
GO

ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO

Icona freccia utilizzata con il collegamento Torna all'inizio[Torna all'inizio]

Eliminazione di colonne e vincoli

Negli esempi di questa sezione viene illustrata l'eliminazione di colonne e vincoli.

A.Eliminare una o più colonne

Nel primo esempio viene modificata una tabella per rimuovere una colonna. Nel secondo esempio vengono rimosse più colonne.

CREATE TABLE dbo.doc_exb 
    (column_a INT
     ,column_b VARCHAR(20) NULL
     ,column_c datetime
     ,column_d int) ;
GO
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;

B.Eliminazione di vincoli e colonne

Nel primo esempio viene rimosso un vincolo UNIQUE da una tabella. Nel secondo esempio vengono rimossi due vincoli e una singola colonna.

CREATE TABLE dbo.doc_exc ( column_a int NOT NULL CONSTRAINT my_constraint UNIQUE) ;
GO

-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint ;
GO

DROP TABLE dbo.doc_exc;
GO

CREATE TABLE dbo.doc_exc ( column_a int  
                          NOT NULL CONSTRAINT my_constraint UNIQUE
                          ,column_b int 
                          NOT NULL CONSTRAINT my_pk_constraint PRIMARY KEY) ;
GO

-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc 

    DROP CONSTRAINT CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.Eliminazione di un vincolo PRIMARY KEY nella modalità ONLINE

Nell'esempio seguente viene eliminato un vincolo PRIMARY KEY con l'opzione ONLINE impostata su ON.

USE AdventureWorks2012;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO

D.Aggiunta e rimozione di un vincolo FOREIGN KEY

Nell'esempio seguente viene creata la tabella ContactBackup, successivamente modificata con l'aggiunta di un vincolo FOREIGN KEY che fa riferimento alla tabella Person.Person. Il vincolo FOREIGN KEY viene quindi rimosso.

USE AdventureWorks2012 ;
GO
CREATE TABLE Person.ContactBackup
    (ContactID int) ;
GO

ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
GO

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

Icona freccia utilizzata con il collegamento Torna all'inizio[Torna all'inizio]

Modifica di una definizione di colonna

A.Modifica del tipo di dati di una colonna

Nell'esempio seguente la colonna di una tabella viene modificata da INT a DECIMAL.

CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

B.Modifica delle dimensioni di una colonna

Nell'esempio seguente vengono aumentate le dimensioni di una colonna varchar e la precisione e la scala di una colonna decimal. Poiché le colonne contengono dati, le relative dimensioni possono solo essere aumentate. Si noti inoltre che col_a è definito in un indice univoco. Le dimensioni di col_a possono ancora essere aumentate poiché il tipo di dati è varchar e l'indice non è il risultato di un vincolo PRIMARY KEY.

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

C.Modifica delle regole di confronto di una colonna

Nell'esempio seguente si illustra come modificare le regole di confronto di una colonna. Innanzitutto, viene creata una tabella con le regole di confronto predefinite dell'utente.

CREATE TABLE T3
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO

In seguito le regole di confronto della colonna C2 vengono impostate su Latin1_General_BIN. Notare che il tipo di dati è richiesto, anche se non è modificato.

ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN;
GO

Icona freccia utilizzata con il collegamento Torna all'inizio[Torna all'inizio]

Modifica della definizione di una tabella

Negli esempi di questa sezione viene illustrato come modificare la definizione di una tabella.

A.Modifica di una tabella per cambiare la compressione

Nell'esempio seguente viene modificata la compressione di una tabella non partizionata. L'heap o l'indice cluster verrà ricompilato. Se la tabella è un heap, tutti gli indici non cluster verranno ricompilati.

ALTER TABLE T1 
REBUILD WITH (DATA_COMPRESSION = PAGE);

Nell'esempio seguente viene modificata la compressione di una tabella partizionata. La sintassi REBUILD PARTITION = 1 consente di ricompilare solo il numero di partizione 1.

ALTER TABLE PartitionTable1 
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  NONE) ;
GO

Se per la stessa operazione viene utilizzata la sintassi alternativa seguente, vengono ricompilate tutte le partizioni della tabella.

ALTER TABLE PartitionTable1 
REBUILD PARTITION = ALL 
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;

Per ulteriori esempi sulla compressione dei dati, vedere Compressione dei dati.

B.Trasferimento di partizioni tra tabelle

Nell'esempio seguente viene creata una tabella partizionata, presupponendo che nel database sia già stato creato lo schema di partizione myRangePS1. Verrà quindi creata una tabella non partizionata con la stessa struttura della tabella partizionata e nello stesso filegroup di PARTITION 2 della tabella PartitionTable. I dati di PARTITION 2 della tabella PartitionTable vengono quindi trasferiti nella tabella NonPartitionTable.

CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO

C.Consentire l'escalation blocchi nelle tabelle partizionate

Nell'esempio seguente viene abilitata l'escalation blocchi a livello di partizione in una tabella partizionata. Se la tabella non è partizionata, l'escalation blocchi viene impostata a livello TABLE.

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO

D.Configurazione del rilevamento delle modifiche in una tabella

Nell'esempio seguente viene abilitato il rilevamento delle modifiche per la tabella Person.Person.

USE AdventureWorks2012;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

Nell'esempio seguente viene abilitato il rilevamento delle modifiche e il rilevamento delle colonne aggiornate durante una modifica.

USE AdventureWorks2012;
GO
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

Nell'esempio seguente viene disabilitato il rilevamento delle modifiche per la tabella Person.Person.

USE AdventureWorks2012;
Go
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

Icona freccia utilizzata con il collegamento Torna all'inizio[Torna all'inizio]

Disabilitazione e abilitazione di vincoli e trigger

A.Disabilitazione e riabilitazione di un vincolo

Nell'esempio seguente viene disabilitato un vincolo che limita i dati relativi agli stipendi accettabili. NOCHECK CONSTRAINT viene utilizzata con ALTER TABLE per disabilitare il vincolo e consentire un inserimento che in genere violerebbe il vincolo. CHECK CONSTRAINT abilita nuovamente il vincolo.

CREATE TABLE dbo.cnst_example 
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
);

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;

B.Disabilitazione e riabilitazione di un trigger

Nell'esempio seguente viene utilizzata l'opzione DISABLE TRIGGER di ALTER TABLE per disabilitare il trigger e consentire un inserimento che altrimenti violerebbe il trigger. ENABLE TRIGGER viene quindi utilizzato per abilitare nuovamente il trigger.

CREATE TABLE dbo.trig_example 
(id INT, 
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

Icona freccia utilizzata con il collegamento Torna all'inizio[Inizio pagina]

Vedere anche

Riferimento

sys.tables (Transact-SQL)

sp_rename (Transact-SQL)

CREATE TABLE (Transact-SQL)

DROP TABLE (Transact-SQL)

sp_help (Transact-SQL)

ALTER PARTITION SCHEME (Transact-SQL)

ALTER PARTITION FUNCTION (Transact-SQL)

EVENTDATA (Transact-SQL)