ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure Synapse Analytics (SQL DW) sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Modifica una definizione di tabella tramite la modifica, l'aggiunta o l'eliminazione di colonne e vincoli.Modifies a table definition by altering, adding, or dropping columns and constraints. ALTER TABLE consente inoltre di riassegnare e ricompilare partizioni, oltre a disabilitare e abilitare vincoli e trigger.ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

Per altre informazioni sulle convenzioni di sintassi, vedere Convenzioni della sintassi Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Importante

La sintassi di ALTER TABLE è diversa per le tabelle basate su disco e le tabelle ottimizzate per la memoria.The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. Usare i collegamenti seguenti per passare direttamente al blocco di sintassi appropriata per i tipi di tabella e agli esempi di sintassi appropriata:Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

Sintassi per le tabelle basate su discoSyntax for disk-based tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_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 | HIDDEN }
      | { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
    }
    [ WITH ( ONLINE = ON | OFF ) ]
    | [ WITH { CHECK | NOCHECK } ]
  
    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <column_set_definition>
    } [ ,...n ]
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
                [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
                system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
                   [ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
        ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
    | DROP
     [ {
         [ CONSTRAINT ][ IF EXISTS ]
         {
              constraint_name
              [ WITH
               ( <drop_clustered_constraint_option> [ ,...n ] )
              ]
          } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...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 ]
        [ WITH ( <low_priority_lock_wait> ) ]

    | SET
        (
            [ FILESTREAM_ON =
                { partition_scheme_name | filegroup | "default" | "NULL" } ]
            | SYSTEM_VERSIONING =
                  {
                      OFF
                  | ON
                      [ ( HISTORY_TABLE = schema_name . history_table_name
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
                          [, HISTORY_RETENTION_PERIOD =
                          {
                              INFINITE | number {DAY | DAYS | WEEK | WEEKS
                  | MONTH | MONTHS | YEAR | YEARS }
                          }
                          ]
                        )
                      ]
                  }
          )

    | REBUILD
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ]
      | [ PARTITION = partition_number
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]
  
    | <table_option>
    | <filetable_option>
    | <stretch_configuration>
}
[ ; ]
  
-- 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 ) ]
    }
  
<stretch_configuration> ::=
    {
      SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options>)
          | = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
          | ( <table_stretch_options> [, ...n] )
        }
            )
    }
  
<table_stretch_options> ::=
    {
     [ FILTER_PREDICATE = { null | table_predicate_function } , ]
       MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
    }
  
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }
    | ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
  
<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
        ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

Sintassi per le tabelle con ottimizzazione per la memoriaSyntax for memory-optimized tables

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

    | ALTER INDEX index_name
    {
        [ type_schema_name. ] type_name
        REBUILD
        [ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
        ]
    }

    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <table_index>
      | <column_index>
    } [ ,...n ]
  
    | DROP
     [ {
         CONSTRAINT [ IF EXISTS ]
         {
              constraint_name
          } [ ,...n ]
        | INDEX [ IF EXISTS ]
      {
         index_name
       } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }

    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | SWITCH [ [ PARTITION ] source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]
    
}
[ ; ]

-- ALTER TABLE options

< table_constraint > ::=
 [ CONSTRAINT constraint_name ]
{
   {PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
    | CHECK ( logical_expression )
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)}

<table_index> ::=
  INDEX index_name
{[ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
  | [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [WITH ( COMPRESSION_DELAY = {0 | delay [Minutes]})]
      [ ON filegroup_name | default ]
}


-- Syntax for Azure SQL Data Warehouse and Analytics Platform System

ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
    ALTER COLUMN column_name
        {
            type_name [ ( precision [ , scale ] ) ]
            [ COLLATE Windows_collation_name ]
            [ NULL | NOT NULL ]
        }
    | ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
    | DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
    | REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
      }
    | { SPLIT | MERGE } RANGE (boundary_value)
    | SWITCH [ PARTITION source_partition_number
        TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF )
}
[;]

<column_definition>::=
{
    column_name
    type_name [ ( precision [ , scale ] ) ]
    [ <column_constraint> ]
    [ COLLATE Windows_collation_name ]
    [ NULL | NOT NULL ]
}

<column_constraint>::=
    [ CONSTRAINT constraint_name ] DEFAULT constant_expression

<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

<single_partition_rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}

ArgomentiArguments

database_namedatabase_name
Nome del database in cui è stata creata la tabella.The name of the database in which the table was created.

schema_nameschema_name
Nome dello schema a cui appartiene la tabella.The name of the schema to which the table belongs.

table_nametable_name
Nome della tabella da modificare.The name of the table to be altered. 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.If the table isn't in the current database or contained by the schema owned by the current user, you must explicitly specify the database and schema.

ALTER COLUMNALTER COLUMN
Specifica che la colonna denominata deve essere cambiata o modificata.Specifies that the named column is to be changed or altered.

Non è consentita la modifica di queste colonne:The modified column can't be:

  • Colonna con tipo di dati timestamp.A column with a timestamp data type.

  • Colonna ROWGUIDCOL della tabella.The ROWGUIDCOL for the table.

  • Colonne calcolate o utilizzate in una colonna calcolata.A computed column or used in a computed column.

  • Colonne usate in statistiche generate dall'istruzione CREATE STATISTICS.Used in statistics generated by the CREATE STATISTICS statement. Fanno eccezione le colonne per cui il tipo di dati è varchar, nvarchar o varbinary oppure è rimasto invariatoUnless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. e le nuove dimensioni sono uguali o maggiori di quelle precedenti.And, the new size is equal to or greater than the old size. Oppure le colonne modificate da Not Null a Null.Or, if the column is changed from not null to null. È innanzitutto necessario rimuovere le statistiche utilizzando l'istruzione DROP STATISTICS.First, remove the statistics using the DROP STATISTICS statement.

    Nota

    Le statistiche generate in modo automatico da Query Optimizer vengono eliminate automaticamente da ALTER COLUMN.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • Colonne utilizzate in un vincolo PRIMARY KEY o [FOREIGN KEY] REFERENCES.Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • Colonne utilizzate in un vincolo CHECK o UNIQUE.Used in a CHECK or UNIQUE constraint. È in ogni caso possibile modificare la lunghezza di una colonna a lunghezza variabile usata in un vincolo CHECK o UNIQUE.But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • Colonne associate a una definizione DEFAULT.Associated with a default definition. Se il tipo di dati non viene modificato, è tuttavia possibile modificare la lunghezza, la precisione o la scala di una colonna.However, the length, precision, or scale of a column can be changed if the data type isn't changed.

Il tipo di dati di colonne text, ntext e image può essere modificato solo nei modi seguenti:The data type of text, ntext, and image columns can be changed only in the following ways:

  • Da text a varchar(max) , nvarchar(max) o xmltext to varchar(max), nvarchar(max), or xml
  • Da ntext a varchar(max) , nvarchar(max) o xmlntext to varchar(max), nvarchar(max), or xml
  • Da image a varbinary(max)image to varbinary(max)

Alcune modifiche del tipo di dati possono comportare la modifica dei dati.Some data type changes may cause a change in the data. Ad esempio, la modifica di una colonna nchar o nvarchar in char o varchar potrebbe causare la conversione di caratteri estesi.For example, changing a nchar or nvarchar column, to char or varchar, might cause the conversion of extended characters. Per altre informazioni, vedere CAST e CONVERT.For more information, see CAST and CONVERT. La riduzione della precisione o della scala di una colonna può causare il troncamento dei dati.Reducing the precision or scale of a column can cause data truncation.

Nota

Non è possibile modificare il tipo di dati di una colonna di una tabella partizionata.The data type of a column of a partitioned table can't be changed.

Il tipo di dati delle colonne 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.The data type of columns included in an index can't be changed unless the column is a varchar, nvarchar, or varbinary data type, and the new size is equal to or larger than the old size.

Le colonne incluse in un vincolo di chiave primaria non possono essere modificate da NOT NULL a NULL.A column included in a primary key constraint, can't be changed from NOT NULL to NULL.

Quando si usa Always Encrypted (senza enclave sicuri), se la colonna da modificare è crittografata con "ENCRYPTED WITH", è possibile modificare il tipo di dati in un tipo di dati compatibile, ad esempio da INT a BIGINT, ma non è possibile modificarne le impostazioni di crittografia.When using Always Encrypted (without secure enclaves), if the column being modified is encrypted with 'ENCRYPTED WITH', you can change the datatype to a compatible datatype (such as INT to BIGINT), but you can't change any encryption settings.

Quando si usa Always Encrypted con enclave sicuri, è possibile modificare qualsiasi impostazione di crittografia, se la chiave di crittografia che protegge la colonna (e la nuova chiave di crittografia della colonna, se si modifica la chiave) supporta i calcoli dell'enclave (crittografati con le chiavi master della colonna abilitate per le enclave).When using Always Encrypted with secure enclaves, you can change any encryption setting, if the column encryption key protecting the column (and the new column encryption key, if you're changing the key) support enclave computations (encrypted with enclave-enabled column master keys). Per informazioni dettagliate, vedere Always Encrypted con enclave sicuri.For details, see Always Encrypted with secure enclaves.

column_namecolumn_name
Nome della colonna da modificare, aggiungere o eliminare.The name of the column to be altered, added, or dropped. column_name può essere composto da un massimo di 128 caratteri.The column_name maximum is 128 characters. Nel caso di nuove colonne, è possibile omettere column_name per le colonne che sono state create con il tipo di dati timestamp.For new columns, you can omit column_name for columns created with a timestamp data type. Viene usato il nome timestamp se non si specifica il nome column_name per una colonna con il tipo di dati timestamp.The name timestamp is used if you don't specify column_name for a timestamp data type column.

Nota

Le nuove colonne vengono aggiunte dopo la modifica di tutte le colonne esistenti nella tabella.New columns are added after all existing columns in the table being altered.

[ type_schema_name .[ type_schema_name. ] type_name] type_name
Nuovo tipo di dati per la colonna modificata o tipo di dati per la colonna aggiunta.The new data type for the altered column, or the data type for the added column. Non è possibile specificare type_name per colonne esistenti di tabelle partizionate.You can't specify type_name for existing columns of partitioned tables. type_name può essere uno dei tipi seguenti:type_name can be any one of the following types:

  • Tipo di dati di sistema di SQL ServerSQL Server.A SQL ServerSQL Server system data type.
  • Tipo di dati alias basato su un tipo di dati di sistema di SQL ServerSQL Server.An alias data type based on a SQL ServerSQL Server system data type. Per consentirne l'uso in una definizione di tabella, si creano tipi di dati alias con l'istruzione CREATE TYPE.You create alias data types with the CREATE TYPE statement before they can be used in a table definition.
  • Tipo definito dall'utente (UDT) di .NET Framework.NET Framework e lo schema a cui appartiene.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. Per consentirne l'uso in una definizione di tabella, si creano tipi definiti dall'utente con l'istruzione CREATE TYPE.You create user-defined types with the CREATE TYPE statement before they can be used in a table definition.

Di seguito sono riportati i criteri per type_name di una colonna modificata:The following are criteria for type_name of an altered column:

  • Il tipo di dati precedente deve supportare la conversione implicita nel nuovo tipo di dati.The previous data type must be implicitly convertible to the new data type.
  • type_name non può essere timestamp.type_name can't be timestamp.
  • I valori predefiniti di ANSI_NULL sono sempre attivi per ALTER COLUMN. Se non diversamente specificato, la colonna ammette i valori Null.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • Il riempimento con ANSI_PADDING è sempre attivo per ALTER COLUMN.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • Se la colonna modificata è una colonna Identity, il tipo di dati di new_data_type deve supportare la proprietà Identity.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • L'impostazione corrente di SET ARITHABORT viene ignorata.The current setting for SET ARITHABORT is ignored. Il funzionamento di ALTER TABLE presume l'impostazione di ARITHABORT su ON.ALTER TABLE operates as if ARITHABORT is set to ON.

Nota

Se la clausola COLLATE è omessa, la modifica del tipo di dati di una colonna causa la modifica delle regole di confronto predefinite del database.If the COLLATE clause isn't specified, changing the data type of a column causes a collation change to the default collation of the database.

precisioneprecision
Precisione del tipo di dati specificato.The precision for the specified data type. Per altre informazioni sui valori di precisione validi, vedere Precisione, scala e lunghezza.For more information about valid precision values, see Precision, Scale, and Length.

scalascale
Scala per il tipo di dati specificato.The scale for the specified data type. Per altre informazioni sui valori di scala validi, vedere Precisione, scala e lunghezza.For more information about valid scale values, see Precision, Scale, and Length.

maxmax
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.Applies only to the varchar, nvarchar, and varbinary data types for storing 2^31-1 bytes of character, binary data, and of Unicode data.

xml_schema_collectionxml_schema_collection
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Viene applicato solo al tipo di dati xml per l'associazione di uno XML Schema al tipo.Applies only to the xml data type for associating an XML schema with the type. Prima di tipizzare una colonna xml in una raccolta di schemi, si crea la raccolta nel database usando CREATE XML SCHEMA COLLECTION.Before typing an xml column to a schema collection, you first create the schema collection in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < collation_name >COLLATE < collation_name >
Specifica le nuove regole di confronto per la colonna modificata.Specifies the new collation for the altered column. Se viene omesso, alla colonna vengono assegnate le regole di confronto predefinite del database.If not specified, the column is assigned the default collation of the database. È possibile usare nomi di regole di confronto di Windows o SQL.Collation name can be either a Windows collation name or a SQL collation name. Per un elenco e altre informazioni, vedere Nome delle regole di confronto di Windows e Nome delle regole di confronto di SQL Server.For a list and more information, see Windows Collation Name and SQL Server Collation Name.

