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 argomentoConvenzioni 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 ] ) ]
        | COLUMN column_name 
    } [ ,...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>)
}
[ ; ]

<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 } )
    }

<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. Per ulteriori informazioni, vedere sp_dbcmptlevel (Transact-SQL).

    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 un indice. Fanno eccezione le colonne per cui il tipo di dati è varchar, nvarchar o varbinary oppure è rimasto invariato, le nuove dimensioni sono uguali o maggiori di quelle precedenti e l'indice è diverso dal risultato di un vincolo PRIMARY KEY.

    • 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 e le 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.

  • column_name
    Nome della colonna che si desidera 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. Non è possibile specificare type_name per le colonne esistenti di tabelle partizionate. type_name può appartenere a uno dei tipi 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 di dati definito dall'utente di .NET Framework e schema al quale il tipo di dati appartiene. Per consentirne l'utilizzo in una definizione di tabella, i tipi di dati definiti dall'utente di .NET Framework vengono creati con l'istruzione CREATE TYPE.

    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 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 del 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 a schema o una funzione fa riferimento alla colonna.

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

  • SPARSE NULL | NOT NULL
    Specifica se la colonna è di tipo sparse o ammette valori Null. Se la colonna da modificare è di tipo sparse, è necessario specificare in modo esplicito questa proprietà. In caso contrario, viene ripristinata una colonna non di tipo sparse. 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.

    Per ulteriori restrizioni e informazioni relative alle colonne di tipo sparse e il supporto di valori Null, vedere Utilizzo di colonne di tipo sparse.

    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, Motore di database archivia fisicamente i valori calcolati nella tabella e aggiorna 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 Creazione di 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 è una colonna Identity. Per ulteriori informazioni, vedere Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION.

  • SPARSE
    Specifica che la colonna da aggiungere o da eliminare è di tipo sparse. L'archiviazione delle colonne di tipo sparse è ottimizzata per i 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 gli eventuali risparmi in termini di spazio.

    Nota importanteImportante

    È necessario specificare la proprietà SPARSE ogni volta che si modifica la colonna. In caso contrario, viene ripristinata una colonna non di tipo sparse.

    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 riattivati.

    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 riattivati 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 fornito dal sistema può essere determinato eseguendo una query nelle 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.

  • 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 Opzione 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 nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

  • 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). Durante la creazione di un indice per una tabella temporanea locale non è possibile impostare ONLINE su ON. È consentita solo l'operazione di ricompilazione di HEAP a thread singolo.

    • OFF
      I blocchi a livello 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. Tale 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. Consente operazioni di ricompilazione di HEAP multithread.

    Per ulteriori informazioni, vedere Funzionamento delle operazioni sugli indici in linea. Per ulteriori informazioni sui blocchi, vedere Modalità blocco.

    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 2008 R2.

  • 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. Rappresenta l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

  • { CHECK | NOCHECK } CONSTRAINT
    Specifica l'attivazione 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 attivati con l'opzione CHECK.

  • { ENABLE | DISABLE } TRIGGER
    Specifica l'attivazione 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 la riattivazione del trigger stesso.

  • 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. Per ulteriori informazioni, vedere Trasferimento efficiente dei dati mediante lo spostamento di partizioni. table e target_table non possono essere uguali. 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 e funzioni definite dall'utente, ma che non possono fare riferimento a espressioni Transact-SQL.

    Per la limitazione SWITCH in caso di utilizzo della replica, vedere Replica di tabelle e indici partizionati.

  • SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL"} )
    Specifica la posizione in cui 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.

    Quando non viene specificata un'impostazione di compressione specifica tramite l'operazione REBUILD, viene utilizzata l'impostazione di compressione corrente per la partizione. Per ripristinare 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 ricompila l'heap e gli indici non cluster. Per ulteriori informazioni sulla compressione, vedere Creazione di tabelle e di indici compressi e Cenni preliminari sulla Compressione UNICODE.

  • 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 Utilizzo di set di colonne.

Osservazioni

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 l'aggiunta di una colonna NOT NULL con 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.

Esecuzione di piani paralleli

In SQL Server 2008 Enterprise Edition 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 max degree of parallelism 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.

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 Creazione di tabelle e di indici compressi.

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 <tabella> REBUILD PARTITION ... consente di ricompilare la partizione specifica.

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

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 o di tipo alias, è necessaria l'autorizzazione REFERENCES per il tipo desiderato.

Esempi

A. Aggiunta di una nuova colonna

Nell'esempio seguente viene aggiunta una colonna che consente valori Null e alla quale non sono associati 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
EXEC sp_help doc_exa ;
GO
DROP TABLE dbo.doc_exa ;
GO

B. Eliminazione di una colonna

Nell'esempio seguente viene modificata una tabella mediante la rimozione di una colonna.

CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO

C. 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

D. 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

E. 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

F. 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

G. 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

H. Aggiunta di una colonna che ammette valori Null con valori predefiniti

Nell'esempio seguente viene aggiunta una colonna che ammette 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 AdventureWorks2008R2 ; 
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

I. Disabilitazione e riabilitazione di un vincolo

Nell'esempio seguente viene disabilitato un vincolo che limita i dati relativi agli stipendi accettabili. Viene inoltre utilizzato NOCHECK CONSTRAINT con ALTER TABLE per disabilitare il vincolo e consentire un inserimento che altrimenti violerebbe il vincolo. CHECK CONSTRAINT riabilita 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) ;

J. Eliminazione di un vincolo

Nell'esempio seguente viene rimosso un vincolo UNIQUE da una tabella.

CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO

K. 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

L. 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. Per riabilitare il trigger viene quindi utilizzato ENABLE 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

M. 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 AdventureWorks2008R2;
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

N. 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 AdventureWorks2008R2;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO

O. 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. Il vincolo FOREIGN KEY viene quindi rimosso.

USE AdventureWorks2008R2 ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Person (BusinessEntityID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

P. 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');

Q. 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 verrà abilitata a livello TABLE.

ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO);
GO

R. Configurazione del rilevamento delle modifiche in una tabella

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

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 nel database AdventureWorks2008R2:

USE AdventureWorks2008R2;
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

S. Modifica di una tabella per cambiare la compressione

Nell'esempio seguente viene modificata la compressione di una tabella 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 Creazione di tabelle e di indici compressi.

T. Aggiunta di una colonna di tipo sparse

Negli esempi seguenti vengono illustrate 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

U. Aggiunta di un set di colonne

Negli esempi seguenti viene illustrato come aggiungere 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

V. Modifica delle regole di confronto di una colonna

Nell'esempio seguente viene illustrato come modificare le regole di confronto di una colonna. Viene innanzitutto creata la tabella T3 con regole di confronto dell'utente predefinite:

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