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

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Modifica una definizione di tabella mediante la modifica, l'aggiunta o l'eliminazione di colonne e vincoli, la riassegnazione e la ricompilazione di partizioni, la disabilitazione o l'abilitazione di vincoli e trigger.Modifies a table definition by altering, adding, or dropping columns and constraints, reassigning and rebuilding partitions, or disabling or enabling constraints and triggers.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and Azure SQL Database  

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name   
{   
    ALTER COLUMN column_name   
    {   
        [ type_schema_name. ] type_name   
            [ (   
                {   
                   precision [ , scale ]   
                 | max   
                 | xml_schema_collection   
                }   
            ) ]   
        [ COLLATE collation_name ]   
        [ NULL | NOT NULL ] [ SPARSE ]  
      | { ADD | DROP }   
          { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | 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_lock_priority_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 } )   
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

ALTER TABLE [ database_name . [schema_name ] . | schema_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 ]  
}  
[;]  

<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.Is the name of the database in which the table was created.

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

table_nametable_name
Nome della tabella che si desidera modificare.Is 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 is not in the current database or is not contained by the schema owned by the current user, the database and schema must be explicitly specified.

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 delle colonne seguenti:The modified column cannot be any one of the following:

  • Una colonna con un timestamp tipo di dati.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.

  • Utilizzate in statistiche generate dall'istruzione CREATE STATISTICS, a meno che la colonna è un varchar, nvarchar, o varbinary del tipo di dati, il tipo di dati non viene modificato, e la nuova dimensione è uguale o maggiore di quella precedente, oppure se la colonna viene modificata da non null a null.Used in statistics generated by the CREATE STATISTICS statement unless the column is a varchar, nvarchar, or varbinary data type, the data type is not changed, and the new size is equal to or greater than the old size, 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. 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. È tuttavia possibile modificare la lunghezza di una colonna a lunghezza variabile utilizzata in un vincolo CHECK o UNIQUE.However, 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 is not changed.

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

-   <span data-ttu-id="bb7d2-129">**testo** a **varchar (max)**, **nvarchar (max)**, o **xml**</span><span class="sxs-lookup"><span data-stu-id="bb7d2-129">**text** to **varchar(max)**, **nvarchar(max)**, or **xml**</span></span>  

-   <span data-ttu-id="bb7d2-130">**ntext** a **varchar (max)**, **nvarchar (max)**, o **xml**</span><span class="sxs-lookup"><span data-stu-id="bb7d2-130">**ntext** to **varchar(max)**, **nvarchar(max)**, or **xml**</span></span>  

-   <span data-ttu-id="bb7d2-131">**immagine** a **varbinary (max)**</span><span class="sxs-lookup"><span data-stu-id="bb7d2-131">**image** to **varbinary(max)**</span></span>  

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 un nchar o nvarchar colonna char o varchar può causare la conversione dei caratteri estesi.For example, changing an nchar or nvarchar column to char or varchar may cause the conversion of extended characters. Per altre informazioni, vedere CAST and CONVERT (Transact-SQL).For more information, see CAST and CONVERT (Transact-SQL). La riduzione della precisione o della scala di una colonna può causare il troncamento dei dati.Reducing the precision or scale of a column may cause data truncation.

 The data type of a column of a partitioned table cannot be changed.  

Il tipo di dati delle colonne incluse in un indice non può essere modificato, a meno che la colonna è un varchar, nvarchar, o varbinary tipo di dati, e la nuova dimensione è maggiore o uguale a rispetto alla dimensione precedente.The data type of columns included in an index cannot 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.

Colonne incluse in un vincolo di chiave primaria non può essere modificato da non NULL a NULL.A columns included in a primary key constraint, cannot be changed from NOT NULL to NULL.

Se la colonna da modificare è crittografata con CRITTOGRAFATO, è possibile modificare il tipo di dati in un tipo di dati compatibile (ad esempio INT a BIGINT) ma non è possibile modificare le impostazioni di crittografia.If the column being modified is encrypted using ENCRYPTED WITH, you can change the datatype to a compatible datatype (such as INT to BIGINT) but you cannot change any encryption settings.

column_namecolumn_name
Nome della colonna da modificare, aggiungere o eliminare.Is the name of the column to be altered, added, or dropped. column_name può contenere un massimo di 128 caratteri.column_name can be a maximum of 128 characters. Per le nuove colonne, column_name può essere omesso per le colonne create con un timestamp tipo di dati.For new columns, column_name can be omitted for columns created with a timestamp data type. Il nome timestamp viene utilizzato se non column_name specificato per un timestamp colonna tipo di dati.The name timestamp is used if no column_name is specified for a timestamp data type column.