La clausola COLLATE modifica le regole di confronto solo per le colonne con tipo di dati char, varchar, nchar e nvarchar.The COLLATE clause changes the collations only of columns of the char, varchar, nchar, and nvarchar data types. Per modificare le regole di confronto di una colonna con un tipo di dati alias definito dall'utente, usare istruzioni ALTER TABLE separate in modo da modificare il tipo di dati della colonna in un tipo di dati di sistema SQL ServerSQL Server.To change the collation of a user-defined alias data type column, use separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type. Modificare quindi le regole di confronto e ripristinare un tipo di dati alias per la colonna.Then, change its collation and change the column back to an alias data type.

Non è possibile specificare una modifica delle regole di confronto per ALTER COLUMN se si verifica una delle condizioni seguenti:ALTER COLUMN can't have a collation change if one or more of the following conditions exist:

  • Un vincolo CHECK o FOREIGN KEY o una colonna calcolata fa riferimento alla colonna modificata.If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • Nella colonna viene creato un indice, un indice full-text o una serie di statistiche.If any index, statistics, or full-text index are created on the column. Le statistiche create automaticamente nella colonna modificata vengono eliminate se si modificano le regole di confronto della colonna.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • Una funzione o una vista associata allo schema fa riferimento alla colonna.If a schema-bound view or function references the column.

Per altre informazioni, vedere COLLATE.For more information, see COLLATE.

NULL | NOT NULLNULL | NOT NULL
Specifica se la colonna consente valori Null.Specifies whether the column can accept null values. 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.Columns that don't allow null values are added with ALTER TABLE only if they have a default specified or if the table is empty. È possibile specificare NOT NULL per le colonne calcolate solo se è specificato anche PERSISTED.You can specify NOT NULL for computed columns only if you've also specified 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.If the new column allows null values and you don't specify a default, the new column contains a null value for each row in the table. Se a una nuova colonna che consente valori Null si aggiunge una definizione DEFAULT, è possibile usare WITH VALUES per l'archiviazione del valore predefinito nella nuova colonna per ogni riga della tabella.If the new column allows null values and you add a default definition with the new column, you can use WITH VALUES to store the default value in the new column for each existing row in the table.

Se la nuova colonna non consente valori Null e la tabella non è vuota, è necessario aggiungervi una definizione DEFAULT.If the new column doesn't allow null values and the table isn't empty, you have to add a DEFAULT definition with the new column. Il valore predefinito viene quindi caricato automaticamente in ogni riga esistente delle nuove colonne.And, the new column automatically loads with the default value in the new columns in each existing row.

È possibile specificare NULL in ALTER COLUMN per forzare l'uso di valori Null nelle colonne NOT NULL, fatta eccezione per le colonne nei vincoli PRIMARY KEY.You can specify NULL in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. È possibile specificare NOT NULL in ALTER COLUMN solo se la colonna non contiene valori Null.You can specify NOT NULL in ALTER COLUMN only if the column contains no null values. Per utilizzare ALTER COLUMN NOT NULL, è necessario aggiornare i valori Null con un valore specifico, ad esempio:The null values must be updated to some value before the ALTER COLUMN NOT NULL is allowed, for example:

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'uso dei valori Null del tipo di dati usato in una definizione di colonna. In questo caso, tale impostazione può essere sostituita.When you create or alter a table with the CREATE TABLE or ALTER TABLE statements, the database and session settings influence and possibly override the nullability of the data type that's used in a column definition. Nel caso di colonne non calcolate, assicurarsi di definire sempre in modo esplicito una colonna come NULL o NOT NULL.Be sure that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

Se si aggiunge una colonna con un tipo di dati definito dall'utente, assicurarsi di definire per la colonna la stessa impostazione relativa al supporto dei valori Null del tipo di dati definito dall'utente.If you add a column with a user-defined data type, be sure to define the column with the same nullability as the user-defined data type. Specificare quindi un valore predefinito per la colonna.And, specify a default value for the column. Per altre informazioni, vedere CREATE TABLE.For more information, see CREATE TABLE.

Nota

Se si specifica NULL o NOT NULL con ALTER COLUMN, è necessario specificare anche new_data_type [(precision [, scale ])].If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. Se il tipo di dati, la precisione e la scala non vengono modificati, specificare i valori correnti della colonna.If the data type, precision, and scale are not changed, specify the current column values.

[ {ADD | DROP} ROWGUIDCOL ][ {ADD | DROP} ROWGUIDCOL ]
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica l'aggiunta o l'eliminazione della proprietà ROWGUIDCOL nella colonna specificata.Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL indica che la colonna è di tipo rowguid.ROWGUIDCOL indicates that the column is a row GUID column. È possibile impostare come colonna ROWGUIDCOL una sola colonna di tipo uniqueidentifier per ogni tabella.You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. È inoltre possibile assegnare la proprietà ROWGUIDCOL solo a una colonna uniqueidentifier.And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. Non è possibile assegnare ROWGUIDCOL a una colonna con un tipo di dati definito dall'utente.You can't assign ROWGUIDCOL to a column of a user-defined data type.

ROWGUIDCOL non impone l'unicità dei valori archiviati nella colonna e non genera automaticamente valori per le nuove righe inserite nella tabella.ROWGUIDCOL doesn't enforce uniqueness of the values stored in the column and doesn't automatically generate values for new rows that are inserted into the table. Per generare valori univoci per ogni colonna, usare la funzione NEWID o NEWSEQUENTIALID nelle istruzioni INSERT.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. In alternativa, specificare la funzione NEWID o NEWSEQUENTIALID come valore predefinito per la colonna.Or, specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADD | DROP} PERSISTED ][ {ADD | DROP} PERSISTED ]
Specifica l'aggiunta o l'eliminazione della proprietà PERSISTED nella colonna specificata.Specifies that the PERSISTED property is added to or dropped from the specified column. La colonna interessata deve essere una colonna calcolata definita con un'espressione deterministica.The column must be a computed column that's defined with a deterministic expression. Per le colonne specificate come PERSISTED, nel Motore di databaseDatabase Engine sono archiviati fisicamente i valori calcolati nella tabella e aggiornati i valori durante l'aggiornamento delle altre colonne da cui le colonne calcolate dipendono.For columns specified as PERSISTED, the Motore di databaseDatabase Engine physically stores the computed values in the table and updates the values when any other columns on which the computed column depends are updated. Se si contrassegna una colonna calcolata come PERSISTED, è possibile creare indici in colonne calcolate definite in base a espressioni deterministiche ma imprecise.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. Per altre informazioni, vedere Indici per le colonne calcolate.For more information, see Indexes on Computed Columns.

Tutte le colonne calcolate usate come colonne di partizionamento di tabelle partizionate devono essere contrassegnate come PERSISTED in modo esplicito.Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica che i valori vengono incrementati nelle colonne Identity quando gli agenti di replica eseguono operazioni di inserimento.Specifies that values are incremented in identity columns when replication agents carry out insert operations. È possibile specificare questa clausola solo se column_name corrisponde a una colonna Identity.You can specify this clause only if column_name is an identity column.

SPARSESPARSE
Indica che la colonna è di tipo sparse.Indicates that the column is a sparse column. L'archiviazione delle colonne di tipo sparse è ottimizzata per valori Null.The storage of sparse columns is optimized for null values. Non è possibile impostare le colonne di tipo sparse come NOT NULL.You can't set sparse columns as 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.Converting a column from sparse to nonsparse or from nonsparse to sparse, locks the table for the duration of the command execution. Potrebbe essere necessario utilizzare la clausola REBUILD per recuperare spazio.You may need to use the REBUILD clause to reclaim any space savings. Per altre restrizioni e informazioni relative alle colonne di tipo sparse, vedere Usare le colonne di tipo sparse.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
Si applica a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later) and Database SQL di AzureAzure SQL Database.

Specifica una maschera dati dinamica.Specifies a dynamic data mask. mask_function è il nome della funzione di maschera con i parametri appropriati.mask_function is the name of the masking function with the appropriate parameters. Sono disponibili tre funzioni:Three functions are available:

  • default()default()
  • email()email()
  • partial()partial()
  • random()random()

Per eliminare una maschera, usare DROP MASKED.To drop a mask, use DROP MASKED. Per i parametri di funzione, vedere Mascheramento dati dinamici.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <come si applica alla modifica di una colonna>WITH ( ONLINE = ON | OFF) <as applies to altering a column>
Si applica a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later) and Database SQL di AzureAzure SQL Database.

Consente l'esecuzione di molte azioni di modifica colonna mentre la tabella rimane disponibile.Allows many alter column actions to be carried out while the table remains available. L'impostazione predefinita è OFF.Default is OFF. È possibile eseguire l'operazione di modifica colonna online per le modifiche relative al tipo di dati, alla lunghezza o precisione della colonna, al supporto dei valori Null, all'impostazione del tipo sparse e alle regole di confronto.You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

L'operazione di modifica colonna online consente alle statistiche automatiche o create dall'utente di fare riferimento alla colonna modificata per la durata dell'operazione ALTER COLUMN, il che consente di eseguire le query come al solito.Online alter column allows user created and autostatistics to reference the altered column for the duration of the ALTER COLUMN operation, which allows queries to run as usual. Al termine dell'operazione, le statistiche automatiche che fanno riferimento alla colonna vengono eliminate e le statistiche create dall'utente vengono invalidate.At the end of the operation, autostats that reference the column are dropped and user-created stats are invalidated. L'utente deve aggiornare manualmente le statistiche generate dall'utente dopo il completamento dell'operazione.The user must manually update user-generated statistics after the operation is completed. Se la colonna fa parte di un'espressione filtro per statistiche o indici, non è possibile eseguire un'operazione di modifica colonna.If the column is part of a filter expression for any statistics or indexes then you can't perform an alter column operation.

  • Durante l'esecuzione di un'operazione di modifica colonna online, tutte le operazioni che potrebbero dipendere dalla colonna (indici, viste e così via) vengono bloccate o hanno esito negativo generando un errore appropriato.While the online alter column operation is running, all operations that could take a dependency on the column (index, views, and so on.) block or fail with an appropriate error. Questo comportamento garantisce che l'operazione di modifica colonna online non avrà esito negativo a causa delle dipendenze introdotte durante l'esecuzione dell'operazione.This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • La modifica di una colonna da NOT NULL a NULL non è supportata come operazione online quando gli indici non cluster fanno riferimento alla colonna modificata.Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • La modifica online non è supportata quando un vincolo CHECK fa riferimento alla colonna e l'operazione di modifica limita la precisione della colonna (valori numerici o datetime).Online alter isn't supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).
  • L'opzione WAIT_AT_LOW_PRIORITY non può essere usata con l'operazione di modifica colonna online.The WAIT_AT_LOW_PRIORITY option can't be used with online alter column.
  • ALTER COLUMN ... ADD/DROP PERSISTED non è supportato per l'operazione di modifica colonna online.ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION non è interessato dall'operazione di modifica colonna online.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • L'operazione di modifica colonna online non supporta la modifica di una tabella in cui è abilitato il rilevamento modifiche o che è una tabella di pubblicazione della replica di tipo merge.Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • L'operazione di modifica colonna online non supporta la modifica dai tipi di dati CLR o viceversa.Online alter column doesn't support altering from or to CLR data types.
  • L'operazione di modifica colonna online non supporta la modifica in un tipo di dati XML con una raccolta di schemi diversa dalla raccolta di schemi corrente.Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • L'operazione di modifica colonna online non consente di ridurre le restrizioni che stabiliscono quando una colonna può essere modificata.Online alter column doesn't reduce the restrictions on when a column can be altered. Riferimenti da indici/statistiche e così via potrebbero causare l'esito negativo dell'operazione di modifica.References by index/stats, and so on, might cause the alter to fail.
  • L'operazione di modifica colonna online non supporta la modifica di più colonne contemporaneamente.Online alter column doesn't support altering more than one column concurrently.
  • L'operazione di modifica colonna online non influisce in caso di una tabella temporale con controllo delle versioni di sistema.Online alter column has no effect in a system-versioned temporal table. La colonna ALTER non viene eseguita online indipendentemente dal valore che è stato specificato per l'opzione ONLINE.ALTER column isn't run as online regardless of which value was specified for ONLINE option.

L'operazione di modifica colonna online prevede requisiti, restrizioni e funzionalità simili a quelli dell'operazione di ricompilazione indice online, ad esempio:Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • L'operazione di ricompilazione indice online non è supportata quando la tabella contiene colonne LOB o filestream legacy oppure quando la tabella include un indice columnstore.Online index rebuild isn't supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. Le stesse limitazioni si applicano all'operazione di modifica colonna online.The same limitations apply for online alter column.
  • La modifica di una colonna esistente richiede un'allocazione dello spazio doppia: per la colonna originale e per la colonna nascosta appena creata.An existing column being altered requires twice the space allocation, for the original column and for the newly created hidden column.
  • La strategia di blocco durante un'operazione di modifica colonna online segue lo stesso criterio di blocco usato per l'operazione di compilazione indice online.The locking strategy during an alter column online operation follows the same locking pattern used for online index build.