[ 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.Is the new data type for the altered column, or the data type for the added column. TYPE_NAME non è possibile specificare per le colonne esistenti di tabelle partizionate.type_name cannot be specified for existing columns of partitioned tables. TYPE_NAME può essere una qualsiasi delle operazioni seguenti:type_name can be any one of the following:

  • 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'utilizzo in una definizione di tabella, i tipi di dati alias vengono creati con l'istruzione CREATE TYPE.Alias data types are created 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. I tipi definiti dall'utente (UDT) di .NET Framework.NET Framework devono essere creati con l'istruzione CREATE TYPE affinché possano essere utilizzati in una definizione di tabella. .NET Framework.NET Framework user-defined types are created 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 cannot 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, argomento new_data_type deve essere un tipo di dati che supporta 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 causerà la modifica delle regole di confronto predefinite del database.If the COLLATE clause is not specified, changing the data type of a column will cause a collation change to the default collation of the database.

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

scalascale
Scala per il tipo di dati specificato.Is the scale for the specified data type. Per ulteriori informazioni sui valori di scala validi, vedere precisione, scala e lunghezza ( Transact-SQL ) .For more information about valid scale values, see Precision, Scale, and Length (Transact-SQL).

Maxmax
Si applica solo al varchar, nvarchar, e varbinary tipi di dati per l'archiviazione di 2 ^ 31-1 byte di dati binari, carattere 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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Si applica solo al xml il tipo di dati per l'associazione di uno schema XML con il tipo.Applies only to the xml data type for associating an XML schema with the type. Prima di digitare un xml colonna a una raccolta di schemi, la raccolta di schemi è necessario innanzitutto creare nel database utilizzando CREATE XML SCHEMA COLLECTION.Before typing an xml column to a schema collection, the schema collection must first be created in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < collation_name > specifica le nuove regole di confronto per la colonna modificata.COLLATE < collation_name > 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 windows_collation_name ( Transact-SQL ) e SQL nome regole di confronto del Server ( Transact-SQL ) .For a list and more information, see Windows Collation Name (Transact-SQL) and SQL Server Collation Name (Transact-SQL).

La clausola COLLATE consente di modificare le regole di confronto solo delle colonne di char, varchar, nchar, e nvarchar tipi di dati.The COLLATE clause can be used to change 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, è necessario eseguire istruzioni ALTER TABLE separate in modo da modificare il tipo di dati della colonna in un tipo di dati di sistema di SQL ServerSQL Server e le relative regole di confronto. Si dovrà quindi ripristinare un tipo di dati alias per la colonna.To change the collation of a user-defined alias data type column, you must execute separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type and change its collation, and then 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 cannot 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 (Transact-SQL).For more information, see COLLATE (Transact-SQL).

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 do not allow null values can be 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 PERSISTED.NOT NULL can be specified for computed columns only if PERSISTED is also specified. 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 no default is specified, the new column contains a null value for each row in the table. Se a una nuova colonna che consente valori Null viene aggiunta una definizione DEFAULT, è possibile utilizzare WITH VALUES per l'archiviazione del valore predefinito nella nuova colonna per ogni riga della tabella.If the new column allows null values and a default definition is added with the new column, WITH VALUES can be used 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. Il valore predefinito viene quindi caricato automaticamente in ogni riga esistente della nuova colonna.If the new column does not allow null values and the table is not empty, a DEFAULT definition must be added with the new column, 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'utilizzo di valori Null nelle colonne NOT NULL, ad eccezione delle colonne nei vincoli PRIMARY KEY.NULL can be specified 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.NOT NULL can be specified 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'utilizzo dei valori Null del tipo di dati utilizzato 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 is used in a column definition. Nel caso di colonne non calcolate, è consigliabile definire sempre in modo esplicito una colonna come NULL o NOT NULL.We recommend 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, è consigliabile definire per la colonna la stessa impostazione relativa al supporto di valori Null del tipo di dati definito dall'utente e specificare un valore predefinito per la colonna.If you add a column with a user-defined data type, we recommend that you define the column with the same nullability as the user-defined data type and specify a default value for the column. Per altre informazioni, vedere CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

Nota

Se NULL o non si specifica NULL con ALTER COLUMN, argomento new_data_type [(precisione [, scala ])] è necessario specificare anche.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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Specifica l'aggiunta o l'eliminazione della proprietà ROWGUIDCOL nella colonna specificata.Specifies 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. Un solo uniqueidentifier colonna per ogni tabella può essere definita come colonna ROWGUIDCOL e la proprietà ROWGUIDCOL può essere assegnata solo a un uniqueidentifier colonna.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column, and the ROWGUIDCOL property can be assigned only to a uniqueidentifier column. Non è possibile assegnare ROWGUIDCOL a una colonna con un tipo di dati definito dall'utente.ROWGUIDCOL cannot be assigned 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 does not enforce uniqueness of the values that are stored in the column and does not automatically generate values for new rows that are inserted into the table. Per generare valori univoci per ogni colonna, è necessario utilizzare la funzione NEWID con istruzioni INSERT o specificare la funzione NEWID come valore predefinito della colonna.To generate unique values for each column, either use the NEWID function on INSERT statements or specify the NEWID 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 is 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 utilizzate come colonne di partizionamento di tabelle partizionate devono essere contrassegnate come PERSISTED in modo esplicito.Any computed column that is 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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 perform insert operations. Questa clausola può essere specificata solo se column_name è una colonna identity.This clause can be specified 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 designare le colonne di tipo sparse come NOT NULL.Sparse columns cannot be designated 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 ulteriori restrizioni e ulteriori informazioni sulle colonne di tipo sparse, vedere utilizzare le colonne di tipo Sparse.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

Aggiungere MASCHERATI con (funzione = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
Si applica a: SQL Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 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 seguenti le:Three functions are available:

  • default)default()
  • email()email()
  • partial()partial()
  • funzione DISTRIBrandom()

    Per eliminare un filtro, utilizzare DROP MASKED.To drop a mask, use DROP MASKED. Per i parametri di funzione, vedere maschera dati dinamica.For function parameters, see Dynamic Data Masking.

CON (ONLINE = ON | OFF) <come si applica a una modifica di una colonna >WITH ( ONLINE = ON | OFF) <as applies to altering a column>
Si applica a: SQL Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 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 performed while the table remains available. L'impostazione predefinita è OFF.Default is OFF. L'operazione di modifica colonna può essere eseguita 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.Alter column can be performed on line 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.Online alter column allows user created and auto statistics to reference the altered column for the duration of the ALTER COLUMN operation. In questo modo è possibile eseguire le query come al solito.This allows queries to perform 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, auto-stats 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 di filtro per le statistiche o indici è possibile eseguire un'operazione di modifica colonna.If the column is part of a filter expression for any statistics or indexes then you cannot 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) verranno bloccate o avranno 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, etc.) will block or fail with an appropriate error. In questo modo si garantisce che l'operazione di modifica colonna online non avrà esito negativo a causa delle dipendenze introdotte durante l'esecuzione dell'operazione.This guarantees that online alter column will not 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 is not supported as an online operation when the altered column is references 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 is not supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).

  • Il low_priority_lock_wait opzione non può essere utilizzata con Modifica colonna online.The low_priority_lock_wait option cannot be used with online alter column.

  • ALTER COLUMN …ALTER COLUMN … ADD/DROP PERSISTED non è supportato per l'operazione di modifica colonna online.ADD/DROP PERSISTED is not supported for online alter column.

  • ALTER COLUMN …ALTER COLUMN … ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION non è interessato dall'operazione di modifica colonna online.ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION is not 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 does not support altering a table where change tracking is enabled or that is 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 does not 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 does not 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 does not 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, etc. might cause the alter to fail.

  • L'operazione di modifica colonna online non supporta la modifica di più colonne contemporaneamente.Online alter column does not support altering more than one column concurrently.

  • Modifica online colonna non ha alcun effetto in caso di una tabella temporale con controllo delle versioni del sistema.Online alter column has no effect in case of system-versioned temporal table. La colonna ALTER non viene eseguita come online indipendentemente dal valore che è stato specificato per l'opzione ONLINE.ALTER column is not performed 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,Online alter column has similar requirements, restrictions, and functionality as online index rebuild. ad esempio:This 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 is not 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 is not validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Se viene omesso, viene utilizzata la clausola WITH CHECK per nuovi vincoli e WITH NOCHECK per vincoli riabilitati.If not specified, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Se non si desidera verificare nuovi vincoli CHECK o FOREIGN KEY in base ai dati esistenti, utilizzare WITH NOCHECK.If you do not 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 do not recommend doing this, except in rare cases. Il nuovo vincolo viene valutato in tutti gli aggiornamenti successivi dei dati.The new constraint will be 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 violano 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 does not comply with the constraint.