WITH CHECK | WITH NOCHECKWITH CHECK | WITH NOCHECK
Specifica se i dati nella tabella vengono convalidati in base a un vincolo FOREIGN KEY o CHECK nuovo o riabilitato.Specifies whether the data in the table is or isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Se non lo si specifica, viene usata la clausola WITH CHECK per nuovi vincoli e WITH NOCHECK per vincoli riabilitati.If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Se non si vogliono verificare nuovi vincoli CHECK o FOREIGN KEY in base ai dati esistenti, usare WITH NOCHECK.If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. È tuttavia consigliabile effettuare questa scelta solo in casi rari.We don't recommend doing this, except in rare cases. Il nuovo vincolo viene valutato in tutti gli aggiornamenti successivi dei dati.The new constraint is evaluated in all later data updates. 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 non seguono il vincolo.Any constraint violations that are suppressed by WITH NOCHECK when the constraint is added may cause future updates to fail if they update rows with data that doesn't follow the constraint.

Nota

Query Optimizer non considera i vincoli definiti con WITH NOCHECK,The query optimizer doesn't consider constraints that are defined WITH NOCHECK. i quali vengono ignorati finché non vengono riabilitati mediante ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.Such constraints are ignored until they are re-enabled by using ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

ALTER INDEX index_nameALTER INDEX index_name
Specifica che il numero di bucket per index_name deve essere cambiato o modificato.Specifies that the bucket count for index_name is to be changed or altered.

La sintassi ALTER TABLE … ADD/DROP/ALTER INDEX è supportata solo per le tabelle ottimizzate per la memoria.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Se non si usa l'istruzione ALTER TABLE, le istruzioni CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX non sono supportate per gli indici nelle tabelle ottimizzate per la memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

ADDADD
Specifica l'aggiunta di una o più definizioni di colonna, definizioni di colonna calcolata o vincoli di tabella.Specifies that one or more column definitions, computed column definitions, or table constraints are added. In alternativa, specifica l'aggiunta delle colonne che il sistema usa per il controllo delle versioni di sistema.Or, the columns that the system uses for system versioning are added. Per le tabelle ottimizzate per la memoria, è possibile aggiungere un indice.For memory-optimized tables, you can add an index.

Nota

Le nuove colonne vengono aggiunte dopo la modifica di tutte le colonne esistenti nella tabella.New columns are added after all existing columns in the table being altered.

Importante

Se non si usa l'istruzione ALTER TABLE, le istruzioni CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX non sono supportate per gli indici nelle tabelle ottimizzate per la memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX aren't supported for indexes on memory-optimized tables.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Si applica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) and later) and Database SQL di AzureAzure SQL Database.

Specifica i nomi delle colonne che il sistema usa per registrare il periodo di validità di un record.Specifies the names of the columns that the system uses to record the period of time for which a record is valid. È possibile specificare le colonne esistenti o creare nuove colonne come parte dell'argomento ADD PERIOD FOR SYSTEM_TIME.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. Configurare le colonne con il tipo di dati datetime2 e definirle come NOT NULL.Set up the columns with the datatype of datetime2 and define them as NOT NULL. Se si definisce una colonna periodo NULL, verrà generato un errore.If you define a period column as NULL, an error results. È possibile definire un oggetto column_constraint e/o specificare i valori predefiniti per le colonne system_start_time e system_end_time.You can define a column_constraint and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. Vedere l'esempio A negli esempi di Controllo delle versioni di sistema seguenti, che illustrano l'uso di un valore predefinito per la colonna system_end_time.See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

Usare questo argomento con l'argomento SET SYSTEM_VERSIONING per abilitare il controllo delle versioni di sistema in una tabella esistente.Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Per altre informazioni, vedere Tabelle temporali e Introduzione alle tabelle temporali nel database SQL di Azure.For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

A partire da SQL Server 2017 (14.x)SQL Server 2017 (14.x), gli utenti possono contrassegnare una o entrambe le colonne periodo con il flag HIDDEN per nascondere in modo implicito tali colonne. In questo modo, SELECT * FROM <table_name> non restituirà un valore per le colonne.As of SQL Server 2017 (14.x)SQL Server 2017 (14.x), users can mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM <table_name> doesn't return a value for the columns. Per impostazione predefinita, le colonne periodo non vengono nascoste.By default, period columns aren't hidden. Per poter essere usate, le colonne nascoste devono essere incluse in modo esplicito in tutte le query che fanno direttamente riferimento alla tabella temporale.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
Specifica la rimozione di una o più definizioni di colonna, definizioni di colonna calcolata o vincoli di tabella o l'eliminazione della specifica per le colonne che il sistema usa per il controllo delle versioni di sistema.Specifies that one or more column definitions, computed column definitions, or table constraints are dropped, or to drop the specification for the columns that the system uses for system versioning.

CONSTRAINT constraint_nameCONSTRAINT constraint_name
Specifica che constraint_name viene rimosso dalla tabella.Specifies that constraint_name is removed from the table. È possibile elencare più vincoli.Multiple constraints can be listed.

È possibile determinare il nome del vincolo definito dall'utente o fornito dal sistema tramite l'esecuzione di una query sulle viste del catalogo sys.check_constraint, sys.default_constraints, sys.key_constraints e sys.foreign_keys.You can determine the user-defined or system-supplied name of the constraint by querying the sys.check_constraint, sys.default_constraints, sys.key_constraints, and sys.foreign_keys catalog views.

Se nella tabella è presente un indice XML, non è possibile eliminare un vincolo PRIMARY KEY.A PRIMARY KEY constraint can't be dropped if an XML index exists on the table.

INDEX index_nameINDEX index_name
Specifica che index_name viene rimosso dalla tabella.Specifies that index_name is removed from the table.

La sintassi ALTER TABLE … ADD/DROP/ALTER INDEX è supportata solo per le tabelle ottimizzate per la memoria.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Importante

Se non si usa l'istruzione ALTER TABLE, le istruzioni CREATE INDEX, DROP INDEX, ALTER INDEX e PAD_INDEX non sono supportate per gli indici nelle tabelle ottimizzate per la memoria.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

COLUMN column_nameCOLUMN column_name
Specifica che constraint_name o column_name viene rimosso dalla tabella.Specifies that constraint_name or column_name is removed from the table. È possibile elencare più colonne.Multiple columns can be listed.

Non è possibile eliminare una colonna se:A column can't be dropped when it's:

  • È usata in un indice, come colonna chiave o come INCLUDEUsed in an index, whether as a key column or as an INCLUDE
  • Viene utilizzata in un vincolo CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.
  • È associata a un valore predefinito creato con la parola chiave DEFAULT o a un oggetto predefinito.Associated with a default that's defined with the DEFAULT keyword, or bound to a default object.
  • È associata a una regola.Bound to a rule.

Nota

L'eliminazione di una colonna non consente di recuperare lo spazio su disco corrispondente.Dropping a column doesn't reclaim the disk space of the column. 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.You may have to reclaim the disk space of a dropped column when the row size of a table is near, or has exceeded, its limit. Per recuperare spazio, creare un indice cluster nella tabella o ricompilare un indice cluster esistente usando ALTER INDEX.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. Per informazioni sull'impatto dell'eliminazione dei tipi di dati LOB, vedere questo intervento sul blog di CSS.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIMEPERIOD FOR SYSTEM_TIME
Si applica a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later) and Database SQL di AzureAzure SQL Database.

Elimina la specifica per le colonne che il sistema userà per il controllo delle versioni di sistema.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option>WITH <drop_clustered_constraint_option>
Specifica l'impostazione di una o più opzioni di eliminazione dei vincoli cluster.Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Esegue l'override dell'opzione di configurazione max degree of parallelism solo per la durata dell'operazione.Overrides the max degree of parallelism configuration option only for the duration of the operation. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

L'opzione MAXDOP consente di limitare il numero di processori utilizzati per l'esecuzione di piani paralleli.Use the MAXDOP option to limit the number of processors used in parallel plan execution. Il valore massimo è 64 processori.The maximum is 64 processors.

max_degree_of_parallelism può essere uno dei valori seguenti:max_degree_of_parallelism can be one of the following values:

11
Disattiva la generazione di piani paralleli.Suppresses parallel plan generation.

>1>1
Limita il numero massimo di processori utilizzati in un'operazione parallela sull'indice in base al numero specificato.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (predefinito)0 (default)
Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.Uses the actual number of processors or fewer based on the current system workload.

Per altre informazioni, vedere Configurazione di operazioni parallele sugli indici.For more information, see Configure Parallel Index Operations.

Nota

Le operazioni parallele sugli indici non sono disponibili in tutte le edizioni di SQL ServerSQL Server.Parallel index operations aren't available in every edition of SQL ServerSQL Server. Per altre informazioni, vedere Edizioni e funzionalità supportate per SQL Server 2016 e Edizioni e funzionalità supportate per SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

ONLINE = { ON | OFF } <come si applica a drop_clustered_constraint_option>ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>
Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e la modifica dei dati durante l'operazione sugli indici.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Il valore predefinito è OFF.The default is OFF. È possibile eseguire REBUILD come operazione ONLINE.You can run REBUILD as an ONLINE operation.

ONON
I blocchi di tabella a lungo termine non vengono mantenuti per la durata dell'operazione sugli indici.Long-term table locks aren't held for the duration of the index operation. Durante la fase principale dell'operazione viene mantenuto solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Questo comportamento consente l'esecuzione di query o l'aggiornamento della tabella sottostante e degli indici.This behavior enables queries or updates to the underlying table and indexes to continue. All'inizio dell'operazione viene mantenuto un blocco condiviso (S) sull'oggetto di origine per un breve periodo.At the start of the operation, a Shared (S) lock is held on the source object for a short time. Al termine dell'operazione, per un breve periodo viene acquisito un blocco condiviso (S) sull'origine, se viene creato un indice non cluster.At the end of the operation, for a short time, an S (Shared) lock is acquired on the source if a nonclustered index is being created. In alternativa, viene acquisito un blocco di modifica dello schema (SCH-M) quando un indice cluster viene creato o eliminato online e quando un indice cluster o non cluster viene ricompilato.Or, an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. L'opzione ONLINE non può essere impostata su ON quando viene creato un indice per una tabella temporanea locale.ONLINE can't be set to ON when an index is being created on a local temporary table. È consentita solo l'operazione di ricompilazione dell'heap a thread singolo.Only single-threaded heap rebuild operation is allowed.

Per eseguire l'istruzione DDL per un'operazione SWITCH o la ricompilazione dell'indice online, è necessario completare tutte le transazioni bloccanti attive in esecuzione in una specifica tabella.To run the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Durante l'esecuzione, l'operazione SWITCH o di ricompilazione impedisce l'avvio di nuove transazioni e può influire in modo significativo sulla velocità effettiva del carico di lavoro e ritardare temporaneamente l'accesso alla tabella sottostante.When executing, the SWITCH or rebuild operation prevents new transactions from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
I blocchi di tabella si applicano per la durata dell'operazione sugli indici.Table locks apply for the duration of the index operation. 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.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Il blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione.This lock prevents all user access to the underlying table for the duration of the operation. Un'operazione sugli indici offline che crea un indice non cluster acquisisce un blocco condiviso (S) sulla tabella.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Il blocco impedisce l'aggiornamento della tabella sottostante ma consente operazioni di lettura, ad esempio l'esecuzione di istruzioni SELECT.This lock prevents updates to the underlying table but allows read operations, such as SELECT statements. Sono consentite operazioni di ricompilazione dell'heap multithread.Multi-threaded heap rebuild operations are allowed.

Per altre informazioni, vedere Funzionamento delle operazioni sugli indici online.For more information, see How Online Index Operations Work.

Nota

Le operazioni sugli indici online sono disponibili solo in alcune edizioni di SQL ServerSQL Server.Online index operations are not available in every edition of SQL ServerSQL Server. Per altre informazioni, vedere Edizioni e funzionalità supportate per SQL Server 2016 e Edizioni e funzionalità supportate per SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVE TO { partition_scheme_name ( column_name [ 1 , ... n] ) | filegroup | " default " }MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " }
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica una posizione in cui spostare le righe di dati attualmente presenti a livello foglia nell'indice cluster.Specifies a location to move the data rows currently in the leaf level of the clustered index. La tabella viene spostata nella nuova posizione.The table is moved to the new location. Questa opzione è valida solo per i vincoli che creano un indice cluster.This option applies only to constraints that create a clustered index.

Nota

In questo contesto default non è una parola chiave,In this context, default isn't a keyword. ma un identificatore per il filegroup predefinito e deve essere delimitato, come in MOVE TO " default " o MOVE TO [ default ] .It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. Se si specifica " " default " , l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Si tratta dell'impostazione predefinita.This is the default setting. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT{ CHECK | NOCHECK } CONSTRAINT
Specifica che constraint_name è abilitato o disabilitato.Specifies that constraint_name is enabled or disabled. È possibile utilizzare questa opzione solo con vincoli FOREIGN KEY e CHECK.This option can only be used with FOREIGN KEY and CHECK constraints. 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.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. I vincoli DEFAULT, PRIMARY KEY e UNIQUE non possono essere disabilitati.DEFAULT, PRIMARY KEY, and UNIQUE constraints can't be disabled.

ALLALL
Specifica che tutti i vincoli sono disabilitati con l'opzione NOCHECK o abilitati con l'opzione CHECK.Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER{ ENABLE | DISABLE } TRIGGER
Specifica che trigger_name è abilitato o disabilitato.Specifies that trigger_name is enabled or disabled. Quando un trigger è disabilitato, è comunque definito per la tabella.When a trigger is disabled, it's still defined for the table. Tuttavia, quando si esegue un'istruzione INSERT, UPDATE o DELETE sulla tabella, le azioni nel trigger vengono eseguite solo dopo che il trigger è stato abilitato nuovamente.However, when INSERT, UPDATE, or DELETE statements run against the table, the actions in the trigger aren't carried out until the trigger is re-enabled.

ALLALL
Specifica che tutti i trigger della tabella sono abilitati o disabilitati.Specifies that all triggers in the table are enabled or disabled.