Query Optimizer non considera i vincoli definiti con WITH NOCHECK,The query optimizer does not 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.

ADDADD
Specifica che vengono aggiunti uno o più definizioni di colonna, le definizioni di colonna calcolata o vincoli di tabella, o le colonne che verrà utilizzata dal sistema per il controllo delle versioni di sistema.Specifies that one or more column definitions, computed column definitions, or table constraints are added, or the columns that the system will use for system versioning.

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 Server 2017SQL Server 2017 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2017SQL Server 2017 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Specifica i nomi delle colonne che verrà utilizzata dal sistema per registrare il periodo di validità per il quale un record.Specifies the names of the columns that the system will use to record the period 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. Le colonne deve avere il tipo di dati datetime2 e deve essere definite come NOT NULL.The columns must have the datatype of datetime2 and must be defined as NOT NULL. Se una colonna di periodo viene definita come NULL, verrà generato un errore.If a period column is defined as NULL, an error will be thrown. È possibile definire un column_constraint ( Transact-SQL ) e/o specificare valori predefiniti per le colonne per le colonne system_start_time e system_end_time.You can define a column_constraint (Transact-SQL) and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. Vedere l'esempio A nel il controllo delle versioni di sistema negli esempi seguenti che illustrano l'utilizzo di un valore predefinito per la colonna system_end_time.See Example A in the System Versioning examples below demonstrating the use of a default value for the system_end_time column.

Utilizzare questo argomento in combinazione con l'argomento SET SYSTEM_VERSIONING per consentire il controllo delle versioni di sistema in una tabella esistente.Use this argument in conjunction with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Per ulteriori informazioni, vedere le 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 dal SQL Server 2017SQL Server 2017, gli utenti saranno in grado di contrassegnare una o entrambe le colonne del periodo con HIDDEN flag per nascondere in modo implicito le colonne in modo che selezionare * FROM <tabella > non restituisce un valore per tali colonne.As of SQL Server 2017SQL Server 2017, users will be able to mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM<table> does not return a value for those columns. Per impostazione predefinita, le colonne del periodo non vengono nascosti.By default, period columns are not hidden. Per poter essere usato, le colonne nascoste devono essere incluso in modo esplicito in tutte le query che fanno riferimento direttamente 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 che uno o più definizioni di colonna, le definizioni di colonna calcolata o vincoli di tabella vengono eliminati, o di eliminare le specifiche per le colonne che verrà utilizzata dal sistema 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 will use for system versioning.

VINCOLO constraint_nameCONSTRAINT constraint_name
Specifica che constraint_name viene rimosso dalla tabella.Specifies that constraint_name is removed from the table. Possono essere elencati più vincoli.Multiple constraints can be listed.

Il nome definito dall'utente o di sistema del vincolo può essere determinato eseguendo una query di CHECK_CONSTRAINT, default_constraints, key_constraints, e Sys. Foreign_Keys viste del catalogo.The user-defined or system-supplied name of the constraint can be determined 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 cannot be dropped if an XML index exists on the table.

COLONNA 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. È possono elencare più colonne.Multiple columns can be listed.

Non è possibile eliminare una colonna se:A column cannot be dropped when it is:

  • Viene utilizzata in un indice.Used in an index.

  • 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 is 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 does not 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. Recuperare spazio, la creazione di un indice cluster nella tabella o la ricompilazione di un indice cluster esistente utilizzando 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 di tipi di dati LOB, vedere questo post di blog 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 Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

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

CON <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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Esegue l'override di massimo grado di parallelismo opzione di configurazione 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 sugli indici parallele sono disponibili solo in alcune edizioni di SQL ServerSQL Server.Parallel index operations are not available in every edition of SQL ServerSQL Server. Per ulteriori informazioni, vedere edizioni e delle funzionalità supportate per SQL Server 2016.For more information, see Editions and Supported Features for SQL Server 2016.

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. L'opzione REBUILD può essere eseguita come operazione ONLINE.REBUILD can be performed 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 are not 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. in modo da consentire l'esecuzione di query o l'aggiornamento della tabella sottostante e degli indici.This 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 periodo molto breve.At the start of the operation, a Shared (S) lock is held on the source object for a very short time. Al termine dell'operazione di creazione di un indice non cluster, per un breve periodo viene acquisito un blocco condiviso (S) sull'origine. Al termine dell'operazione di creazione o di eliminazione di un indice cluster online o di ricompilazione di un indice cluster o non cluster, viene acquisito un blocco di modifica dello schema (SCH-M).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; 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 cannot 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 COMMUTATORE o ricompilazione dell'indice online, tutte le transazioni in esecuzione in una determinata tabella bloccanti attive deve essere completata.To execute the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Quando si esegue, il COMMUTATORE o operazione di ricompilazione impedisce l'avvio della nuova transazione e potrebbe influire in modo significativo la velocità effettiva del carico di lavoro e ritardare temporaneamente l'accesso alla tabella sottostante.When executing, the SWITCH or rebuild operation prevents new transaction from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

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. 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 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. Tale blocco impedisce l'aggiornamento della tabella sottostante ma consente operazioni di lettura, ad esempio l'esecuzione di istruzioni SELECT.This 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 ulteriori informazioni, vedere come funzionano le operazioni di indice 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 ulteriori informazioni, vedere edizioni e delle funzionalità supportate per SQL Server 2016.For more information, see Editions and Supported Features for SQL Server 2016.