trigger_nametrigger_name
Specifica il nome del trigger da abilitare o disabilitare.Specifies the name of the trigger to disable or enable.

{ ENABLE | DISABLE } CHANGE_TRACKING{ ENABLE | DISABLE } CHANGE_TRACKING
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica se il rilevamento delle modifiche è abilitato o disabilitato per la tabella.Specifies whether change tracking is enabled disabled for the table. Per impostazione predefinita, il rilevamento delle modifiche è disabilitato.By default, change tracking is disabled.

Questa opzione è disponibile solo quando il rilevamento delle modifiche è abilitato per il database.This option is available only when change tracking is enabled for the database. Per altre informazioni, vedere Opzioni ALTER DATABASE SET.For more information, see ALTER DATABASE SET Options.

Per abilitare il rilevamento delle modifiche, nella tabella deve essere presente una chiave primaria.To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica se nel Motore di databaseDatabase Engine viene tenuta traccia delle colonne con rilevamento delle modifiche abilitato che sono state aggiornate.Specifies whether the Motore di databaseDatabase Engine tracks, which change tracked columns were updated. Il valore predefinito è OFF.The default value is OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name .SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Trasferisce un blocco di dati in uno dei modi seguenti:Switches a block of data in one of the following ways:

  • Riassegna tutti i dati di una tabella come partizione a una tabella partizionata già esistente.Reassigns all data of a table as a partition to an already-existing partitioned table.
  • Sposta una partizione da una tabella partizionata a un'altra.Switches a partition from one partitioned table to another.
  • Riassegna tutti i dati in una partizione di una tabella partizionata a una tabella non partizionata esistente.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Se table è una tabella partizionata, è necessario specificare source_partition_number_expression.If table is a partitioned table, you must specify source_partition_number_expression. Se target_table è partizionata, è necessario specificare target_partition_number_expression.If target_table is partitioned, you must specify target_partition_number_expression. Quando 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.When reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

Quando si riassegnano i dati di una partizione per formare un'unica tabella, la tabella di destinazione deve esistere già ed essere vuota.When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. Sia la tabella o la partizione di origine che la tabella o la partizione di destinazione devono trovarsi nello stesso filegroup.Both the source table or partition, and the target table or partition, must be located in the same filegroup. È inoltre necessario che gli indici o le partizioni degli indici corrispondenti si trovino nello stesso filegroup.The corresponding indexes, or index partitions, must also be located in the same filegroup. Al trasferimento di partizioni vengono applicate molte ulteriori restrizioni.Many additional restrictions apply to switching partitions. table e target_table non possono essere la stessa tabella.table and target_table can't be the same. target_table può essere un identificatore in più parti.target_table can be a multi-part identifier.

source_partition_number_expression e target_partition_number_expression sono espressioni costanti che possono fare riferimento a variabili e funzioni.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. incluse variabili con tipo definito dall'utente (UDT) e funzioni definite dall'utente,These include user-defined type variables and user-defined functions. ma che non possono fare riferimento a espressioni Transact-SQLTransact-SQL.They can't reference Transact-SQLTransact-SQL expressions.

Una tabella partizionata con un indice columstore cluster ha lo stesso comportamento di un heap partizionato:A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • La chiave primaria deve includere la chiave di partizione.The primary key must include the partition key.
  • La chiave di partizione deve essere inclusa in indice univoco.A unique index must include the partition key. Ma l'inclusione della chiave di partizione con un indice univoco esistente può modificarne l'univocità.But, including the partition key with an existing unique index can change the uniqueness.
  • Per cambiare le partizioni, tutti gli indici non cluster devono includere la chiave di partizione.To switch partitions, all nonclustered indexes must include the partition key.

Per la restrizione SWITCH durante la replica, vedere Replicare tabelle e indici partizionati.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

Gli indici columnstore non cluster compilati per SQL ServerSQL Server 2016 CTP1 e per il database SQL prima della versione V12 sono in un formato di sola lettura.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. Prima di poter eseguire un'operazione PARTITION, è necessario ricompilare gli indici columnstore non cluster nel formato corrente, vale a dire in un formato aggiornabile.You must rebuild Nonclustered columnstore indexes to the current format (which is updatable) before any PARTITION operations can be run.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " } )SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later). Database SQL di AzureAzure SQL Database non supporta FILESTREAM.doesn't support FILESTREAM.

Specifica dove vengono archiviati i dati FILESTREAM.Specifies where FILESTREAM data is stored.

L'istruzione ALTER TABLE con la clausola SET FILESTREAM_ON viene eseguita in modo corretto solo se nella tabella non sono presenti colonne FILESTREAM.ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. È possibile aggiungere colonne FILESTREAM tramite una seconda istruzione ALTER TABLE.You can add FILESTREAM columns by using a second ALTER TABLE statement.

Se si specifica partition_scheme_name, vengono applicate le regole per CREATE TABLE.If you specify partition_scheme_name, the rules for CREATE TABLE apply. Assicurarsi che la tabella sia già partizionata per i dati delle righe e che il relativo schema di partizione usi la stessa funzione e le stesse colonne di partizione dello schema di partizione FILESTREAM.Be sure the table is already partitioned for row data, and its partition scheme uses the same partition function and columns as the FILESTREAM partition scheme.

filestream_filegroup_name specifica il nome di un filegroup FILESTREAM.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. È necessario che per il filegroup sia definito un file tramite un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.The filegroup must have one file that's defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error results.

" default " specifica il filegroup FILESTREAM con il set di proprietà DEFAULT." default " specifies the FILESTREAM filegroup with the DEFAULT property set. Se non è presente alcun filegroup FILESTREAM, viene generato un errore.If there's no FILESTREAM filegroup, an error results.

" NULL " specifica che tutti i riferimenti al filegroup FILESTREAM per la tabella vengono rimossi." NULL " specifies that all references to FILESTREAM filegroups for the table are removed. È necessario eliminare innanzitutto tutte le colonne FILESTREAM.All FILESTREAM columns must be dropped first. Usare SET FILESTREAM_ON =" NULL " per eliminare tutti i dati FILESTREAM associati a una tabella.Use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that's associated with a table.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name .SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )
Si applica a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later) and Database SQL di AzureAzure SQL Database.

Disabilita o abilita il controllo delle versioni di sistema di una tabella.Either disables or enables system versioning of a table. Per abilitare il controllo delle versioni di sistema di una tabella, il sistema verifica che il tipo di dati, il vincolo per il supporto dei valori Null e i requisiti di vincolo della chiave primaria per il controllo delle versioni di sistema siano soddisfatti.To enable system versioning of a table, the system verifies that the datatype, nullability constraint, and primary key constraint requirements for system versioning are met. Se non si usa l'argomento HISTORY_TABLE, il sistema genera una nuova tabella di cronologia corrispondente allo schema della tabella corrente, crea un collegamento tra le due tabelle e consente al sistema di registrare la cronologia di ogni record nella tabella corrente della tabella di cronologia.If you don't use the HISTORY_TABLE argument, the system generates a new history table matching the schema of the current table, creates a link between the two tables, and enables the system to record the history of each record in the current table in the history table. Il nome di questa tabella di cronologia sarà MSSQL_TemporalHistoryFor<primary_table_object_id>.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. Se si usa l'argomento HISTORY_TABLE per creare un collegamento e usare una tabella di cronologia esistente, il sistema crea un collegamento tra la tabella corrente e la tabella specificata.If you use the HISTORY_TABLE argument to create a link to and use an existing history table, the system creates a link between the current table and the specified table. Quando si crea un collegamento a una tabella di cronologia esistente, è possibile scegliere di eseguire una verifica coerenza dei dati.When creating a link to an existing history table, you can choose to do a data consistency check. Questa verifica coerenza dei dati garantisce che i record esistenti non si sovrappongano.This data consistency check ensures that existing records don't overlap. L'impostazione predefinita prevede l'esecuzione della verifica coerenza dei dati.Running the data consistency check is the default. Per altre informazioni, vedere Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }
Si applica a: SQL Server 2017 (14.x)SQL Server 2017 (14.x) e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Database SQL di AzureAzure SQL Database.

Specifica il periodo di conservazione finito o infinito per i dati cronologici in una tabella temporale.Specifies finite or infinite retention for historical data in a temporal table. Se è omesso, si applicherà il periodo di conservazione infinito.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica i metodi consentiti di escalation blocchi per una tabella.Specifies the allowed methods of lock escalation for a table.

AUTOAUTO
Questa opzione consente al Motore di database di SQL ServerSQL Server Database Engine di selezionare la granularità dell'escalation blocchi appropriata per lo schema della tabella.This option allows Motore di database di SQL ServerSQL Server Database Engine to select the lock escalation granularity that's appropriate for the table schema.

  • Se la tabella è partizionata, sarà consentita l'escalation dei blocchi nella granularità a livello di heap o albero B (HoBT).If the table is partitioned, lock escalation will be allowed to the heap or B-tree (HoBT) granularity. In altre parole, l'escalation sarà consentita al livello di partizione.In other words, escalation will be allowed to the partition level. Una volta eseguita l'escalation del blocco nel livello HoBT, non verrà eseguita alcuna successiva escalation del blocco nella granularità TABLE.After the lock is escalated to the HoBT level, the lock will not be escalated later to TABLE granularity.
  • Se la tabella non è partizionata, l'escalation blocchi viene eseguita nella granularità TABLE.If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLETABLE
L'escalation blocchi viene eseguita con una granularità a livello di tabella, indipendentemente dal partizionamento o meno della tabella.Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. TABLE rappresenta il valore predefinito.TABLE is the default value.

DISABLEDISABLE
Evita che venga eseguita l'escalation blocchi nella maggior parte dei casi.Prevents lock escalation in most cases. I blocchi a livello di tabella non vengono completamente disattivati.Table-level locks aren't completely disallowed. Ad esempio, quando si esegue l'analisi di una tabella in cui non è presente alcun indice cluster a livello di isolamento serializzabile, il Motore di databaseDatabase Engine deve acquisire un blocco di tabella per proteggere l'integrità dei dati.For example, when you're scanning a table that has no clustered index under the serializable isolation level, Motore di databaseDatabase Engine must take a table lock to protect data integrity.

REBUILDREBUILD
Usare la sintassi REBUILD WITH per ricompilare un'intera tabella che include tutte le partizioni in una tabella partizionata.Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. Se nella tabella è presente un indice cluster, l'opzione REBUILD consente di ricompilare l'indice stesso.If the table has a clustered index, the REBUILD option rebuilds the clustered index. L'opzione REBUILD può essere eseguita come operazione ONLINE.REBUILD can be run as an ONLINE operation.

Utilizzare la sintassi REBUILD PARTITION per ricompilare un'unica partizione in una tabella partizionata.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Ricompila tutte le partizioni in caso di modifica delle impostazioni di compressione della partizione.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> )REBUILD WITH ( <rebuild_option> )
Tutte le opzioni vengono applicate a una tabella con un indice cluster.All options apply to a table with a clustered index. Se nella tabella non è presente un indice cluster, sulla struttura di heap influiranno solo alcune opzioni.If the table doesn't have a clustered index, the heap structure is only affected by some of the options.

Se con l'operazione REBUILD non viene indicata un'impostazione di compressione specifica, verrà usata l'impostazione di compressione corrente per la partizione.When a specific compression setting isn't specified with the REBUILD operation, the current compression setting for the partition is used. Per restituire l'impostazione corrente, eseguire una query sulla colonna data_compression nella vista del catalogo sys.partitions.To return the current setting, query the data_compression column in the sys.partitions catalog view.

Per una descrizione completa delle opzioni di ricompilazione, vedere index_option.For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSIONDATA_COMPRESSION
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificato.Specifies the data compression option for the specified table, partition number, or range of partitions. Sono disponibili le opzioni seguenti:The options are as follows:

NONE: la tabella o le partizioni specificate non vengono compresse.NONE Table or specified partitions aren't compressed. Questa opzione non si applica alle tabelle columnstore.This option doesn't apply to columnstore tables.

ROW: la tabella o le partizioni specificate vengono compresse usando la compressione di riga.ROW Table or specified partitions are compressed by using row compression. Questa opzione non si applica alle tabelle columnstore.This option doesn't apply to columnstore tables.

PAGE: la tabella o le partizioni specificate vengono compresse usando la compressione di pagina.PAGE Table or specified partitions are compressed by using page compression. Questa opzione non si applica alle tabelle columnstore.This option doesn't apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
Si applica a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later) and Database SQL di AzureAzure SQL Database.

Si applica solo alle tabelle columnstore.Applies only to columnstore tables. Con COLUMNSTORE si specifica di decomprimere una partizione compressa con l'opzione COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. Quando i dati vengono ripristinati, continuano a essere compressi con la compressione columnstore usata per tutte le tabelle columnstore.When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
Si applica a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later) and Database SQL di AzureAzure SQL Database.

Si applica solo alle tabelle columnstore, ovvero tabelle archiviate con un indice columnstore cluster.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. COLUMNSTORE_ARCHIVE comprimerà ulteriormente la partizione specificata a una dimensione inferiore.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Usare questa opzione per l'archiviazione o altre situazioni in cui sono richieste dimensioni di archiviazione inferiori ed è possibile concedere più tempo per l'archiviazione e il recupero.Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

Per ricompilare contemporaneamente più partizioni, vedere index_option.To rebuild multiple partitions at the same time, see index_option. 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.If the table doesn't have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Per altre informazioni sulla compressione, vedere Compressione dei dati.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <come si applica a single_partition_rebuild_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
Specifica se una singola partizione delle tabelle sottostanti e degli indici associati è disponibile per le query e le modifiche dei dati durante l'operazione sull'indice.Specifies whether a single partition of the underlying tables and associated indexes is available for queries and data modification during the index operation. Il valore predefinito è OFF.The default is OFF. È possibile eseguire REBUILD come operazione ONLINE.You can run REBUILD as an ONLINE operation.