Sposta in { partition_scheme_name(column_name [1, ... n ] ) | filegroup | "predefinito" }MOVE TO { partition_scheme_name(column_name [ 1, ... n] ) | filegroup | "default" }
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 is not a keyword. È un identificatore per il filegroup predefinito e deve essere delimitato, come in MOVE TO "predefinito" o MOVE TO [predefinito].It is an identifier for the default filegroup and must be delimited, as in MOVE TO "default" or MOVE TO [default]. Se "predefinito" viene specificato, 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 (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

{ 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 cannot 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. Un trigger disabilitato è comunque disponibile nella tabella. Quando si esegue un'istruzione INSERT, UPDATE o DELETE sulla tabella, tuttavia, le azioni nel trigger vengono eseguite solo dopo che il trigger stesso è stato abilitato nuovamente.When a trigger is disabled it is still defined for the table; however, when INSERT, UPDATE, or DELETE statements are executed against the table, the actions in the trigger are not performed until the trigger is re-enabled.

ALLALL
Specifica l'abilitazione o la disabilitazione di tutti i trigger della tabella.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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

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.

CON ( TRACK_COLUMNS_UPDATED = {ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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.

COMMUTATORE [partizione source_partition_number_expression ] TO [ schema_name.SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [partizione target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 tabella è una tabella partizionata, source_partition_number_expression deve essere specificato.If table is a partitioned table, source_partition_number_expression must be specified. Se target_table è partizionata, target_partition_number_expression deve essere specificato.If target_table is partitioned, target_partition_number_expression must be specified. Se si riassegnano i dati di una tabella come partizione a una tabella esistente già partizionata o se si sposta una partizione da una tabella partizionata a un'altra, la partizione di destinazione deve essere già esistente e vuota.If 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.

Se si riassegnano i dati di una partizione per formare un'unica tabella, la tabella di destinazione deve essere già stata creata ed essere vuota.If reassigning one partition's data to form a single table, the target table must already be created 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 reside 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 reside in the same filegroup. Al trasferimento di partizioni vengono applicate molte ulteriori restrizioni.Many additional restrictions apply to switching partitions. tabella e target_table non può essere lo stesso.table and target_table cannot 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 cannot reference Transact-SQLTransact-SQL expressions.

Una tabella partizionata con un indice cluster si comporta come 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.

  • Un indice univoco deve includere la chiave di partizione.A unique index must include the partition key. Si noti che con la chiave di partizione per un indice univoco esistente può modificare l'univocità.Note that including the partition key to an existing unique index can change the uniqueness.

  • Per cambiare le partizioni, tutti gli indici non cluster devono includere la chiave di partizione.In order to switch partitions, all non-clustered indexes must include the partition key.

Per COMMUTATORE restrizione per 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 di SQL prima che venissero versione V12 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 possono eseguire qualsiasi operazione della partizione, è necessario ricompilare gli indici columnstore non cluster nel formato corrente (ovvero aggiornabile).Nonclustered columnstore indexes must be rebuilt to the current format (which is updatable) before any PARTITION operations can be performed.

IMPOSTARE ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " predefinito" | "NULL" })SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default" | "NULL" })
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017. |Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.|

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

L'istruzione ALTER TABLE con la clausola SET FILESTREAM_ON verrà eseguita in modo corretto solo se nella tabella non sono presenti colonne FILESTREAM.ALTER TABLE with the SET FILESTREAM_ON clause will succeed only if the table has no FILESTREAM columns. Tali colonne possono essere aggiunte tramite una seconda istruzione ALTER TABLE.The FILESTREAM columns can be added by using a second ALTER TABLE statement.

Se partition_scheme_name è specificato, le regole per CREATE TABLE si applicano.If partition_scheme_name is specified, the rules for CREATE TABLE apply. La tabella deve già essere partizionata per i dati delle righe e nel relativo schema di partizione devono essere utilizzate la stessa funzione e le stesse colonne di partizione dello schema di partizione FILESTREAM.The table should already be partitioned for row data, and its partition scheme must use 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. Il filegroup deve includere un file definito per il filegroup utilizzando un CREATE DATABASE o ALTER DATABASE istruzione o un errore viene generato.The filegroup must have one file that is defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error is raised.

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

"NULL" specifica che tutti i riferimenti al filegroup FILESTREAM per la tabella verranno rimossa."NULL" specifies that all references to FILESTREAM filegroups for the table will be removed. È necessario eliminare innanzitutto tutte le colonne FILESTREAM.All FILESTREAM columns must be dropped first. È necessario utilizzare SET FILESTREAM_ON= "NULL" per eliminare tutti i dati FILESTREAM che sono associati a una tabella.You must use SET FILESTREAM_ON="NULL" to delete all FILESTREAM data that is associated with a table.

IMPOSTARE ( 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 Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Disabilita il controllo delle versioni di sistema di una tabella o consente il controllo delle versioni di sistema di una tabella.Either disables system versioning of a table 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 di ammissione di valori null e i requisiti di vincolo di 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 si omette l'argomento HISTORY_TABLE, il sistema genera una nuova tabella di cronologia corrispondente lo schema della tabella corrente, creare un collegamento tra le due tabelle e consente al sistema registrare la cronologia di ogni record nella tabella corrente nella tabella di cronologia.If the HISTORY_TABLE argument is not used, the system generates a new history table matching the schema of the current table, creating 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 l'argomento HISTORY_TABLE viene utilizzato per creare un collegamento a e utilizzare una tabella di cronologia esistente, viene creato il collegamento tra la tabella corrente e la tabella specificata.If the HISTORY_TABLE argument is used to create a link to and use an existing history table, the link is created 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 della coerenza dei dati.When creating a link to an existing history table, you can choose to perform a data consistency check. La coerenza dei dati garantisce che i record esistenti non si sovrappongano.This data consistency check ensures that existing records do not overlap. L'impostazione predefinita prevede l'esecuzione della verifica della coerenza dei dati.Performing the data consistency check is the default. Per altre informazioni, vedere Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { infinito | numero {giorno | GIORNI | SETTIMANA | SETTIMANE | MESE | MESI | ANNO | ANNI}} si applica a: Database SQL di AzureAzure SQL Database.HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} } Applies to: Database SQL di AzureAzure SQL Database.

Specifica la memorizzazione finito o infinte per i dati cronologici in una tabella temporale.Specifies finite or infinte retention for historical data in temporal table. Se omesso, verrà utilizzato conservazione infinito.If omitted, infinite retention is assumed.

IMPOSTARE ( LOCK_ESCALATION = {AUTOMATICO | TABELLA | DISABILITARE} )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 is appropriate for the table schema.

  • Se la tabella è partizionata, l'escalation blocchi è consentita per la partizione.If the table is partitioned, lock escalation will be allowed to partition. Una volta eseguita l'escalation del blocco al livello di partizione, non verrà eseguita alcuna successiva escalation del blocco nella granularità TABLE.After the lock is escalated to the partition level, the lock will not be escalated later to TABLE granularity.

  • Se la tabella non è partizionata, l'escalation blocchi verrà eseguita nella granularità TABLE.If the table is not partitioned, the lock escalation will be 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 will be done at table-level granularity regardless 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 are not completely disallowed. Quando si esegue l'analisi di una tabella in cui non è presente alcun indice cluster a livello di isolamento serializzabile, ad esempio, il Motore di databaseDatabase Engine deve acquisire un blocco di tabella per proteggere l'integrità dei dati.For example, when you are 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
Utilizzare 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 performed 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 Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 does not 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à utilizzata l'impostazione di compressione corrente per la partizione.When a specific compression setting is not specified with the REBUILD operation, the current compression setting for the partition is used. Per restituire l'impostazione corrente, eseguire una query di data_compression colonna il Sys. Partitions vista del catalogo.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 ( Transact-SQL ) .For complete descriptions of the rebuild options, see index_option (Transact-SQL).

DATA_COMPRESSIONDATA_COMPRESSION
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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:

NONENONE
La tabella o le partizioni specificate non vengono compresse.Table or specified partitions are not compressed. Non si applica alle tabelle columnstore.This does not apply to columnstore tables.

ROWROW
La tabella o le partizioni specificate vengono compresse utilizzando la compressione di riga.Table or specified partitions are compressed by using row compression. Non si applica alle tabelle columnstore.This does not apply to columnstore tables.

PAGEPAGE
La tabella o le partizioni specificate vengono compresse utilizzando la compressione di pagina.Table or specified partitions are compressed by using page compression. Non si applica alle tabelle columnstore.This does not apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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, continueranno a essere compressi con la compressione columnstore utilizzata per tutte le tabelle columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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. Può essere utilizzata per l'archiviazione o in altre situazioni in cui sono richieste dimensioni di archiviazione inferiori ed è possibile concedere più tempo per l'archiviazione e il recupero.This can be used for archival, or for other situations that require less storage and can afford more time for storage and retrieval

Per ricompilare più partizioni allo stesso tempo, vedere index_option ( Transact-SQL ) .To rebuild multiple partitions at the same time, see index_option (Transact-SQL). Se la tabella non dispone di un indice cluster, la modifica della compressione dei dati comporta la ricompilazione dell'heap e degli indici non cluster.If the table does not have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Per ulteriori informazioni sulla compressione, vedere la 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 gli indici associati sono disponibili per le query e per modifiche dei dati durante l'operazione sull'indice.Specifies whether a single partition of the underlying tables and associated indexes are available for queries and data modification during the index operation. Il valore predefinito è OFF.The default is OFF. L'opzione REBUILD può essere eseguita come operazione ONLINE.REBUILD can be performed 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 are not 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.A 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, soprattutto il blocco Sch-M deve attendere il completamento di tutte le transazioni bloccanti.Although both locks are short metadata locks, especially 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

Ricompilazione dell'indice online è possibile impostare il low_priority_lock_wait opzioni 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.

nome_set_colonne XML COLUMN_SET FOR ALL_SPARSE_COLUMNS.column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Nome del set di colonne.Is 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 cannot 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 Server 2012SQL Server 2012 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017.

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 Server 2012SQL Server 2012 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017.

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, indipendentemente dalle impostazioni delle regole di confronto SQL.Uniqueness comparison is case-insensitive, regardless of 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 Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

Abilita o disabilita l'estensione Database per una tabella.Enables or disables Stretch Database for a table. Per ulteriori informazioni, vedere Stretch Database.For more info, see Stretch Database.

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

Quando si abilita estensione per una tabella specificando ON, è necessario specificare anche MIGRATION_STATE = OUTBOUND per iniziare subito la migrazione dei dati o MIGRATION_STATE = PAUSED per posticipare la migrazione dei dati.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 ulteriori informazioni sull'abilitazione dell'estensione per una tabella, vedere abilitare estensione Database per una tabella.For more info about enabling Stretch for a table, see Enable Stretch Database for a table.

Prerequisiti.Prerequisites. Prima abilitare l'estensione per una tabella, è necessario abilitare l'estensione nel server e sul database.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Per ulteriori informazioni, vedere Enable Stretch Database for a database.For more info, see Enable Stretch Database for a database.

Autorizzazioni.Permissions. Abilitazione dell'estensione per un database o una tabella richiede autorizzazioni db_owner.Enabling Stretch for a database or a table requires db_owner permissions. Abilitazione dell'estensione per una tabella richiede anche autorizzazioni ALTER sulla tabella.Enabling Stretch for a table also requires ALTER permissions on the table.

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

Quando si disabilita l'estensione per una tabella, sono disponibili due opzioni per i dati remoti sono già stati migrati in Azure.When you disable Stretch for a table, you have two options for the remote data that has already been migrated to Azure. Per altre informazioni, vedere Disabilitare Stretch Database e ripristinare i dati remoti.For more info, 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 Dettagli prezzi dei trasferimenti di dati.For more info, 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.

    La disabilitazione dell'estensione non rimuove la tabella remota.Disabling Stretch does not remove the remote table. Se si vuole eliminare la tabella remota, è necessario eliminarla tramite il portale di gestione di Azure.If you want to delete the remote table, you have to drop it by using the Azure management portal.

[FILTER_PREDICATE = {null | predicato }][ FILTER_PREDICATE = { null | predicate } ]
Si applica a: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

Facoltativamente è possibile specificare un predicato del filtro per selezionare righe di cui eseguire la migrazione da una tabella che contiene i dati correnti e cronologici.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. Il predicato deve chiamare una funzione con valori di tabella inline deterministica.The predicate must call a deterministic inline table-valued function. Per altre informazioni, vedere abilitare estensione Database per una tabella e selezionare righe di cui eseguire la migrazione tramite una funzione di filtro ( Estensione Database ) .For more info, 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 del filtro, è necessario specificare anche MIGRATION_STATE.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = {IN USCITA | CONNESSIONI IN ENTRATA | IN PAUSA}MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
Si applica a: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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 indice online rimarrà in attesa dei blocchi con priorità bassa, consentendo alle altre operazioni di continuare mentre è in attesa che l'operazione di compilazione indice online.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. L'omissione di WAIT AT LOW PRIORITY opzione equivale a WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = ora [minuti ]MAX_DURATION = time [MINUTES ]
Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

Il tempo (valore intero specificato in minuti) che il COMMUTATORE o blocchi di ricompilazione indice online attesa con priorità bassa durante l'esecuzione del comando DDL.The wait time (an integer value specified in minutes) that the SWITCH or online index rebuild locks will wait with low priority when executing the DDL command. Se l'operazione è bloccata per la MAX_DURATION tempo, uno del ABORT_AFTER_WAIT azioni verranno eseguite.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will be executed. MAX_DURATION ora è sempre espresso in minuti e la parola minuti può essere omesso.MAX_DURATION time is always in minutes, and the word MINUTES can be omitted.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCCHI }]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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
Uscita di COMMUTATORE o operazione DDL di ricompilazione indice online attualmente in esecuzione senza eseguire alcuna azione.Exit the SWITCH or online index rebuild DDL operation currently being executed without taking any action.

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

Richiede l'autorizzazione ALTER ANY CONNECTION autorizzazione.Requires ALTER ANY CONNECTION permission.

SE ESISTEIF EXISTS
Si applica a: SQL ServerSQL Server ( SQL Server 2016SQL Server 2016 tramite versione corrente) e Database SQL di AzureAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016SQL Server 2016 through current version) and Database SQL di AzureAzure SQL Database.

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

OsservazioniRemarks

Per aggiungere nuove righe di dati, utilizzare inserire.To add new rows of data, use INSERT. Per rimuovere le righe di dati, utilizzare eliminare o TRUNCATE TABLE.To remove rows of data, use DELETE or TRUNCATE TABLE. Per modificare i valori nelle righe esistenti, utilizzare aggiornamento.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 nella clausola ALTER COLUMN.You can change the length, precision, or scale of a column by specifying a new size for the column data type in 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 cannot be smaller than the maximum size of the data. Inoltre, la colonna non è possibile definire un indice, a meno che la colonna è un varchar, nvarchar, o varbinary tipo di dati e l'indice non è il risultato di una chiave primaria vincolo.Also, the column cannot be defined in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index is not the result of a PRIMARY KEY constraint. Vedere l'esempio P.See example P.

Blocchi e ALTER TABLELocks and ALTER TABLE

Le modifiche specificate in ALTER TABLE vengono implementate immediatamente.The changes specified in ALTER TABLE are implemented 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 blocco SCH-M molto breve.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 very short SCH-M lock at the end. In un'operazione ALTER TABLE…SWITCH il blocco viene acquisito sia sulle tabelle di origine che su 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 very 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. Tali istruzioni ALTER TABLE devono essere eseguite con la stessa attenzione dedicata alle istruzioni INSERT, UPDATE e DELETE quando queste influiscono su molte righe.These ALTER TABLE statements should be executed 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 2012SQL Server 2012 Enterprise Edition, l'aggiunta di una colonna NOT NULL con un valore predefinito è un'operazione online quando il valore predefinito è una costante di runtime.Starting with SQL Server 2012SQL Server 2012 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 indipendentemente dal numero di righe nella tabella,This means that the operation is completed almost instantaneously regardless of the number of rows in the table. in quanto le righe esistenti nella tabella non vengono aggiornate durante l'operazione, ma il valore predefinito viene archiviato solo nei metadati della tabella e il valore viene cercato in base alle necessità nelle query che accedono a tali righe.This is because the existing rows in the table are not updated during the operation; 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. Oltre la sintassi ADD COLUMN, non è necessaria alcuna sintassi aggiuntiva per implementare l'operazione online.This behavior is automatic; 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 indipendentemente dal relativo determinismo.A runtime constant is an expression that produces the same value at runtime for each row in the table regardless of 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() o NEWSEQUENTIALID() non sono costanti di runtime perché viene prodotto un valore univoco per ogni riga della tabella.In contrast, the functions NEWID() or NEWSEQUENTIALID() are not 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 is not a runtime constant is always performed 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 do not 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 is moved to an existing row when the row is updated (even if the actual column is not 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, testo, ntext, immagine, hierarchyid, geometry, geography, o non può essere UDTS CLR, Impossibile aggiungere in un'operazione online.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, cannot 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 cannot 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 utilizzati per eseguire un'unica istruzione ALTER TABLE ADD (basata su indici) CONSTRAINT o DROP (indice cluster) CONSTRAINT viene determinato dal massimo grado di parallelismo configurazione opzione e il 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, è possibile utilizzare 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, ALTER TABLE can be used to change the state of the columns, constraints, and triggers of a partitioned table just like it is used for nonpartitioned tables. Non è tuttavia possibile utilizzare questa istruzione per modificare il modo di partizione della tabella stessa.However, this statement cannot be used to change the way the table itself is partitioned. Per partizionare una tabella partizionata, utilizzare 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 cannot 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 schema.However, removing or changing a column that participates in any schema-bound view is not 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 ulteriori informazioni sull'associazione allo schema e le viste indicizzate, vedere CREATE VIEW ( Transact-SQL ) .For more information about schema binding and indexed views, see CREATE VIEW (Transact-SQL).