ONON
I blocchi di tabella a lungo termine non vengono mantenuti per la durata dell'operazione sugli indici.Long-term table locks aren't held for the duration of the index operation. È necessario un blocco condiviso (S) sulla tabella all'inizio della ricompilazione dell'indice e un blocco di modifica schema (Sch-M) sulla tabella alla fine della ricompilazione dell'indice online.S-lock on the table is required in the beginning of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. Sebbene entrambi i blocchi siano blocchi di metadati brevi, il blocco Sch-M deve attendere il completamento di tutte le transazioni bloccanti.Although both locks are short metadata locks, the Sch-M lock must wait for all blocking transactions to be completed. Durante il tempo di attesa, il blocco Sch-M impedisce tutte le altre transazioni in attesa dietro il blocco stesso per l'accesso alla stessa tabella.During the wait time,, the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Nota

Con la ricompilazione dell'indice online è possibile impostare le opzioni low_priority_lock_wait descritte più avanti in questa sezione.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
I blocchi di tabella vengono applicati per la durata dell'operazione sugli indici.Table locks are applied for the duration of the index operation. Il blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNScolumn_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 and later) and Database SQL di AzureAzure SQL Database.

Nome del set di colonne.The name of the column set. Un set di colonne è una rappresentazione XML non tipizzata che combina tutte le colonne di tipo sparse di una tabella in un output strutturato.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. Un set di colonne non può essere aggiunto a una tabella che contiene colonne di tipo sparse.A column set can't be added to a table that contains sparse columns. Per altre informazioni sui set di colonne, vedere Utilizzare set di colonne.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE{ ENABLE | DISABLE } FILETABLE_NAMESPACE
Si applica a: SQL ServerSQL Server (SQL Server 2012 (11.x)SQL Server 2012 (11.x) e versioni successive).Applies to: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) and later).

Consente di abilitare o disabilitare i vincoli definiti dal sistema su una tabella FileTable.Enables or disables the system-defined constraints on a FileTable. Può essere utilizzato solo con una tabella FileTable.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )SET ( FILETABLE_DIRECTORY = directory_name )
Si applica a: SQL ServerSQL Server (SQL Server 2012 (11.x)SQL Server 2012 (11.x) e versioni successive).Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) and later. Database SQL di AzureAzure SQL Database non supporta FILETABLE.doesn't support FILETABLE.

Specifica un nome di directory FileTable compatibile con Windows.Specifies the Windows-compatible FileTable directory name. Questo nome deve essere univoco tra tutti i nomi di directory FileTable nel database.This name should be unique among all the FileTable directory names in the database. Il confronto di univocità non supporta la distinzione tra maiuscole e minuscole, nonostante le impostazioni delle regole di confronto SQL.Uniqueness comparison is case-insensitive, despite the SQL collation settings. Può essere utilizzato solo con una tabella FileTable.Can only be used with a FileTable.

 SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options> )
          | = OFF_WITHOUT_DATA_RECOVERY
          ( MIGRATION_STATE = PAUSED ) | ( <table_stretch_options> [, ...n] )
        } )

Si applica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) e versioni successive).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) and later).

Consente di abilitare o disabilitare Stretch Database per una tabella.Enables or disables Stretch Database for a table. Per altre informazioni, vedere Stretch Database.For more information, see Stretch Database.

Abilitazione di Stretch Database per una tabellaEnabling Stretch Database for a table

Quando si specifica ON per abilitare Stretch per una tabella, è necessario specificare anche MIGRATION_STATE = OUTBOUND per iniziare subito la migrazione dei dati o MIGRATION_STATE = PAUSED per posticiparla.When you enable Stretch for a table by specifying ON, you also have to specify MIGRATION_STATE = OUTBOUND to begin migrating data immediately, or MIGRATION_STATE = PAUSED to postpone data migration. Il valore predefinito è MIGRATION_STATE = OUTBOUND.The default value is MIGRATION_STATE = OUTBOUND. Per altre informazioni sull'abilitazione di Stretch per una tabella, vedere Abilitare Stretch Database per una tabella.For more information about enabling Stretch for a table, see Enable Stretch Database for a table.

Prerequisiti.Prerequisites. Prima di abilitare Stretch per una tabella, è necessario abilitare la funzionalità nel server e nel database.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Per altre informazioni, vedere Abilitare Stretch Database per un database.For more information, see Enable Stretch Database for a database.

Autorizzazioni.Permissions. L'abilitazione di Stretch per un database o una tabella richiede autorizzazioni db_owner.Enabling Stretch for a database or a table requires db_owner permissions. L'abilitazione di Stretch per una tabella richiede anche autorizzazioni ALTER nella tabella.Enabling Stretch for a table also requires ALTER permissions on the table.

Disabilitazione di Stretch Database per una tabellaDisabling Stretch Database for a table

Quando si disabilita Stretch per una tabella, esistono due opzioni disponibili per i dati remoti che sono già stati migrati in Azure.When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. Per altre informazioni, vedere Disabilitare Stretch Database e ripristinare i dati remoti.For more information, see Disable Stretch Database and bring back remote data.

  • Per disabilitare l'estensione per una tabella e copiare i dati remoti per la tabella da Azure a SQL Server, eseguire il comando seguente.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. Questo comando non può essere annullato.This command can't be canceled.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
    

Questa operazione comporta costi di trasferimento dati e non può essere annullata.This operation incurs data transfer costs, and it can't be canceled. Per altre informazioni, vedere i dettagli sui prezzi dei trasferimenti di dati.For more information, see Data Transfers Pricing Details.

Dopo aver copiato tutti i dati remoti da Azure a SQL Server, l'estensione viene disabilitata per la tabella.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • Per disabilitare l'estensione per una tabella e abbandonare i dati remoti, eseguire il comando seguente.To disable Stretch for a table and abandon the remote data, run the following command.

    ALTER TABLE <table_name>
       SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
    

Dopo aver disabilitato Stretch Database per una tabella, si interrompe la migrazione dei dati e i risultati delle query non includono più risultati dalla tabella remota.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

Se si disabilita Stretch, la tabella remota non viene rimossa.Disabling Stretch doesn't remove the remote table. Se si vuole eliminare la tabella remota, eseguire l'operazione tramite il portale di Azure.If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
Si applica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) e versioni successive).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) and later).

Specifica facoltativamente un predicato di filtro per selezionare le righe di cui eseguire la migrazione da una tabella che contiene sia dati cronologici sia dati correnti.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. Il predicato deve eseguire la chiamata a una funzione inline con valori di tabella.The predicate must call a deterministic inline table-valued function. Per altre informazioni, vedere Abilitare Stretch Database per una tabella e Selezionare le righe di cui eseguire la migrazione tramite una funzione di filtro.For more information, see Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Importante

Se si specifica un predicato del filtro inefficace, anche la migrazione dei dati risulterà inefficace.If you provide a filter predicate that performs poorly, data migration also performs poorly. Stretch Database applica il predicato del filtro alla tabella usando l'operatore CROSS APPLY.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

Se non si specifica un predicato del filtro, viene eseguita la migrazione dell'intera tabella.If you don't specify a filter predicate, the entire table is migrated.

Quando si specifica un predicato di filtro, è necessario specificare anche MIGRATION_STATE.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
Si applica a: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) e versioni successive).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) and later).

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
Si applica a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later) and Database SQL di AzureAzure SQL Database.

Per una ricompilazione di indice online è necessario attendere il blocco delle operazioni su questa tabella.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY indica che l'operazione di ricompilazione dell'indice online rimane in attesa di blocchi a priorità bassa, consentendo alle altre operazioni di proseguire mentre la compilazione dell'indice online è in attesa.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation waits for low-priority locks, allowing other operations to carry on while the online index build operation is waiting. L'omissione dell'opzione WAIT AT LOW PRIORITY equivale a WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is the same as WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES ]MAX_DURATION = time [MINUTES ]
Si applica a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later) and Database SQL di AzureAzure SQL Database.

Tempo di attesa, espresso con un valore intero specificato in minuti, dell'operazione SWITCH o dei blocchi di ricompilazione dell'indice online a priorità bassa durante l'esecuzione del comando DDL.The wait time, which is an integer value specified in minutes, that the SWITCH or online index rebuild locks wait with low priority when running the DDL command. Se l'operazione viene bloccata per il tempo specificato in MAX_DURATION, una delle azioni ABORT_AFTER_WAIT verrà eseguita.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will run. Il tempo MAX_DURATION è sempre espresso in minuti ed è possibile omettere la parola MINUTES.MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
Si applica a: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later) and Database SQL di AzureAzure SQL Database.

NessunoNONE
Continuare ad attendere il blocco con priorità normale (regolare).Continue waiting for the lock with normal (regular) priority.

SELFSELF
Esce dall'operazione SWITCH o DDL di ricompilazione dell'indice online attualmente in esecuzione senza eseguire alcuna azione.Exit the SWITCH or online index rebuild DDL operation currently being run without taking any action.

BLOCKERSBLOCKERS
Termina tutte le transazioni utente che attualmente bloccano l'operazione SWITCH o DDL di ricompilazione dell'indice online in modo da poter continuare l'operazione.Kill all user transactions that currently block the SWITCH or online index rebuild DDL operation so that the operation can continue.

È necessaria l'autorizzazione ALTER ANY CONNECTION.Requires ALTER ANY CONNECTION permission.

IF EXISTSIF EXISTS
Si applica a: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later) and Database SQL di AzureAzure SQL Database.

Elimina in modo condizionale la colonna o il vincolo solo se è già esistente.Conditionally drops the column or constraint only if it already exists.

RemarksRemarks

Per aggiungere nuove righe di dati, usare INSERT.To add new rows of data, use INSERT. Per rimuovere righe di dati, usare DELETE o TRUNCATE TABLE.To remove rows of data, use DELETE or TRUNCATE TABLE. Per modificare i valori nelle righe esistenti, usare UPDATE.To change the values in existing rows, use 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.If there are any execution plans in the procedure cache that reference the table, ALTER TABLE marks them to be recompiled on their next execution.

Modifica delle dimensioni di una colonnaChanging the Size of a Column

È possibile modificare la lunghezza, la precisione o la scala di una colonna specificando nuove dimensioni per il tipo di dati della colonna.You can change the length, precision, or scale of a column by specifying a new size for the column data type. Usare la clausola ALTER COLUMN.Use the ALTER COLUMN clause. Se nella colonna sono presenti dati, le nuove dimensioni non possono essere minori delle dimensioni massime dei dati.If data exists in the column, the new size can't be smaller than the maximum size of the data. Inoltre, non è possibile definire la colonna 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.Also, you can't define the column in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index isn't the result of a PRIMARY KEY constraint. Vedere l'esempio nella sezione breve intitolata Modifica di una definizione di colonna.See the example in the short section titled Altering a Column Definition.

Blocchi e ALTER TABLELocks and ALTER TABLE

Le modifiche specificate in ALTER TABLE vengono implementate immediatamente.Changes you specify in ALTER TABLE implement immediately. Se le modifiche richiedono l'alterazione delle righe nella tabella, le righe vengono aggiornate tramite ALTER TABLE.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. 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 breve blocco SCH-M.ALTER TABLE acquires a schema modify (SCH-M) lock on the table to make sure that no other connections reference even the metadata for the table during the change, except online index operations that require a short SCH-M lock at the end. In un'operazione ALTER TABLE...SWITCH il blocco viene acquisito sia sulle tabelle di origine sia in quelle di destinazione.In an ALTER TABLE...SWITCH operation, the lock is acquired on both the source and target tables. Le modifiche apportate alla tabella vengono registrate e possono essere recuperate completamente.The modifications made to the table are logged and fully recoverable. 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 ServerSQL 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.Changes that affect all the rows in large tables, such as dropping a column or, on some editions of SQL ServerSQL Server, adding a NOT NULL column with a default value, can take a long time to complete and generate many log records. Eseguire queste istruzioni ALTER TABLE con la stessa attenzione dedicata alle istruzioni INSERT, UPDATE o DELETE che influiscono su molte righe.Run these ALTER TABLE statements with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

Aggiunta di colonne NOT NULL come operazione onlineAdding NOT NULL Columns as an Online Operation

A partire da SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, l'aggiunta di una colonna NOT NULL con un valore predefinito è un'operazione online quando il valore predefinito è una costante di runtime.Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, adding a NOT NULL column with a default value is an online operation when the default value is a runtime constant. L'operazione viene pertanto completata quasi istantaneamente nonostante il numero di righe nella tabella,This means that the operation is completed almost instantaneously despite the number of rows in the table. in quanto le righe esistenti nella tabella non vengono aggiornate durante l'operazione,Because, the existing rows in the table aren't updated during the operation. 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.Instead, the default value is stored only in the metadata of the table and the value is looked up, as needed, in queries that access these rows. Questo comportamento è automatico.This behavior is automatic. Oltre alla sintassi ADD COLUMN, non è necessaria alcuna sintassi aggiuntiva per implementare l'operazione online.No additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. Una costante di runtime è un'espressione che produce lo stesso valore durante il runtime per ogni riga nella tabella nonostante il relativo determinismo.A runtime constant is an expression that produces the same value at runtime for each row in the table despite its determinism. Esempi di costanti di runtime sono l'espressione costante "Dati temporanei personali" o la funzione di sistema GETUTCDATETIME().For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. Al contrario, le funzioni NEWID() e NEWSEQUENTIALID() non sono costanti di runtime perché viene generato un valore univoco per ogni riga della tabella.In contrast, the functions NEWID() or NEWSEQUENTIALID() aren't runtime constants, because a unique value is produced for each row in the table. 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).Adding a NOT NULL column with a default value that's not a runtime constant is always run offline and an exclusive (SCH-M) lock is acquired for the duration of the operation.

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.While the existing rows reference the value stored in metadata, the default value is stored on the row for any new rows that are inserted and don't specify another value for the column. 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.The default value stored in metadata moves to an existing row when the row is updated (even if the actual column isn't specified in the UPDATE statement), or if the table or clustered index is rebuilt.