La creazione di una vista associata a schema che fa riferimento a tabelle di base non influisce sull'aggiunta o sulla rimozione di trigger in tali tabelle.Adding or removing triggers on base tables is not 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. È possibile utilizzare l'istruzione ALTER INDEX per ricompilare un indice che costituisce una parte di una definizione di vincolo. Non è necessario eliminare e quindi aggiungere nuovamente il vincolo con ALTER TABLE.The ALTER INDEX statement can be used to rebuild an index part of a constraint definition; the constraint does not 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 a constraint that created a clustered index is deleted, 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 utilizzata per viste indicizzate o indici non cluster.MOVE TO is not 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 is not specified, the table will be located in the same partition scheme or filegroup as was defined for the clustered index.

Quando si elimina un indice cluster, è possibile specificare ONLINE = opzione in modo che la transazione DROP INDEX non blocchino le query e modifiche ai dati sottostanti e gli indici non cluster associati.When you drop a clustered index, you can specify ONLINE = ON option so the DROP INDEX transaction does not block queries and modifications to the underlying data and associated nonclustered indexes.

ONLINE = in presenta le restrizioni seguenti:ONLINE = ON has the following restrictions:

  • ONLINE = ON non è valida per gli indici cluster che sono inoltre disabilitati.ONLINE = ON is not valid for clustered indexes that are also disabled. Per eliminazione degli indici disabilitati, è necessario utilizzare 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 is not valid for indexed views, nonclustered indexes or indexes on local temp tables.

  • ONLINE = ON non è valida per gli indici columnstore.ONLINE = ON is not 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 nelle tabelle e non può essere applicato a indici cluster nelle viste o gli indici non cluster.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and cannot 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 viene propagata a tutti i Sottoscrittori SQL ServerSQL Server.By default, when you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, that change is propagated to all SQL ServerSQL Server Subscribers. Questa funzionalità presenta alcune restrizioni e può essere disabilitata.This functionality has some restrictions and can be disabled. 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 cannot 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 ulteriori informazioni sulla compressione dei dati, vederela 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 cannot change the compression setting of a single partition if the table has nonaligned indexes.

  • L'istruzione ALTER TABLE <tabella > REBUILD è PARTITION... consente di ricompilare la partizione specificata.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.

  • L'istruzione ALTER TABLE <tabella > REBUILD WITH... consente di ricompilare 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. Ciò può richiedere un tempo significativo.This can require a substantial time. Per eliminare una colonna NTEXT in una tabella con un numero elevato di righe, aggiornare la colonna NTEXT su un valore NULL, quindi eliminare la colonna.When dropping an NTEXT column in a table with a large number rows, update the NTEXT column to NULL value first, then drop the column. Questa operazione può essere eseguita con operazioni parallele e può essere molto più rapida.This can be performed with parallel operations and can be 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.In order to execute 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 eseguita, blocca tutte le nuove transazioni pronte per l'esecuzione in questa tabella.When the online index rebuild executes, it blocks all new transactions that are ready to start execution on this table. Sebbene la durata del blocco della ricompilazione dell'indice online sia molto 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, provocando un rallentamento o un timeout del carico di lavoro e limitando notevolmente l'accesso alla tabella sottostante.Although the duration of the lock for online index rebuild is very short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput, causing a workload slow down or timeout, and significantly limit access to the underlying table. Il WAIT_AT_LOW_PRIORITY opzione consente agli amministratori di gestire i blocchi di blocco S e Sch-M necessari per un indice online viene ricompilato e consente di selezionare una delle opzioni di 3.The WAIT_AT_LOW_PRIORITY option allows DBA's to manage the S-lock and Sch-M locks required for online index rebuilds and allows them to select one of 3 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 3 cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is executed 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 allows only two-part (schema.object) table names. In SQL Server 2017SQL Server 2017 l'utilizzo di un nome di tabella basato sui formati seguenti comporta la generazione dell'errore 117 in fase di compilazione.In SQL Server 2017SQL Server 2017, 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 4-part prefix.