Le colonne di tipo varchar(max) , nvarchar(max) , varbinary(max) , xml, text, ntext, image, hierarchyid, geometry, geography o CLR UDTS non possono essere aggiunte in un'operazione online.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, can't be added in an online operation. Non è possibile aggiungere una colonna online se con tale operazione le dimensioni massime possibili per la riga superano il limite di 8.060 byte.A column can't be added online if doing so causes the maximum possible row size to exceed the 8,060-byte limit. In tal caso, la colonna viene aggiunta come operazione offline.The column is added as an offline operation in this case.

Esecuzione di piani paralleliParallel Plan Execution

In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise e versioni successive il numero di processori impiegati per eseguire un'unica istruzione ALTER TABLE ADD (basata su indici) CONSTRAINT o DROP (indice cluster) CONSTRAINT è determinato dall'opzione di configurazione max degree of parallelism e dal carico di lavoro corrente.In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise and higher, the number of processors employed to run a single ALTER TABLE ADD (index-based) CONSTRAINT or DROP (clustered index) CONSTRAINT statement is determined by the max degree of parallelism configuration option and the current workload. Se Motore di databaseDatabase Engine rileva che il sistema è occupato, il grado di parallelismo dell'operazione viene ridotto automaticamente prima dell'avvio dell'esecuzione dell'istruzione.If the Motore di databaseDatabase Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. È possibile configurare manualmente il numero di processori utilizzati per eseguire l'istruzione mediante l'opzione MAXDOP.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option.

Tabelle partizionatePartitioned Tables

Oltre all'esecuzione di operazioni SWITCH che interessano tabelle partizionate, usare ALTER TABLE per modificare lo stato di colonne, vincoli e trigger di tali tabelle così come per le tabelle non partizionate.In addition to performing SWITCH operations that involve partitioned tables, use ALTER TABLE to change the state of the columns, constraints, and triggers of a partitioned table just like it's used for nonpartitioned tables. Non è tuttavia possibile usare questa istruzione per modificare il modo in cui la tabella stessa è partizionata.However, this statement can't be used to change the way the table itself is partitioned. Per la ripartizione di una tabella partizionata, usare ALTER PARTITION SCHEME e ALTER PARTITION FUNCTION.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. Non è inoltre possibile modificare il tipo di dati di una colonna di una tabella partizionata.Additionally, you can't change the data type of a column of a partitioned table.

Restrizioni per le tabelle con viste associate a schemaRestrictions on Tables with Schema-Bound Views

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.The restrictions that apply to ALTER TABLE statements on tables with schema-bound views are the same as the restrictions currently applied when modifying tables with a simple index. È possibile aggiungere una colonnaAdding a column is allowed. mentre non è consentito rimuovere o modificare una colonna che fa parte di una vista associata a uno schema.However, removing or changing a column that participates in any schema-bound view isn't allowed. 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 databaseDatabase Engine genera un messaggio di errore.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the Motore di databaseDatabase Engine raises an error message. Per altre informazioni sull'associazione allo schema e sulle viste indicizzate, vedere CREATE VIEW.For more information about schema binding and indexed views, see CREATE VIEW.

La creazione di una vista associata a uno schema che fa riferimento a tabelle di base non influisce sull'aggiunta o sulla rimozione di trigger in tali tabelle.Adding or removing triggers on base tables isn't affected by creating a schema-bound view that references the tables.

Indici e ALTER TABLEIndexes and ALTER TABLE

Gli indici creati nell'ambito di un vincolo vengono eliminati con l'eliminazione del vincolo.Indexes created as part of a constraint are dropped when the constraint is dropped. Gli indici creati mediante CREATE INDEX devono essere eliminati mediante DROP INDEX.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. Usare 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.Use The ALTER INDEX statement to rebuild an index part of a constraint definition; the constraint doesn't have to be dropped and added again with ALTER TABLE.

Tutti gli indici e i vincoli basati su una colonna devono essere rimossi prima della rimozione della colonna.All indexes and constraints based on a column must be removed before the column can be removed.

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.When you delete a constraint that created a clustered index, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. È 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.You can drop the clustered index and move the resulting table to another filegroup or partition scheme in a single transaction by specifying the MOVE TO option. Per l'opzione MOVE TO vengono applicate le seguenti restrizioni:The MOVE TO option has the following restrictions:

  • MOVE TO non può essere usata per viste indicizzate o indici non cluster.MOVE TO isn't valid for indexed views or nonclustered indexes.
  • Lo schema di partizione o il filegroup deve essere già esistente.The partition scheme or filegroup must already exist.
  • Se non si specifica MOVE TO, la tabella viene inserita nello stesso schema di partizione o nello stesso filegroup definito per l'indice cluster.If MOVE TO isn't specified, the table is located in the same partition scheme or filegroup as was defined for the clustered index.

Quando si elimina un indice cluster, specificare l'opzione ONLINE = ON per evitare che la transazione DROP INDEX blocchi l'esecuzione di query e le modifiche nei dati sottostanti e negli indici non cluster associati.When you drop a clustered index, specify the ONLINE = ON option so the DROP INDEX transaction doesn't block queries and modifications to the underlying data and associated nonclustered indexes.

Per l'opzione ONLINE = ON vengono applicate le restrizioni seguenti:ONLINE = ON has the following restrictions:

  • ONLINE = ON non è valida per gli indici cluster che sono anche disabilitati.ONLINE = ON isn't valid for clustered indexes that are also disabled. Per eliminare gli indici disabilitati è necessario usare l'opzione ONLINE = OFF.Disabled indexes must be dropped by using ONLINE = OFF.
  • È possibile eliminare un solo indice alla volta.Only one index at a time can be dropped.
  • ONLINE = ON non è valida per viste indicizzate, indici non cluster o indici su tabelle temporanee locali.ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • ONLINE = ON non è valida per gli indici columnstore.ONLINE = ON isn't valid for columnstore indexes.

Per l'eliminazione di un indice cluster, lo spazio su disco temporaneo deve essere uguale alle dimensioni dell'indice cluster esistente.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. Questo spazio aggiuntivo viene rilasciato al termine dell'operazione.This additional space is released as soon as the operation is completed.

Nota

Le opzioni elencate in <drop_clustered_constraint_option> si applicano a indici cluster su tabelle e non possono essere applicate a indici cluster su viste o a indici non cluster.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and can't be applied to clustered indexes on views or nonclustered indexes.

Replica delle modifiche dello schemaReplicating Schema Changes

Per impostazione predefinita, quando si esegue ALTER TABLE su una tabella pubblicata in un server di pubblicazione SQL ServerSQL Server, tale modifica si propaga a tutti i Sottoscrittori SQL ServerSQL Server.When you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, by default, that change propagates to all SQL ServerSQL Server Subscribers. Questa funzionalità presenta alcune restrizioniThis functionality has some restrictions. e può essere disabilitata.You can disable it. Per altre informazioni, vedere Apportare modifiche allo schema nei database di pubblicazione.For more information, see Make Schema Changes on Publication Databases.

Compressione dei datiData Compression

Le tabelle di sistema non possono essere abilitate per la compressione.System tables can't be enabled for compression. Se la tabella è un heap, l'operazione di ricompilazione per la modalità ONLINE sarà a thread singolo.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. Utilizzare la modalità OFFLINE per un'operazione di ricompilazione di heap multithread.Use OFFLINE mode for a multi-threaded heap rebuild operation. Per altre informazioni sulla compressione dei dati, vedere Compressione dei dati.For a more information about data compression, seeData Compression.

Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un indice o una partizione, usare la stored procedure sp_estimate_data_compression_savings .To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

Alle tabelle partizionate vengono applicate le restrizioni seguenti:The following restrictions apply to partitioned tables:

  • Non è possibile modificare l'impostazione di compressione di una singola partizione se la tabella include indici non allineati.You can't change the compression setting of a single partition if the table has nonaligned indexes.
  • La sintassi ALTER TABLE <table> REBUILD PARTITION ... ricompila la partizione specificata.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • La sintassi ALTER TABLE <table> REBUILD WITH ... ricompila tutte le partizioni.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

Eliminazione di colonne NTEXTDropping NTEXT Columns

Quando si eliminano le colonne NTEXT, la pulizia dei dati eliminati viene eseguita come operazione serializzata per tutte le righe.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. L'operazione di pulizia può richiedere una grande quantità di tempo.The cleanup can require a large amount of time. Per eliminare una colonna NTEXT in una tabella con molte righe, aggiornare la colonna NTEXT su un valore NULL, quindi eliminare la colonna.When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. È possibile eseguire questa opzione con operazioni parallele rendendola molto più rapida.You can run this option with parallel operations and make it much faster.

Ricompilazione di indici onlineOnline Index Rebuild

Per eseguire l'istruzione DDL per una ricompilazione dell'indice online, è necessario completare tutte le transazioni bloccanti attive in esecuzione in una specifica tabella.To run the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Quando la ricompilazione dell'indice online viene avviata, blocca tutte le nuove transazioni pronte per l'esecuzione in questa tabella.When the online index rebuild launches, it blocks all new transactions that are ready to start running on this table. Sebbene la durata del blocco della ricompilazione dell'indice online sia breve, l'attesa del completamento di tutte le transazioni aperte in una tabella specificata e il blocco dell'avvio di nuove transazioni potrebbero influire in modo significativo sulla velocità effettiva.Although the duration of the lock for online index rebuild is short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput. Ciò può provocare un rallentamento o un timeout del carico di lavoro e limitare notevolmente l'accesso alla tabella sottostante.This can cause a workload slow-down or timeout and significantly limit access to the underlying table. L'opzione WAIT_AT_LOW_PRIORITY consente agli amministratori di database di gestire i blocchi S e Sch-M necessari per le ricompilazioni degli indici online, nonché di selezionare una delle tre opzioni disponibili.The WAIT_AT_LOW_PRIORITY option allows DBAs to manage the S-lock and Sch-M locks required for online index rebuilds and lets them to select one of three options. In tutti e tre i casi se durante il tempo di attesa, ( (MAX_DURATION =n [minutes]) ), non sono presenti attività di blocco, la ricompilazione dell'indice online viene eseguita immediatamente senza attendere il completamento dell'istruzione DDL.In all three cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is run immediately without waiting and the DDL statement is completed.

Informazioni sulla compatibilitàCompatibility Support

L'istruzione ALTER TABLE supporta unicamente nomi di tabella in due parti (schema.oggetto).The ALTER TABLE statement supports only two-part (schema.object) table names. In SQL ServerSQL Server l'utilizzo di un nome di tabella basato sui formati seguenti comporta la generazione dell'errore 117 in fase di compilazione.In SQL ServerSQL Server, specifying a table name using the following formats fails at compile time with error 117.

  • server.database.schema.tabellaserver.database.schema.table
  • .database.schema.tabella.database.schema.table
  • ..schema.tabella..schema.table

Nelle versioni precedenti l'uso del formato server.database.schema.tabella genera l'errore 4902.In earlier versions, specifying the format server.database.schema.table returned error 4902. L'uso del formato .database.schema.tabella o ..schema.tabella è supportato.Specifying the format .database.schema.table or the format ..schema.table succeeded.

Per risolvere il problema, rimuovere l'uso di un prefisso in quattro parti.To resolve the problem, remove the use of a four-part prefix.

AutorizzazioniPermissions

È necessario disporre dell'autorizzazione ALTER per la tabella.Requires ALTER permission on the table.

Le autorizzazioni ALTER TABLE si applicano a entrambe le tabelle coinvolte in un'istruzione ALTER TABLE SWITCH.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. Tutti i dati trasferiti ereditano la sicurezza della tabella di destinazione.Any data that's switched inherits the security of the target table.

Se nell'istruzione ALTER TABLE sono state definite colonne di tipo Common Language Runtime (CLR) definito dall'utente (UDT) o di tipo di dati alias, è necessaria l'autorizzazione REFERENCES per il tipo desiderato.If you've defined any columns in the ALTER TABLE statement to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

Per aggiungere una colonna con la quale vengono aggiornate le righe della tabella è necessaria l'autorizzazione UPDATE per la tabella,Adding a column that updates the rows of the table requires UPDATE permission on the table. ad esempio per aggiungere una colonna NOT NULL con un valore predefinito o una colonna Identity quando la tabella non è vuota.For example, adding a NOT NULL column with a default value or adding an identity column when the table isn't empty.

EsempiExamples

CategoryCategory Elementi di sintassi inclusiFeatured syntax elements
Aggiunta di colonne e vincoliAdding columns and constraints ADD • PRIMARY KEY con opzioni per gli indici • colonne di tipo sparse e set di colonne •ADD • PRIMARY KEY with index options • sparse columns and column sets •
Eliminazione di colonne e vincoliDropping columns and constraints DROPDROP
Modifica della definizione di colonnaAltering a column definition cambiare tipo di dati • cambiare dimensioni delle colonna • regole di confrontochange data type • change column size • collation
Modifica della definizione di una tabellaAltering a table definition DATA_COMPRESSION • SWITCH PARTITION OF • LOCK ESCALATION • rilevamento delle modificheDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
Disabilitazione e abilitazione di vincoli e triggerDisabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER
   