PermissionsPermissions

È 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 is switched inherits the security of the target table.

Se nell'istruzione ALTER TABLE si definiscono 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 any columns in the ALTER TABLE statement are defined to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

Aggiunta di una colonna che aggiorna le righe della tabella richiede aggiornamento autorizzazione per la tabella.Adding a column that updates the rows of the table requires UPDATE permission on the table. Ad esempio, aggiungendo un non NULL colonna con un valore predefinito o aggiungere 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 is not empty.

Esempi Examples

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 di una definizione di colonnaAltering a column definition cambiare tipo di dati • cambiare dimensioni delle colonna • regole di confrontochange data type • change column size • collation
Modifica di una definizione di tabellaAltering a table definition DATA_COMPRESSION • SWITCH PARTITION OF • LOCK ESCALATION • rilevamento delle modificheDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
La 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 vincoli Adding 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 utilizza WITH VALUES, a ogni riga della nuova colonna viene associato il valore NULL.If WITH VALUES is not 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 indiciCreating a PRIMARY KEY constraint with index 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 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

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

H.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 il C4 colonna di tipo sparse a una colonna non di tipo sparse, eseguire l'istruzione seguente.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 cannot 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 vincoli Dropping 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 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_ContactBacup_Contact FOREIGN KEY (ContactID)  
    REFERENCES Person.Person (BusinessEntityID) ;  
GO  

ALTER TABLE Person.ContactBackup  
DROP CONSTRAINT FK_ContactBacup_Contact ;  
GO  

DROP TABLE Person.ContactBackup ;  

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

Modifica di una definizione di colonna Altering 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 viene aumenta le dimensioni di un varchar colonna e la precisione e scala di un decimale colonna.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 è un 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 is not 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.Frist, 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. Notare che il tipo di dati è richiesto, anche se non è modificato.Note that the data type is required, even though it is not changed.

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

Modifica di una definizione di tabella Altering 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 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

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

Per esempi sulla compressione dei dati aggiuntivi, vedere la 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. In questo modo si riducono le dimensioni della tabella, ma si aumenta il tempo necessario per l'archiviazione e il recupero.This 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 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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 utilizzata per tutte le tabelle columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore tables.

Si applica a: SQL Server 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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 is not partitioned, lock escalation is set at the TABLE level.

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 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 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

USE AdventureWorks2012;  
ALTER TABLE Person.Person  
ENABLE CHANGE_TRACKING;  

Nell'esempio seguente viene abilitato il rilevamento delle modifiche e il rilevamento delle colonne aggiornate durante una modifica.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 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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

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

Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

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

La disabilitazione e abilitazione di vincoli e trigger Disabling 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 utilizzando le opzioni di attesa con priorità bassaOnline index rebuild using low priority wait options

Nell'esempio seguente viene illustrato 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 2014SQL Server 2014 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 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 perform an alter column operation with the ONLINE option.

Si applica a: SQL Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 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 sistema System Versioning

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

Si applica a: SQL Server 2016SQL Server 2016 tramite SQL Server 2017SQL Server 2017 e Database SQL di AzureAzure SQL Database.Applies to: SQL Server 2016SQL Server 2016 through SQL Server 2017SQL Server 2017 and Database SQL di AzureAzure SQL Database.

A.A. Aggiungere il controllo delle versioni di sistema alle 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 future.The following example shows how to add system versioning to an existing table and create a future history table. In questo esempio presuppone che vi sia una tabella esistente denominata InsurancePolicy con una chiave primaria definita.This example assumes that there is an existing table called InsurancePolicy with a primary key defined. In questo esempio consente di popolare le colonne del periodo appena create per il controllo delle versioni del sistema utilizzando i valori predefiniti per gli orari 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 cannot be null. In questo esempio viene utilizzata la clausola HIDDEN per non garantire alcun impatto 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. Utilizza inoltre HISTORY_RETENTION_PERIOD disponibile in Database SQLSQL Database solo.It also uses HISTORY_RETENTION_PERIOD that is 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 GETUTCDATE(),   
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 utilizzare il controllo delle versioni di sistemaMigrate An Existing Solution to Use System Versioning

Nell'esempio seguente viene illustrato come eseguire la migrazione al controllo delle versioni di sistema da una soluzione che utilizza i trigger per simulare supporto temporale.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. Nell'esempio si presuppone di una soluzione esistente che utilizza un ProjectTaskCurrent tabella e un ProjectTaskHistory colonne della tabella per la soluzione esistente, che utilizza la data di modifica e data di revisione per il relativo periodi, alle colonne periodo non utilizzano il tipo di dati datetime2 e che il ProjectTaskCurrent tabella contiene una chiave primaria definita.The example assumes there is an existing solution that uses a ProjectTaskCurrent table and a ProjectTaskHistory table for its existing solution, that is uses the Changed Date and Revised Date columns for its periods, that these period columns do not use the datetime2 datatype and that the ProjectTaskCurrent table has a primary key defined.

-- Drop existing trigger  
DROP TRIGGER ProjectTaskCurrent_Trigger;  
-- Adjust the schema for current and history table  
-- Change data types for existing period columns  
ALTER TABLE ProjectTaskCurrent ALTER COLUMN [Changed Date] datetime2 NOT NULL;  
ALTER TABLE ProjectTaskCurrent 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 ProjectTaskCurrent  
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])  

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

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

In questo esempio viene illustrato come disabilitare il controllo delle versioni di sistema sul Department tabella, aggiungere una colonna e abilitare di nuovo 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. Disabilitare il controllo delle versioni di sistema è necessario per modificare lo schema della tabella.Disabling system versioning is required in order to modify the table schema. Eseguire questi passaggi all'interno di una transazione per impedire gli aggiornamenti a entrambe le tabelle durante l'aggiornamento dello schema di tabella, il vantaggio che consente all'amministratore di database per ignorare la coerenza dei dati verificare quando si abilita nuovamente il controllo delle versioni di sistema e garantire un miglioramento delle prestazioni.Perform 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. Si noti che attività quali la creazione delle statistiche, cambiando le partizioni o l'applicazione di compressione per una o entrambe le tabelle non richiedono la disabilitazione di controllo delle versioni di sistema.Note that tasks such as creating statistics, switching partitions or applying compression to one or both tables does not 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 di controllo delle versioni di sistemaRemoving System Versioning

In questo esempio viene illustrato come rimuovere completamente il controllo delle versioni di sistema della tabella di reparto e l'eliminazione di DepartmentHistory tabella.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. Facoltativamente, è inoltre possibile eliminare le colonne del periodo utilizzate dal sistema per registrare informazioni di controllo delle versioni di sistema.Optionally, you might also want to drop the period columns used by the system to record system versioning information. Si noti che è possibile eliminare il Department o DepartmentHistory tabelle mentre è abilitato il controllo delle versioni di sistema.Note that you cannot drop either the Department or the DepartmentHistory tables while system versioning is enabled.

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

Esempi: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

Nell'esempio seguente un da a C utilizzano la tabella FactResellerSales nel AdventureWorksPDW2012AdventureWorksPDW2012 database.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

E.E. Determinare se una tabella è partizionata.Determining 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 query.If the table is not 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';  

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

G.G. Determinare la 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;  

H.H. Unione di due partizioniMerging two partitions

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

Il Customer tabella presenta la seguente definizione: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 combina i limiti delle partizioni 10 a 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);  

Le nuove istruzioni DDL per la tabella è: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)));  

I.I. Suddivisione di una partizioneSplitting a partition

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

Il Customer tabella contiene istruzioni DDL seguenti: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 crea una nuova partizione associata dal valore 75, compreso 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);  

Le nuove istruzioni DDL per la tabella è: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 )));  

J.J. Tramite l'opzione per spostare una partizione in una tabella di cronologiaUsing SWITCH to move a partition to a history table

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

Il Orders tabella contiene istruzioni DDL seguenti: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, il Orders tabella contiene le seguenti partizioni.In this example, the Orders table has the following partitions. Ogni partizione contiene dati.Each partition contains data.

PartitionPartition Contiene i 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
  • La 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'
  • La 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'
  • La partizione 5 (contiene dati): ' 2007-01-01' < = OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Il OrdersHistory tabella contiene istruzioni DDL seguenti, che dispone di colonne identiche e nomi di colonna come il Orders tabella.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Entrambi sono hash distribuito sul id colonna.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' )));  

Anche se le colonne e nomi di colonna devono essere lo stesso, i limiti delle partizioni non è necessario essere uguali.Although the columns and column names must be the same, the partition boundaries do not need to be the same. In questo esempio, il OrdersHistory tabella contiene le seguenti due partizioni ed entrambe le partizioni sono vuote:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • La partizione 1 (nessun dato): OrderDate < ' 2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Partizione 2 (vuoto): "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' dal Orders tabella il OrdersHistory tabella.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 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 appariranno come indicato di seguito:The tables now appear as follows:

OrderstavoloOrders table

  • La partizione 1 (vuoto): 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'
  • La 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'
  • La partizione 5 (contiene dati): ' 2007-01-01' < = OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

    OrdersHistorytavoloOrdersHistory table

  • La partizione 1 (contiene dati): OrderDate < ' 2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'

  • Partizione 2 (vuoto): "2004-01-01' < = OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Per pulire il Orders tabella, è possibile rimuovere la partizione vuota mediante l'unione di 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, il Orders tabella contiene partizioni seguenti:After the merge, the Orders table has the following partitions:

OrderstavoloOrders table

  • La 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'
  • La 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 un altro anno passato e si è pronti per archiviare l'anno 2005.Suppose another year passes and you are ready to archive the year 2005. È possibile allocare una partizione vuota per l'anno 2005 nel OrdersHistory tabella 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 divisione, il OrdersHistory tabella contiene partizioni seguenti:After the split, the OrdersHistory table has the following partitions:

OrdersHistorytavoloOrdersHistory table

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

Vedere ancheSee Also

sys.tables (Transact-SQL) sys.tables (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TABLE ( Transact-SQL ) DROP TABLE (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
ALTER PARTITION SCHEME ( Transact-SQL ) ALTER PARTITION SCHEME (Transact-SQL)
ALTER PARTITION FUNCTION ( Transact-SQL ) ALTER PARTITION FUNCTION (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)