Aggiunta di colonne e vincoliAdding Columns and Constraints

Negli esempi di questa sezione viene illustrata l'aggiunta di colonne e vincoli a una tabella.Examples in this section demonstrate adding columns and constraints to a table.

A.A. Aggiunta di una nuova colonnaAdding a new column

Nell'esempio seguente viene aggiunta una colonna che consente valori Null e alla quale non sono forniti valori mediante una definizione DEFAULT.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. In ogni riga della nuova colonna sarà indicato NULL.In the new column, each row will have NULL.

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

B.B. Aggiunta di una colonna con un vincoloAdding a column with a constraint

Nell'esempio seguente viene aggiunta una nuova colonna con un vincolo UNIQUE.The following example adds a new column with a UNIQUE constraint.

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.C. Aggiunta di un vincolo CHECK non verificato a una colonna esistenteAdding an unverified CHECK constraint to an existing column

Nell'esempio seguente viene aggiunto un vincolo a una colonna esistente nella tabella.The following example adds a constraint to an existing column in the table. Nella colonna è presente un valore che viola il vincolo.The column has a value that violates the constraint. Pertanto, viene utilizzato WITH NOCHECK per evitare che il vincolo venga convalidato in base alle righe esistenti e consentire l'aggiunta del vincolo.Therefore, WITH NOCHECK is used to prevent the constraint from being validated against existing rows, and to allow for the constraint to be added.

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.D. Aggiunta di un vincolo DEFAULT a una colonna esistenteAdding a DEFAULT constraint to an existing column

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.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. Viene quindi aggiunto un vincolo DEFAULT alla seconda colonna.A DEFAULT constraint is then added to the second column. Per verificare l'applicazione del vincolo, viene inserito un altro valore nella prima colonna e viene eseguita una query sulla tabella.To verify that the default is applied, another value is inserted into the first column, and the table is queried.

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.E. Aggiunta di più colonne con vincoliAdding several columns with constraints

Nell'esempio seguente vengono aggiunte più colonne con vincoli. I vincoli vengono definiti con la nuova colonna.The following example adds several columns with constraints defined with the new column. Alla prima colonna è associata la proprietà IDENTITY.The first new column has an IDENTITY property. Nella colonna Identity di ogni riga della tabella sono presenti nuovi valori incrementali.Each row in the table has new incremental values in the identity column.

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.F. Aggiunta di una colonna che ammette i valori Null con valori predefinitiAdding a nullable column with default values

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.The following example adds a nullable column with a DEFAULT definition, and uses WITH VALUES to provide values for each existing row in the table. Se non si usa WITH VALUES, a ogni riga della nuova colonna viene associato il valore NULL.If WITH VALUES isn't used, each row has the value NULL in the new column.

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.G. Creazione di un vincolo PRIMARY KEY con opzioni per gli indici o la compressione dei datiCreating a PRIMARY KEY constraint with index or data compression options

Nell'esempio seguente viene creato il vincolo PRIMARY KEY PK_TransactionHistoryArchive_TransactionID e vengono impostate le opzioni FILLFACTOR, ONLINE e PAD_INDEX.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. All'indice cluster risultante sarà assegnato lo stesso nome del vincolo.The resulting clustered index will have the same name as the constraint.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

USE AdventureWorks;
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

In questo esempio simile viene applicata la compressione di pagina durante l'applicazione della chiave primaria in cluster.This similar example applies page compression while applying the clustered primary key.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (DATA_COMPRESSION = PAGE);
GO

H.H. Aggiunta di una colonna di tipo sparseAdding a sparse column

Negli esempi seguenti si illustrano l'aggiunta e la modifica di colonne di tipo sparse nella tabella T1.The following examples show adding and modifying sparse columns in table T1. Il codice per creare la tabella T1 è il seguente:The code to create table T1 is as follows.

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.To add an additional sparse column C5, execute the following statement.

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.To convert the C4 non-sparse column to a sparse column, execute the following statement.

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.To convert the C4 sparse column to a nonsparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO

I.I. Aggiunta di un set di colonneAdding a column set

Negli esempi seguenti viene illustrata l'aggiunta di una colonna alla tabella T2.The following examples show adding a column to table T2. Un set di colonne non può essere aggiunto a una tabella che contiene già colonne di tipo sparse.A column set can't be added to a table that already contains sparse columns. Il codice per creare la tabella T2 è il seguente:The code to create table T2 is as follows.

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.The following three statements add a column set named CS, and then modify columns C2 and C3 to 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

J.J. Aggiunta di una colonna crittografataAdding an encrypted column

L'istruzione seguente aggiunge una colonna crittografata denominata PromotionCode.The following statement adds an encrypted column named PromotionCode.

ALTER TABLE Customers ADD
    PromotionCode nvarchar(100)
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,
    ENCRYPTION_TYPE = RANDOMIZED,
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') ;

Eliminazione di colonne e vincoliDropping Columns and Constraints

Negli esempi di questa sezione viene illustrata l'eliminazione di colonne e vincoli.The examples in this section demonstrate dropping columns and constraints.

A.A. Eliminazione di una o più colonneDropping a column or columns

Nel primo esempio viene modificata una tabella per rimuovere una colonna.The first example modifies a table to remove a column. Nel secondo esempio vengono rimosse più colonne.The second example removes multiple columns.

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.B. Eliminazione di vincoli e colonneDropping constraints and columns

Nel primo esempio viene rimosso un vincolo UNIQUE da una tabella.The first example removes a UNIQUE constraint from a table. Nel secondo esempio vengono rimossi due vincoli e una singola colonna.The second example removes two constraints and a single column.

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 my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.C. Eliminazione di un vincolo PRIMARY KEY nella modalità ONLINEDropping a PRIMARY KEY constraint in the ONLINE mode

Nell'esempio seguente viene eliminato un vincolo PRIMARY KEY con l'opzione ONLINE impostata su ON.The following example deletes a PRIMARY KEY constraint with the ONLINE option set to ON.

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

D.D. Aggiunta e rimozione di un vincolo FOREIGN KEYAdding and dropping a FOREIGN KEY constraint

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.The following example creates the table ContactBackup, and then alters the table, first by adding a FOREIGN KEY constraint that references the table Person.Person, then by dropping the FOREIGN KEY constraint.

CREATE TABLE Person.ContactBackup
    (ContactID int) ;
GO

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

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

Icona freccia usata con il collegamento Torna all'inizio EsempiArrow icon used with Back to Top link Examples

Modifica della definizione di una colonnaAltering a Column Definition

A.A. Modifica del tipo di dati di una colonnaChanging the data type of a column

Nell'esempio seguente la colonna di una tabella viene modificata da INT a DECIMAL.The following example changes a column of a table from INT to 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.B. Modifica delle dimensioni di una colonnaChanging the size of a column

Nell'esempio seguente vengono aumentate le dimensioni di una colonna varchar e la precisione e la scala di una colonna decimal.The following example increases the size of a varchar column and the precision and scale of a decimal column. Poiché le colonne contengono dati, le relative dimensioni possono solo essere aumentate.Because the columns contain data, the column size can only be increased. Si noti inoltre che col_a è definito in un indice univoco.Also notice that col_a is defined in a unique index. 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.The size of col_a can still be increased because the data type is a varchar and the index isn't the result of a PRIMARY KEY constraint.

-- 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.C. Modifica delle regole di confronto di una colonnaChanging column collation

Nell'esempio seguente si illustra come modificare le regole di confronto di una colonna.The following example shows how to change the collation of a column. Innanzitutto, viene creata una tabella con le regole di confronto predefinite dell'utente.First, a table is created table with the default user collation.

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.Next, column C2 collation is changed to Latin1_General_BIN. Il tipo di dati è richiesto, anche se non è modificato.The data type is required, even though it isn't changed.

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

D.D. Crittografia di una colonnaEncrypting a column

L'esempio seguente illustra come crittografare una colonna usando Always Encrypted con enclave sicuri.The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

In primo luogo, viene creata una tabella senza colonne crittografate.First, a table is created without any encrypted columns.

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

Successivamente, la colonna "C2" viene crittografata con una chiave di crittografia, denominata CEK1, e la crittografia casuale.Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. Perché l'istruzione seguente abbia esito positivo:For the following statement to succeed:

  • La chiave di crittografia della colonna deve essere abilitata per l'enclave,The column encryption key must be enclave-enabled. vale a dire che deve essere crittografata con una chiave master della colonna che consente i calcoli dell'enclave.Meaning, it must be encrypted with a column master key that allows enclave computations.
  • L'istanza di SQL Server di destinazione deve supportare Always Encrypted con enclave sicuri.The target SQL Server instance must support Always Encrypted with secure enclaves.
  • L'istruzione deve essere eseguita tramite una connessione configurata per Always Encrypted con enclave sicuri e usando un driver client supportato.The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • L'applicazione chiamante deve avere accesso alla chiave master della colonna, CEK1 di protezione.The calling application must have access to the column master key, protecting CEK1.
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL;
GO

Modifica della definizione di una tabellaAltering a Table Definition

Negli esempi di questa sezione viene illustrato come modificare la definizione di una tabella.The examples in this section demonstrate how to alter the definition of a table.

A.A. Modifica di una tabella per cambiare la compressioneModifying a table to change the compression

Nell'esempio seguente viene modificata la compressione di una tabella non partizionata.The following example changes the compression of a nonpartitioned table. L'heap o l'indice cluster verrà ricompilato.The heap or clustered index will be rebuilt. Se la tabella è un heap, tutti gli indici non cluster verranno ricompilati.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);

Nell'esempio seguente viene modificata la compressione di una tabella partizionata.The following example changes the compression of a partitioned table. La sintassi REBUILD PARTITION = 1 consente di ricompilare solo il numero di partizione 1.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

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.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

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

Per altri esempi sulla compressione dei dati, vedere Compressione dei dati.For additional data compression examples, see Data Compression.

B.B. Modifica di una tabella columnstore per modificare la compressione dell'archivioModifying a columnstore table to change archival compression

Nell'esempio seguente viene compressa una partizione di tabella columnstore applicando un algoritmo di compressione aggiuntivo.The following example further compresses a columnstore table partition by applying an additional compression algorithm. Questa compressione riduce le dimensioni della tabella, ma aumenta il tempo necessario per l'archiviazione e il recupero.This compression reduces the table to a smaller size, but also increases the time required for storage and retrieval. È utile per l'archiviazione o in situazioni in cui è richiesto uno spazio inferiore ed è possibile concedere più tempo per l'archiviazione e il recupero.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

Si applica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later and Database SQL di AzureAzure SQL Database.

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

Nell'esempio seguente viene decompressa una partizione di tabella columnstore compressa con l'opzione COLUMNSTORE_ARCHIVE.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. Quando i dati vengono ripristinati, continueranno a essere compressi con la compressione columnstore usata per tutte le tabelle columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

Si applica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later and Database SQL di AzureAzure SQL Database.

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

C.C. Trasferimento di partizioni tra tabelleSwitching partitions between tables

Nell'esempio seguente viene creata una tabella partizionata, presupponendo che nel database sia già stato creato lo schema di partizione myRangePS1.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. Verrà quindi creata una tabella non partizionata con la stessa struttura della tabella partizionata e nello stesso filegroup di PARTITION 2 della tabella PartitionTable.Next, a non-partitioned table is created with the same structure as the partitioned table and on the same filegroup as PARTITION 2 of table PartitionTable. I dati di PARTITION 2 della tabella PartitionTable vengono quindi trasferiti nella tabella NonPartitionTable.The data of PARTITION 2 of table PartitionTable is then switched into table 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

D.D. Consentire l'escalation blocchi nelle tabelle partizionateAllowing lock escalation on partitioned tables

Nell'esempio seguente viene abilitata l'escalation blocchi a livello di partizione in una tabella partizionata.The following example enables lock escalation to the partition level on a partitioned table. Se la tabella non è partizionata, l'escalation blocchi viene impostata a livello TABLE.If the table isn't partitioned, lock escalation is set at the TABLE level.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

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

E.E. Configurazione del rilevamento delle modifiche in una tabellaConfiguring change tracking on a table

Nell'esempio seguente viene abilitato il rilevamento delle modifiche per la tabella Person.Person.The following example enables change tracking on the Person.Person table.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

USE AdventureWorks;
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.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive.Applies to: SQL Server 2008SQL Server 2008 and later.

USE AdventureWorks;
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.The following example disables change tracking on the Person.Person table.

Si applica a: SQL Server 2008SQL Server 2008 e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 and later and Database SQL di AzureAzure SQL Database.

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

Disabilitazione e abilitazione di vincoli e triggerDisabling and Enabling Constraints and Triggers

A.A. Disabilitazione e riabilitazione di un vincoloDisabling and re-enabling a constraint

Nell'esempio seguente viene disabilitato un vincolo che limita i dati relativi agli stipendi accettabili.The following example disables a constraint that limits the salaries accepted in the data. NOCHECK CONSTRAINT viene utilizzata con ALTER TABLE per disabilitare il vincolo e consentire un inserimento che in genere violerebbe il vincolo.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. CHECK CONSTRAINT abilita nuovamente il vincolo.CHECK CONSTRAINT re-enables the constraint.

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.B. Disabilitazione e riabilitazione di un triggerDisabling and re-enabling a 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.The following example uses the DISABLE TRIGGER option of ALTER TABLE to disable the trigger and allow for an insert that would typically violate the trigger. ENABLE TRIGGER viene quindi utilizzato per abilitare nuovamente il trigger.ENABLE TRIGGER is then used to re-enable the 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

Operazioni onlineOnline Operations

A.A. Ricompilazione dell'indice online usando le opzioni di attesa con priorità bassaOnline index rebuild using low-priority wait options

L'esempio seguente illustra come eseguire la ricompilazione di un indice online specificando le opzioni di attesa con priorità bassa.The following example shows how to perform an online index rebuild specifying the low-priority wait options.

Si applica a: SQL Server 2014 (12.x)SQL Server 2014 (12.x) e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later and Database SQL di AzureAzure SQL Database.

ALTER TABLE T1
REBUILD WITH
(
    PAD_INDEX = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES,
                                         ABORT_AFTER_WAIT = BLOCKERS ) )
)
;

B.B. Modifica colonna onlineOnline Alter Column

L'esempio seguente illustra come eseguire un'operazione di modifica colonna con l'opzione ONLINE.The following example shows how to run an alter column operation with the ONLINE option.

Si applica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later and Database SQL di AzureAzure SQL Database.

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) WITH (ONLINE = ON);
GO
sp_help doc_exy;
DROP TABLE dbo.doc_exy ;
GO

Controllo delle versioni di sistemaSystem Versioning

I quattro esempi riportati di seguito consentono di acquisire familiarità con la sintassi per l'uso del controllo delle versioni di sistema.The following four examples will help you become familiar with the syntax for using system versioning. Per altre istruzioni, vedere Introduzione alle tabelle temporali con controllo delle versioni di sistema.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

Si applica a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) e versioni successive e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) and later and Database SQL di AzureAzure SQL Database.

A.A. Aggiungere il controllo delle versioni di sistema a tabelle esistentiAdd System Versioning to Existing Tables

Nell'esempio seguente viene illustrato come aggiungere il controllo delle versioni di sistema a una tabella esistente e creare una tabella di cronologia futura.The following example shows how to add system versioning to an existing table and create a future history table. In questo esempio si presuppone l'esistenza di una tabella denominata InsurancePolicy con una chiave primaria definita.This example assumes that there's an existing table called InsurancePolicy with a primary key defined. In questo esempio si popolano le colonne periodo appena create per il controllo delle versioni del sistema usando valori predefiniti per l'ora di inizio e di fine in quanto questi valori non possono essere Null.This example populates the newly created period columns for system versioning using default values for the start and end times because these values can't be null. In questo esempio viene usata la clausola HIDDEN per evitare impatti sulle applicazioni esistenti che interagiscono con la tabella corrente.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. Viene anche usato HISTORY_RETENTION_PERIOD disponibile solo nel Database SQLSQL Database.It also uses HISTORY_RETENTION_PERIOD that's available on Database SQLSQL Database only.

--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
    DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999');

--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 1 YEAR));

B.B. Eseguire la migrazione di una soluzione esistente per usare il controllo delle versioni di sistemaMigrate An Existing Solution to Use System Versioning

Nell'esempio seguente viene illustrato come eseguire la migrazione per il controllo delle versioni di sistema da una soluzione che usa i trigger per simulare il supporto temporale.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. In questo esempio si presuppone l'esistenza di una soluzione in cui siano usate una tabella ProjectTask e una tabella ProjectTaskHistory per la soluzione esistente, vale a dire le colonne Changed Date e Revised Date per i periodi. Tali colonne di periodo non devono usare il tipo di dati datetime2 e la tabella ProjectTask deve avere una chiave primaria definita.The example assumes there's an existing solution that uses a ProjectTask table and a ProjectTaskHistory table for its existing solution, that's uses the Changed Date and Revised Date columns for its periods, that these period columns don't use the datetime2 datatype and that the ProjectTask table has a primary key defined.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] datetime2 NOT NULL;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] datetime2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] datetime2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] datetime2 NOT NULL;

-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])

ALTER TABLE ProjectTask
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK = ON))

C.C. Disabilitazione e riabilitazione del controllo delle versioni di sistema per modificare lo schema tabellaDisabling and Re-Enabling System Versioning to Change Table Schema

In questo esempio viene illustrato come disabilitare il controllo delle versioni di sistema nella tabella Department, aggiungere una colonna e riabilitare il controllo delle versioni di sistema.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. Per modificare lo schema tabella, è necessario disabilitare il controllo delle versioni di sistema.Disabling system versioning is required to modify the table schema. Eseguire questi passaggi all'interno di una transazione per impedire l'aggiornamento di entrambe le tabelle durante l'aggiornamento dello schema tabella. In questo modo, gli amministratori di database non dovranno verificare la coerenza dei dati quando il controllo delle versioni di sistema viene riabilitato e si garantiscono prestazioni migliori.Do these steps within a transaction to prevent updates to both tables while updating the table schema, which enables the DBA to skip the data consistency check when re-enabling system versioning and gain a performance benefit. Per altre attività come la creazione delle statistiche, il cambio delle partizioni o l'applicazione della compressione a una o entrambe le tabelle, non è necessaria la disabilitazione del controllo delle versioni di sistema.Tasks such as creating statistics, switching partitions, or applying compression to one or both tables doesn't require disabling system versioning.

BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);
/* expand table schema for temporal table */
ALTER TABLE Department  
     ADD Col5 int NOT NULL DEFAULT 0;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
    ADD Col5 int NOT NULL DEFAULT 0;
/* Re-establish versioning again*/
ALTER TABLE Department
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
                                 DATA_CONSISTENCY_CHECK = OFF));
COMMIT

D.D. Rimozione del controllo delle versioni di sistemaRemoving System Versioning

In questo esempio viene illustrato come rimuovere completamente il controllo delle versioni di sistema della tabella Department ed eliminare la tabella DepartmentHistory.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. Facoltativamente, è anche possibile eliminare le colonne periodo usate dal sistema per registrare informazioni sul controllo delle versioni di sistema.Optionally, you might also want to drop the period columns used by the system to record system versioning information. Non è possibile eliminare le tabelle Department o DepartmentHistory mentre il controllo delle versioni di sistema è abilitato.You can't drop either the Department or the DepartmentHistory tables while system versioning is enabled.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;

Esempi: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) e Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

Negli esempi da A a C riportati di seguito viene usata la tabella FactResellerSales nel database AdventureWorksPDW2012AdventureWorksPDW2012.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Determinazione di una tabella partizionataDetermining if a table is partitioned

Tramite la query seguente vengono restituite una o più righe se la tabella FactResellerSales è partizionata.The following query returns one or more rows if the table FactResellerSales is partitioned. Se la tabella non è partizionata, non viene restituita alcuna riga.If the table isn't partitioned, no rows are returned.

SELECT * FROM sys.partitions AS p
JOIN sys.tables AS t
    ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
    AND t.name = 'FactResellerSales';

B.B. Determinazione dei valori limite per una tabella partizionataDetermining boundary values for a partitioned table

Tramite la query seguente vengono restituiti i valori limite per ogni partizione nella tabella FactResellerSales .The following query returns the boundary values for each partition in the FactResellerSales table.

SELECT t.name AS TableName, i.name AS IndexName, p.partition_number,
    p.partition_id, i.data_space_id, f.function_id, f.type_desc,
    r.boundary_id, r.value AS BoundaryValue
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN  sys.partition_schemes AS s
    ON i.data_space_id = s.data_space_id
JOIN sys.partition_functions AS f
    ON s.function_id = f.function_id
LEFT JOIN sys.partition_range_values AS r
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales' AND i.type <= 1
ORDER BY p.partition_number;

C.C. Determinazione della colonna di partizione per una tabella partizionataDetermining the partition column for a partitioned table

Tramite la query seguente viene restituito il nome della colonna di partizionamento per la tabella.The following query returns the name of the partitioning column for table. FactResellerSales.FactResellerSales.

SELECT t.object_id AS Object_ID, t.name AS TableName,
    ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
    ON t.object_id = i.object_id
JOIN sys.columns AS c
    ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
    ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
    ON ic.object_id = i.object_id
    AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id;

D.D. Unione di due partizioniMerging two partitions

Nell'esempio seguente si uniscono due partizioni in una tabella.The following example merges two partitions on a table.

La tabella Customer presenta la definizione seguente:The Customer table has the following definition:

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100)));

Il comando seguente unisce i limiti delle partizioni 10 e 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);

La nuova istruzione DDL per la tabella è la seguente:The new DDL for the table is:

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 25, 50, 100)));

E.E. Suddivisione di una partizioneSplitting a partition

Nell'esempio seguente si suddivide una partizione in una tabella.The following example splits a partition on a table.

La tabella Customer presenta l'istruzione DDL seguente:The Customer table has the following DDL:

DROP TABLE Customer;

CREATE TABLE Customer (
    id int NOT NULL,
    lastName varchar(20),
    orderCount int,
    orderDate date)
WITH
    ( DISTRIBUTION = HASH(id),
    PARTITION ( orderCount RANGE LEFT
    FOR VALUES (1, 5, 10, 25, 50, 100 )));

Il comando seguente consente di creare una nuova partizione associata al valore 75, compresa tra 50 e 100.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);

La nuova istruzione DDL per la tabella è la seguente:The new DDL for the table is:

CREATE TABLE Customer (
   id int NOT NULL,
   lastName varchar(20),
   orderCount int,
   orderDate date)
   WITH DISTRIBUTION = HASH(id),
   PARTITION ( orderCount (RANGE LEFT
      FOR VALUES (1, 5, 10, 25, 50, 75, 100 )));

F.F. Uso di SWITCH per spostare una partizione in una tabella di cronologiaUsing SWITCH to move a partition to a history table

Nell'esempio seguente si spostano i dati in una partizione della tabella Orders in una partizione della tabella OrdersHistory.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

La tabella Orders presenta l'istruzione DDL seguente:The Orders table has the following DDL:

CREATE TABLE Orders (
    id INT,
    city VARCHAR (25),
    lastUpdateDate DATE,
    orderDate DATE )
WITH
    (DISTRIBUTION = HASH ( id ),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01' )));

In questo esempio la tabella Orders contiene le partizioni seguenti.In this example, the Orders table has the following partitions. Ogni partizione contiene dati.Each partition contains data.

PartitionPartition Contiene dati?Has data? Intervallo limiteBoundary range
11 Yes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 Yes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 Yes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 Yes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 Yes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
     
  • Partizione 1 (contiene dati): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partizione 2 (contiene dati): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partizione 3 (contiene dati): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partizione 4 (contiene dati): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partizione 5 (contiene dati): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

La tabella OrdersHistory contiene l'istruzione DDL seguente, con colonne identiche e gli stessi nomi di colonna della tabella Orders.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Sono entrambe tabelle hash distribuite nella colonna id.Both are hash-distributed on the id column.

CREATE TABLE OrdersHistory (
   id INT,
   city VARCHAR (25),
   lastUpdateDate DATE,
   orderDate DATE )
WITH
    (DISTRIBUTION = HASH ( id ),
    PARTITION ( orderDate RANGE RIGHT
    FOR VALUES ( '2004-01-01' )));

Mentre le colonne e i nomi di colonna devono essere gli stessi, non è necessario che i limiti delle partizioni siano uguali.Although the columns and column names must be the same, the partition boundaries don't need to be the same. In questo esempio la tabella OrdersHistory contiene le due partizioni seguenti. Entrambe sono vuote:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • Partizione 1 (non contiene dati): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Partizione 2 (vuota): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Per le due tabelle precedenti, il comando seguente sposta tutte le righe con OrderDate < '2004-01-01' dalla tabella Orders alla tabella OrdersHistory.For the previous two tables, the following command moves all rows with OrderDate < '2004-01-01' from the Orders table to the OrdersHistory table.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

Di conseguenza, la prima partizione in Orders è vuota e la prima partizione in OrdersHistory contiene dati.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. Le tabelle vengono visualizzate come indicato di seguito:The tables now appear as follows:

Tabella OrdersOrders table

  • Partizione 1 (vuota): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • Partizione 2 (contiene dati): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partizione 3 (contiene dati): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partizione 4 (contiene dati): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partizione 5 (contiene dati): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Tabella OrdersHistoryOrdersHistory table

  • Partizione 1 (contiene dati): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partizione 2 (vuota): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Per pulire la tabella Orders, è possibile rimuovere la partizione vuota unendo le partizioni 1 e 2 come indicato di seguito:To clean up the Orders table, you can remove the empty partition by merging partitions 1 and 2 as follows:

ALTER TABLE Orders MERGE RANGE ('2004-01-01');

Dopo l'unione, la tabella Orders conterrà le partizioni seguenti:After the merge, the Orders table has the following partitions:

Tabella OrdersOrders table

  • Partizione 1 (contiene dati): OrderDate < '2005-01-01'Partition 1 (has data): OrderDate < '2005-01-01'
  • Partizione 2 (contiene dati): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partizione 3 (contiene dati): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partizione 4 (contiene dati): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

Si supponga che sia passato un anno e che si voglia archiviare l'anno 2005.Suppose another year passes and you're ready to archive the year 2005. È possibile allocare una partizione vuota per l'anno 2005 nella tabella OrdersHistory suddividendo la partizione vuota come indicato di seguito:You can allocate an empty partition for the year 2005 in the OrdersHistory table by splitting the empty partition as follows:

ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');

Dopo la suddivisione, la tabella OrdersHistory conterrà le partizioni seguenti:After the split, the OrdersHistory table has the following partitions:

Tabella OrdersHistoryOrdersHistory table

  • Partizione 1 (contiene dati): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partizione 2 (vuota): '2004-01-01' < '2005-01-01'Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • Partizione 3 (vuota): '2005-01-01' <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

Vedere ancheSee Also