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

Gilt für: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL DW) JaParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Ändert eine Tabellendefinition durch Ändern, Hinzufügen oder Löschen von Spalten und Einschränkungen.Modifies a table definition by altering, adding, or dropping columns and constraints. Mit ALTER TABLE können Sie zudem Partitionen neu zuweisen und erstellen oder Einschränkungen und Trigger deaktivieren und aktivieren.ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

Weitere Informationen zu Syntaxkonventionen finden Sie unter Transact-SQL-Syntaxkonventionen.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Wichtig

Die Syntax für ALTER TABLE unterscheidet sich für datenträgerbasierte und speicheroptimierte Tabellen.The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. Über die folgenden Links gelangen Sie direkt zu dem für Ihre Tabellentypen geeigneten Syntaxblock sowie zu den Syntaxbeispielen.Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

Syntax für datenträgerbasierte TabellenSyntax for disk-based tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
    ALTER COLUMN column_name
    {
        [ type_schema_name. ] type_name
            [ (
                {
                   precision [ , scale ]
                 | max
                 | xml_schema_collection
                }
            ) ]
        [ COLLATE collation_name ]
        [ NULL | NOT NULL ] [ SPARSE ]
      | { ADD | DROP }
          { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
      | { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
    }
    [ WITH ( ONLINE = ON | OFF ) ]
    | [ WITH { CHECK | NOCHECK } ]
  
    | ADD
    {
        <column_definition>
      | <computed_column_definition>
      | <table_constraint>
      | <column_set_definition>
    } [ ,...n ]
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
                [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
                system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
                   [ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES] ,
        ]
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
    | DROP
     [ {
         [ CONSTRAINT ][ IF EXISTS ]
         {
              constraint_name
              [ WITH
               ( <drop_clustered_constraint_option> [ ,...n ] )
              ]
          } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }
  
    | { ENABLE | DISABLE } TRIGGER
        { ALL | trigger_name [ ,...n ] }
  
    | { ENABLE | DISABLE } CHANGE_TRACKING
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
  
    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]

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

    | REBUILD
      [ [PARTITION = ALL]
        [ WITH ( <rebuild_option> [ ,...n ] ) ]
      | [ PARTITION = partition_number
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
        ]
      ]
  
    | <table_option>
    | <filetable_option>
    | <stretch_configuration>
}
[ ; ]
  
-- ALTER TABLE options
  
<column_set_definition> ::=
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<drop_clustered_constraint_option> ::=
    {
        MAXDOP = max_degree_of_parallelism
      | ONLINE = { ON | OFF }
      | MOVE TO
         { partition_scheme_name ( column_name ) | filegroup | "default" }
    }
<table_option> ::=
    {
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
    }
  
<filetable_option> ::=
    {
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]
    }
  
<stretch_configuration> ::=
    {
      SET (
        REMOTE_DATA_ARCHIVE
        {
            = ON (<table_stretch_options>)
          | = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
          | ( <table_stretch_options> [, ...n] )
        }
            )
    }
  
<table_stretch_options> ::=
    {
     [ FILTER_PREDICATE = { null | table_predicate_function } , ]
       MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
    }
  
<single_partition_rebuild__option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }
    | ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
  
<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
        ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

Syntax für speicheroptimierte TabellenSyntax for memory-optimized tables

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

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

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

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

    | SET
        (
            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 }
                          }
                          ]
                        )
                      ]
                  }
          )

    | <table_option>
}
[ ; ]

-- ALTER TABLE options

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

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

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

<table_option> ::=
{
    MEMORY_OPTIMIZED = ON
  | DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}

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

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

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

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

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

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

ArgumenteArguments

database_namedatabase_name
Der Name der Datenbank, in der die Tabelle erstellt wurde.The name of the database in which the table was created.

schema_nameschema_name
Der Name des Schemas, zu dem die Tabelle gehört.The name of the schema to which the table belongs.

table_nametable_name
Der Name der Tabelle, die geändert werden soll.The name of the table to be altered. Wenn die Tabelle nicht in der aktuellen Datenbank oder in dem Schema enthalten ist, das dem aktuellen Benutzer gehört, müssen Sie die Datenbank und das Schema explizit angeben.If the table isn't in the current database or contained by the schema owned by the current user, you must explicitly specify the database and schema.

ALTER COLUMNALTER COLUMN
Gibt an, dass die benannte Spalte geändert werden soll.Specifies that the named column is to be changed or altered.

Für die geänderte Spalte gilt Folgendes:The modified column can't be:

  • Eine Spalte mit dem timestamp-Datentyp.A column with a timestamp data type.

  • Die Spalte darf nicht die ROWGUIDCOL-Spalte der Tabelle sein.The ROWGUIDCOL for the table.

  • Die Spalte darf keine berechnete Spalte sein und nicht in einer berechneten Spalte verwendet werden.A computed column or used in a computed column.

  • Die Spalte darf nicht in mit der CREATE STATISTICS-Anweisung generierten Statistiken verwendet werden.Used in statistics generated by the CREATE STATISTICS statement. Wenn die Spalte nicht den Datentyp varchar, nvarchar oder varbinary aufweist, wird der Datentyp nicht geändert.Unless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. Die neue Größe ist zudem gleich oder größer als die alte Größe.And, the new size is equal to or greater than the old size. Oder wenn die Spalte von NOT NULL in NULL geändert wird.Or, if the column is changed from not null to null. Entfernen Sie die Statistiken zunächst mithilfe der DROP STATISTICS-Anweisung.First, remove the statistics using the DROP STATISTICS statement.

    Hinweis

    Vom Abfrageoptimierer automatisch generierte Statistiken werden von ALTER COLUMN automatisch gelöscht.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • Die Spalte darf nicht in einer PRIMARY KEY- oder [FOREIGN KEY] REFERENCES-Einschränkung verwendet werden.Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • Die Spalte darf nicht in einer CHECK- oder UNIQUE-Einschränkung verwendet werden.Used in a CHECK or UNIQUE constraint. Das Ändern der Länge einer Spalte mit variabler Länge, die in einer CHECK- oder UNIQUE-Einschränkung verwendet wird, ist dagegen zulässig.But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • Der Spalte darf keine Standarddefinition zugeordnet sein.Associated with a default definition. Die Länge, die Genauigkeit oder die Dezimalstellen einer Spalte können jedoch geändert werden, sofern der Datentyp nicht geändert wird.However, the length, precision, or scale of a column can be changed if the data type isn't changed.

Der Datentyp von text-, ntext- und image-Spalten kann nur auf die folgende Weise geändert werden:The data type of text, ntext, and image columns can be changed only in the following ways:

  • text in varchar(max) , nvarchar(max) oder xmltext to varchar(max), nvarchar(max), or xml
  • ntext in varchar(max) , nvarchar(max) oder xmlntext to varchar(max), nvarchar(max), or xml
  • image in varbinary(max)image to varbinary(max)

Änderungen des Datentyps können Datenänderungen zur Folge haben.Some data type changes may cause a change in the data. Beispielsweise kann die Änderung einer Spalte vom Datentyp nchar oder nvarchar in char oder varchar zur Konvertierung erweiterter Zeichen führen.For example, changing a nchar or nvarchar column, to char or varchar, might cause the conversion of extended characters. Weitere Informationen finden Sie unter CAST und CONVERT.For more information, see CAST and CONVERT. Das Reduzieren der Genauigkeit und der Dezimalstellen einer Spalte kann zum Abschneiden von Daten führen.Reducing the precision or scale of a column can cause data truncation.

Hinweis

Der Datentyp einer Spalte einer partitionierten Tabelle kann nicht geändert werden.The data type of a column of a partitioned table can't be changed.

Der Datentyp der Spalten, die in einem Index enthalten sind, kann nicht geändert werden, es sei denn, die Spalte ist vom Datentyp varchar, nvarchar oder varbinary, und die neue Größe ist größer oder gleich der alten Größe.The data type of columns included in an index can't be changed unless the column is a varchar, nvarchar, or varbinary data type, and the new size is equal to or larger than the old size.

Spalten, die in einer PRIMARY KEY-Einschränkung enthalten sind, können nicht von NOT NULL in NULL geändert werden.A column included in a primary key constraint, can't be changed from NOT NULL to NULL.

Wenn Sie Always Encrypted (ohne Secure Enclaves) verwenden, können Sie, falls die Spalte, die modifiziert wird, mit ENCRYPTED WITH verschlüsselt ist, den Datentyp in einen kompatiblen Datentyp (wie etwa INT oder BIGINT) ändern, aber Sie können die Verschlüsselungseinstellungen nicht anpassen.When using Always Encrypted (without secure enclaves), if the column being modified is encrypted with 'ENCRYPTED WITH', you can change the datatype to a compatible datatype (such as INT to BIGINT), but you can't change any encryption settings.

Wenn Sie Always Encrypted mit Secure Enclaves verwenden, können Sie alle Verschlüsselungseinstellungen ändern, solange der Spaltenverschlüsselungsschlüssel, der die Spalte schützt (und der neue Spaltenverschlüsselungsschlüssel, wenn Sie den Schlüssel ändern), Enclave-Berechnungen unterstützt (verschlüsselt mit Enclave-fähigen Spaltenhauptschlüsseln).When using Always Encrypted with secure enclaves, you can change any encryption setting, if the column encryption key protecting the column (and the new column encryption key, if you're changing the key) support enclave computations (encrypted with enclave-enabled column master keys). Weitere Einzelheiten finden Sie unter Always Encrypted mit Secure Enclaves.For details, see Always Encrypted with secure enclaves.

column_namecolumn_name
Der Name der Spalte, die geändert, hinzugefügt oder gelöscht werden soll.The name of the column to be altered, added, or dropped. column_name darf maximal 128 Zeichen lang sein.The column_name maximum is 128 characters. Bei neuen Spalten, die mit einem timestamp-Datentyp erstellt wurden, ist column_name nicht erforderlich.For new columns, you can omit column_name for columns created with a timestamp data type. Der Name timestamp wird verwendet, wenn Sie column_name nicht für eine Spalte vom Datentyp timestamp angeben.The name timestamp is used if you don't specify column_name for a timestamp data type column.

Hinweis

Neue Spalten werden hinzugefügt, nachdem alle vorhandenen Spalten in der Tabelle geändert wurden.New columns are added after all existing columns in the table being altered.

[ type_schema_name .[ type_schema_name. ] type_name] type_name
Der neue Datentyp für die geänderte Spalte oder der Datentyp für die hinzugefügte Spalte.The new data type for the altered column, or the data type for the added column. type_name kann für vorhandene Spalten von partitionierten Tabellen nicht angegeben werden.You can't specify type_name for existing columns of partitioned tables. type_name kann einen der folgenden Typen aufweisen:type_name can be any one of the following types:

  • Ein SQL ServerSQL Server-Systemdatentyp.A SQL ServerSQL Server system data type.
  • Ein Aliasdatentyp, der auf einem SQL ServerSQL Server-Systemdatentyp basiert.An alias data type based on a SQL ServerSQL Server system data type. Aliasdatentypen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können.You create alias data types with the CREATE TYPE statement before they can be used in a table definition.
  • Ein benutzerdefinierter .NET Framework.NET Framework-Datentyp und das Schema, zu dem er gehört.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. Benutzerdefinierte Typen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können.You create user-defined types with the CREATE TYPE statement before they can be used in a table definition.

Es gelten folgende Kriterien für type_name in einer geänderten Spalte:The following are criteria for type_name of an altered column:

  • Der vorherige Datentyp muss implizit in den neuen Datentyp konvertiert werden können.The previous data type must be implicitly convertible to the new data type.
  • type_name darf nicht timestamp sein.type_name can't be timestamp.
  • ANSI NULL DEFAULT ist für ALTER COLUMN immer aktiviert. Fehlt die Angabe, so lässt die Spalte NULL-Werte zu.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • ANSI_PADDING ist für ALTER COLUMN immer auf ON festgelegt.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • Wenn die geänderte Spalte eine Identitätsspalte ist, muss new_data_type ein Datentyp sein, der die IDENTITY-Eigenschaft unterstützt.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • Die aktuelle Einstellung für SET ARITHABORT wird ignoriert.The current setting for SET ARITHABORT is ignored. ALTER TABLE wird ausgeführt, als sei ARITHABORT aktiviert.ALTER TABLE operates as if ARITHABORT is set to ON.

Hinweis

Falls die COLLATE-Klausel nicht angegeben wird, führt das Ändern des Datentyps einer Spalte dazu, dass die Sortierung in die Standardsortierung der Datenbank geändert wird.If the COLLATE clause isn't specified, changing the data type of a column causes a collation change to the default collation of the database.

precisionprecision
Die Genauigkeit für den angegebenen Datentyp.The precision for the specified data type. Weitere Informationen über gültige Genauigkeitswerte finden Sie unter Genauigkeit, Dezimalstellen und Länge.For more information about valid precision values, see Precision, Scale, and Length.

scalescale
Die Dezimalstellen für den angegebenen Datentyp.The scale for the specified data type. Weitere Informationen zu gültigen Dezimalstellenwerten finden Sie unter Genauigkeit, Dezimalstellen und Länge.For more information about valid scale values, see Precision, Scale, and Length.

maxmax
Gilt nur für die Datentypen varchar, nvarchar, und varbinary zum Speichern von 2^31-1 Bytes an Zeichen- und Binärdaten sowie von Unicode-Daten.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
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gilt nur für den xml-Datentyp zum Zuordnen eines XML-Schemas zum Typ.Applies only to the xml data type for associating an XML schema with the type. Bevor Sie eine xml-Spalte mit einer Schemaauflistung typisieren können, muss die Schemaauflistung mithilfe von CREATE XML SCHEMA COLLECTION in der Datenbank erstellt werden.Before typing an xml column to a schema collection, you first create the schema collection in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < collation_name >COLLATE < collation_name >
Gibt die neue Sortierung für die geänderte Spalte an.Specifies the new collation for the altered column. Wenn keine Sortierung angegeben ist, wird der Spalte die Standardsortierung der Datenbank zugewiesen.If not specified, the column is assigned the default collation of the database. Als Sortierungsname kann entweder der Name einer Windows-Sortierreihenfolge oder ein SQL-Sortierungsname verwendet werden.Collation name can be either a Windows collation name or a SQL collation name. Eine Liste und weitere Informationen finden Sie unter Name der Windows-Sortierung und SQL Server-Sortierungsname.For a list and more information, see Windows Collation Name and SQL Server Collation Name.

Mit der COLLATE-Klausel werden nur die Sortierungen von Spalten der Datentypen char, varchar, nchar und nvarchar geändert.The COLLATE clause changes the collations only of columns of the char, varchar, nchar, and nvarchar data types. Um die Sortierung einer benutzerdefinierten Aliasdatentyp-Spalte zu ändern, verwenden Sie separate ALTER TABLE-Anweisungen zum Ändern der Spalte in einen SQL ServerSQL Server-Systemdatentyp.To change the collation of a user-defined alias data type column, use separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type. Ändern Sie dann die Sortierung, und ändern Sie die Spalte zurück in einen Aliasdatentyp.Then, change its collation and change the column back to an alias data type.

Mit ALTER COLUMN kann die Sortierung nicht geändert werden, wenn mindestens eine der folgenden Bedingungen zutrifft:ALTER COLUMN can't have a collation change if one or more of the following conditions exist:

  • Wenn eine CHECK-Einschränkung, eine FOREIGN KEY-Einschränkung oder berechnete Spalten auf die geänderte Spalte verweisen.If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • Wenn ein Index, eine Statistik oder ein Volltextindex für die Spalte erstellt werden.If any index, statistics, or full-text index are created on the column. Statistiken, die automatisch für die geänderte Spalte erstellt wurden, werden gelöscht, wenn die Spaltensortierung geändert wird.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • Wenn eine schemagebundene Sicht oder Funktion auf die Spalte verweist.If a schema-bound view or function references the column.

Weitere Informationen finden Sie unter COLLATE.For more information, see COLLATE.

NULL | NOT NULLNULL | NOT NULL
Gibt an, ob die Spalte NULL-Werte akzeptiert.Specifies whether the column can accept null values. Spalten, die keine NULL-Werte zulassen, können mit ALTER TABLE nur hinzugefügt werden, wenn für sie ein Standardwert angegeben ist oder wenn die Tabelle leer ist.Columns that don't allow null values are added with ALTER TABLE only if they have a default specified or if the table is empty. NOT NULL kann nur für berechnete Spalten angegeben werden, wenn auch PERSISTED angegeben wird.You can specify NOT NULL for computed columns only if you've also specified PERSISTED. Wenn die neue Spalte NULL-Werte zulässt und kein Standardwert angegeben wird, enthält sie einen NULL-Wert für jede Zeile in der Tabelle.If the new column allows null values and you don't specify a default, the new column contains a null value for each row in the table. Wenn die neue Spalte NULL-Werte zulässt und eine Standarddefinition mit der neuen Spalte hinzugefügt wird, können Sie WITH VALUES verwenden, um den Standardwert in der neuen Spalte für jede vorhandene Zeile in der Tabelle zu speichern.If the new column allows null values and you add a default definition with the new column, you can use WITH VALUES to store the default value in the new column for each existing row in the table.

Wenn die neue Spalte keine NULL-Werte zulässt und die Tabelle nicht leer ist, müssen Sie eine DEFAULT-Definition mit der neuen Spalte hinzufügen.If the new column doesn't allow null values and the table isn't empty, you have to add a DEFAULT definition with the new column. Die neue Spalte wird zudem automatisch mit dem Standardwert in den neuen Spalten in jeder vorhandenen Zeile geladen.And, the new column automatically loads with the default value in the new columns in each existing row.

Durch die Angabe von NULL in ALTER COLUMN kann erzwungen werden, dass eine NOT NULL-Spalte, mit Ausnahme von Spalten in PRIMARY KEY-Einschränkungen, NULL-Werte zulässt.You can specify NULL in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. NOT NULL kann nur in ALTER COLUMN angegeben werden, wenn die Spalte keine NULL-Werte enthält.You can specify NOT NULL in ALTER COLUMN only if the column contains no null values. Die NULL-Werte müssen auf einen beliebigen Wert aktualisiert werden, damit ALTER COLUMN NOT NULL zulässig ist. Beispiel: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;

Wenn Sie eine Tabelle mit der CREATE TABLE- oder ALTER TABLE-Anweisung erstellen bzw. ändern, beeinflussen die Datenbank- und Sitzungseinstellungen die NULL-Zulässigkeit des in einer Spaltendefinition verwendeten Datentyps und setzen diese möglicherweise außer Kraft.When you create or alter a table with the CREATE TABLE or ALTER TABLE statements, the database and session settings influence and possibly override the nullability of the data type that's used in a column definition. Stellen Sie sicher, dass Sie eine nicht berechnete Spalte stets explizit als NULL oder NOT NULL definieren.Be sure that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

Wenn Sie eine Spalte mit einem benutzerdefinierten Datentyp hinzufügen, stellen Sie sicher, dass Sie die Spalte mit der gleichen NULL-Zulässigkeit wie der des benutzerdefinierten Datentyps definieren.If you add a column with a user-defined data type, be sure to define the column with the same nullability as the user-defined data type. Geben Sie zudem einen Standardwert für die Spalte an.And, specify a default value for the column. Weitere Informationen finden Sie unter CREATE TABLE.For more information, see CREATE TABLE.

Hinweis

Wenn NULL oder NOT NULL mit ALTER COLUMN angegeben werden, muss auch new_data_type [(precision [, scale ])] angegeben werden.If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. Wenn Datentyp, Genauigkeit und Dezimalstellen nicht geändert werden, geben Sie die aktuellen Spaltenwerte an.If the data type, precision, and scale are not changed, specify the current column values.

[ {ADD | DROP} ROWGUIDCOL ][ {ADD | DROP} ROWGUIDCOL ]
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt an, dass die ROWGUIDCOL-Eigenschaft der angegebenen Spalte hinzugefügt oder daraus gelöscht wird.Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL zeigt an, dass die Spalte eine GUID-Spalte für eine Zeile darstellt.ROWGUIDCOL indicates that the column is a row GUID column. Sie können nur eine uniqueidentifier-Spalte pro Tabelle als ROWGUIDCOL-Spalte kennzeichnen.You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. Die ROWGUIDCOL-Eigenschaft kann nur einer uniqueidentifier-Spalte zugewiesen werden.And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. ROWGUIDCOL kann keiner Spalte eines benutzerdefinierten Datentyps zugewiesen werden.You can't assign ROWGUIDCOL to a column of a user-defined data type.

ROWGUIDCOL erzwingt keine Eindeutigkeit der in der Spalte gespeicherten Werte und generiert nicht automatisch Werte für neue Zeilen, die in die Tabelle eingefügt werden.ROWGUIDCOL doesn't enforce uniqueness of the values stored in the column and doesn't automatically generate values for new rows that are inserted into the table. Um für jede Spalte eindeutige Werte zu generieren, verwenden Sie entweder die NEWID- oder die NEWSEQUENTIALID-Funktion in INSERT-Anweisungen.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. Geben Sie alternativ dazu die NEWID- oder die NEWSEQUENTIALID-Funktion als Standardwert für die Spalte an.Or, specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADD | DROP} PERSISTED ][ {ADD | DROP} PERSISTED ]
Gibt an, dass die PERSISTED-Eigenschaft der angegebenen Spalte hinzugefügt oder aus ihr gelöscht wird.Specifies that the PERSISTED property is added to or dropped from the specified column. Die Spalte muss eine berechnete Spalte sein, die durch einen deterministischen Ausdruck definiert ist.The column must be a computed column that's defined with a deterministic expression. Für Spalten, die als PERSISTED angegeben werden, speichert das Datenbank-EngineDatabase Engine die berechneten Werte physisch in der Tabelle und aktualisiert die Werte, wenn andere Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden.For columns specified as PERSISTED, the Datenbank-EngineDatabase 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. Durch Kennzeichnen einer berechneten Spalte als PERSISTED können Sie Indizes für berechnete Spalten erstellen, die durch deterministische, aber nicht genaue Ausdrücke definiert sind.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. Weitere Informationen finden Sie unter Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Jede berechnete Spalte, die als Partitionierungsspalte einer partitionierten Tabelle verwendet wird, muss explizit als PERSISTED gekennzeichnet sein.Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt an, dass Werte in Identitätsspalten inkrementiert werden, wenn Replikations-Agents Einfügevorgänge ausführen.Specifies that values are incremented in identity columns when replication agents carry out insert operations. Diese Klausel kann nur angegeben werden, wenn column_name eine Identitätsspalte ist.You can specify this clause only if column_name is an identity column.

SPARSESPARSE
Gibt an, dass die Spalte eine Sparsespalte ist.Indicates that the column is a sparse column. Der Speicher für Sparsespalten ist für NULL-Werte optimiert.The storage of sparse columns is optimized for null values. Sparsespalten können nicht als NOT NULL festgelegt werden.You can't set sparse columns as NOT NULL. Beim Umwandeln einer Sparsespalte in eine Nicht-Sparsespalte oder umgekehrt wird die Tabelle für die Dauer der Befehlsausführung gesperrt.Converting a column from sparse to nonsparse or from nonsparse to sparse, locks the table for the duration of the command execution. Sie müssen möglicherweise die REBUILD-Klausel verwenden, um Speicherplatzeinsparungen freizugeben.You may need to use the REBUILD clause to reclaim any space savings. Weitere Einschränkungen und Informationen zu Sparsespalten finden Sie unter Verwenden von Sparsespalten.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt eine dynamische Datenmaske an.Specifies a dynamic data mask. mask_function ist der Name der Maskierungsfunktion mit den entsprechenden Parametern.mask_function is the name of the masking function with the appropriate parameters. Drei Optionen stehen zur Verfügung:Three functions are available:

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

Verwenden Sie DROP MASKED, um eine Maske zu löschen.To drop a mask, use DROP MASKED. Weitere Informationen zu Funktionsparametern finden Sie im Artikel zur dynamischen Datenmaskierung.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <wie beim Ändern einer Spalte>WITH ( ONLINE = ON | OFF) <as applies to altering a column>
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Ermöglicht verschiedene Aktionen zum Ändern einer Spalte, während die Tabelle verfügbar bleibt.Allows many alter column actions to be carried out while the table remains available. Die Standardeinstellung ist OFF.Default is OFF. ALTER COLUMN kann online für Spaltenänderungen in Bezug auf Datentyp, Spaltenlänge, Genauigkeit, NULL-Zulässigkeit, geringe Dichte und Sortierung ausgeführt werden.You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

Die Onlineänderung ermöglicht, dass vom Benutzer und automatisch erstellte Statistiken weiterhin während des ALTER COLUMN-Vorgangs auf die geänderte Spalte verweisen. So können Abfragen wie gewohnt ausgeführt werden.Online alter column allows user created and autostatistics to reference the altered column for the duration of the ALTER COLUMN operation, which allows queries to run as usual. Nach dem Beenden des Vorgangs werden automatisch erstellte Statistiken, die auf die Spalte verweisen, gelöscht, und vom Benutzer erstellte Statistiken werden ungültig.At the end of the operation, autostats that reference the column are dropped and user-created stats are invalidated. Der Benutzer muss benutzergenerierte Statistiken manuell aktualisieren, nachdem der Vorgang abgeschlossen wurde.The user must manually update user-generated statistics after the operation is completed. Wenn die Spalte Teil eines Filterausdrucks für Statistiken oder Indizes ist, kann kein Spaltenänderungsvorgang ausgeführt werden.If the column is part of a filter expression for any statistics or indexes then you can't perform an alter column operation.

  • Während des Onlineänderungsvorgangs werden alle Vorgänge blockiert, die von der Spalte abhängig sein könnten (Index, Ansichten usw.), oder es tritt ein Fehler mit einer entsprechenden Fehlermeldung auf.While the online alter column operation is running, all operations that could take a dependency on the column (index, views, and so on.) block or fail with an appropriate error. Durch dieses Verhalten wird sichergestellt, dass bei der Onlineänderung der Spalte kein Fehler aufgrund von Abhängigkeiten auftritt, die während des Vorgangs entstanden sind.This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • Das Ändern einer Spalte von NOT NULL auf NULL ist bei einem Onlinevorgang nicht möglich, wenn nicht gruppierte Indizes auf die geänderte Spalte verweisen.Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • Die Onlineänderung wird nicht unterstützt, wenn auf die Spalte mit einer CHECK-Einschränkung verwiesen wird und der Änderungsvorgang die Genauigkeit der Spalte („numeric“ oder „datetime“) einschränkt.Online alter isn't supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).
  • Die WAIT_AT_LOW_PRIORITY-Option kann für die Onlinespaltenänderung nicht verwendet werden.The WAIT_AT_LOW_PRIORITY option can't be used with online alter column.
  • ALTER COLUMN ... ADD/DROP PERSISTED wird bei der Onlinespaltenänderung nicht unterstützt.ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION ist von der Onlinespaltenänderung nicht betroffen.ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • Die Onlinespaltenänderung von Tabellen mit Änderungsnachverfolgung und von Tabellen, die ein Mergereplikationsverleger sind, wird nicht unterstützt.Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • Die Onlinespaltenänderung unterstützt nicht das Ändern von oder in CLR-Datentypen.Online alter column doesn't support altering from or to CLR data types.
  • Die Änderung in einen XML-Datentyp mit einer von der aktuellen Schemaauflistung abweichenden Auflistung wird von der Onlinespaltenänderung nicht unterstützt.Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • Durch die Onlinespaltenänderung werden die Einschränkungen, die festlegen, wann eine Spalte geändert werden kann, nicht verringert.Online alter column doesn't reduce the restrictions on when a column can be altered. Durch Verweise von Index/Statistiken usw. tritt möglicherweise ein Fehler beim Änderungsvorgang auf.References by index/stats, and so on, might cause the alter to fail.
  • Mit der Onlinespaltenänderung können nicht mehrere Spalten gleichzeitig geändert werden.Online alter column doesn't support altering more than one column concurrently.
  • Die Onlinespaltenänderung hat keine Auswirkungen, wenn es sich um eine temporale Tabelle mit Systemversionsverwaltung handelt.Online alter column has no effect in a system-versioned temporal table. ALTER COLUMN wird nicht im Modus „online“ ausgeführt. Dies gilt unabhängig vom Wert, der für die Option ONLINE festgelegt wurde.ALTER column isn't run as online regardless of which value was specified for ONLINE option.

Für die Onlinespaltenänderung gelten ähnliche Anforderungen, Einschränkungen und Funktionen wie für die Online-Indexneuerstellung. Dazu gehören Folgende:Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • Die Online-Indexneuerstellung wird nicht unterstützt, wenn die Tabelle ältere LOB- oder Filestream-Spalten enthält oder die Tabelle über einen Columnstore-Index verfügt.Online index rebuild isn't supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. Die gleichen Einschränkungen gelten für die Onlinespaltenänderung.The same limitations apply for online alter column.
  • Eine vorhandene Spalte, die geändert wird, erfordert die doppelte Speicherplatzzuordnung: für die ursprüngliche Spalte und für die neu erstellte, ausgeblendete Spalte.An existing column being altered requires twice the space allocation, for the original column and for the newly created hidden column.
  • Die Sperrstrategie während eines Onlinevorgangs zur Spaltenänderung folgt demselben Sperrmuster wie die Onlineindexerstellung.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
Gibt an, ob die Daten in der Tabelle bei einer neu hinzugefügten oder erneut aktivierten FOREIGN KEY- oder CHECK-Einschränkung überprüft werden.Specifies whether the data in the table is or isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. Fehlt die Angabe, so wird WITH CHECK für neue Einschränkungen und WITH NOCHECK für erneut aktivierte Einschränkungen angenommen.If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

Verwenden Sie WITH NOCHECK, wenn neue CHECK- oder FOREIGN KEY-Einschränkungen nicht für vorhandene Daten überprüft werden sollen.If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. Diese Vorgehensweise wird nur in seltenen Fällen empfohlen.We don't recommend doing this, except in rare cases. Die neue Einschränkung wird bei allen späteren Datenupdates ausgewertet.The new constraint is evaluated in all later data updates. Einschränkungsverletzungen, die beim Hinzufügen der Einschränkung durch WITH NOCHECK unterdrückt werden, können zu Fehlern bei zukünftigen Updates führen, wenn Zeilen mit Daten aktualisiert werden, die der Einschränkung nicht entsprechen.Any constraint violations that are suppressed by WITH NOCHECK when the constraint is added may cause future updates to fail if they update rows with data that doesn't follow the constraint.

Hinweis

Der Abfrageoptimierer berücksichtigt mit WITH NOCHECK definierte Einschränkungen nicht.The query optimizer doesn't consider constraints that are defined WITH NOCHECK. Diese Einschränkungen werden ignoriert, bis sie mithilfe von ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL erneut aktiviert werden.Such constraints are ignored until they are re-enabled by using ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

ALTER INDEX index_nameALTER INDEX index_name
Gibt an, dass die Bucketanzahl von index_name geändert werden muss.Specifies that the bucket count for index_name is to be changed or altered.

Die Syntax ALTER TABLE... ADD/DROP/ALTER INDEX wird nur für speicheroptimierte Tabelle unterstützt.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Wichtig

Wenn keine ALTER TABLE-Anweisung verwendet wird, werden die Anweisungen CREATE INDEX, DROP INDEX, ALTER INDEX und PAD_INDEX nicht für Indizes auf speicheroptimierten Tabellen unterstützt.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

ADDADD
Gibt an, dass eine oder mehrere Spaltendefinitionen, Definitionen berechneter Spalten oder Tabelleneinschränkungen hinzugefügt werden.Specifies that one or more column definitions, computed column definitions, or table constraints are added. Alternativ dazu werden die Spalten hinzugefügt, die das System zur Systemversionsverwaltung verwendet.Or, the columns that the system uses for system versioning are added. Für speicheroptimierte Tabellen kann ein Index hinzugefügt werden.For memory-optimized tables, you can add an index.

Hinweis

Neue Spalten werden hinzugefügt, nachdem alle vorhandenen Spalten in der Tabelle geändert wurden.New columns are added after all existing columns in the table being altered.

Wichtig

Wenn keine ALTER TABLE-Anweisung verwendet wird, werden die Anweisungen CREATE INDEX, DROP INDEX, ALTER INDEX und PAD_INDEX nicht für Indizes auf speicheroptimierten Tabellen unterstützt.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX aren't supported for indexes on memory-optimized tables.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
Gilt für: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt die Namen der Spalten an, die das System zum Aufzeichnen des Zeitraums verwendet, für den ein Datensatz gültig ist.Specifies the names of the columns that the system uses to record the period of time for which a record is valid. Sie können vorhandene Spalten angeben oder neue Spalten im Rahmen des ADD PERIOD FOR SYSTEM_TIME-Arguments erstellen.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. Richten Sie Spalten mit dem Datentyp „datetime2“ ein, und definieren Sie sie als NOT NULL.Set up the columns with the datatype of datetime2 and define them as NOT NULL. Wenn Sie eine Zeitraumspalte als NULL definieren, tritt ein Fehler auf.If you define a period column as NULL, an error results. Sie können für die Spalten system_start_time und system_end_time column_constraint definieren und/oder Standardwerte für Spalten angeben.You can define a column_constraint and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. Sehen Sie sich Beispiel A in den folgenden Beispielen zur Systemversionsverwaltung an, in dem veranschaulicht wird, wie Sie Standardwerte für system_end_time-Spalten einsetzen können.See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

Verwenden Sie dieses Argument mit dem Argument SET SYSTEM_VERSIONING, um die Systemversionsverwaltung für eine vorhandene Tabelle zu ermöglichen.Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. Weitere Informationen finden Sie im Artikel zu temporalen Tabelle und unter Getting Started with Temporal Tables in Azure SQL Database (Erste Schritte mit temporalen Tabellen in Azure SQL-Datenbank).For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

Ab SQL Server 2017 (14.x)SQL Server 2017 (14.x) können Benutzer eine oder beide Zeitraumspalten mit dem Flag HIDDEN kennzeichnen, um diese Spalten implizit auszublenden, sodass SELECT * FROM<table_name> für diese Spalten keinen Wert zurückgibt.As of SQL Server 2017 (14.x)SQL Server 2017 (14.x), users can mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM <table_name> doesn't return a value for the columns. Standardmäßig sind Zeitraumspalten nicht ausgeblendet.By default, period columns aren't hidden. Damit sie verwendet werden können, müssen ausgeblendete Spalten explizit in allen Abfragen eingeschlossen werden, die direkt auf die temporale Tabelle verweisen.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
Gibt an, dass eine oder mehrere Spaltendefinitionen, Definitionen berechneter Spalten oder Tabelleneinschränkungen oder die Spezifikation der Spalten, die das System zur Systemversionsverwaltung verwendet, gelöscht werden.Specifies that one or more column definitions, computed column definitions, or table constraints are dropped, or to drop the specification for the columns that the system uses for system versioning.

CONSTRAINT constraint_nameCONSTRAINT constraint_name
Gibt an, dass constraint_name aus der Tabelle entfernt wird.Specifies that constraint_name is removed from the table. Es können mehrere Einschränkungen aufgeführt werden.Multiple constraints can be listed.

Der benutzerdefinierte oder vom System bereitgestellte Name der Einschränkung kann durch Abfragen der Katalogsichten sys.check_constraint, sys.default_constraints, sys.key_constraints und sys.foreign_keys ermittelt werden.You can determine the user-defined or system-supplied name of the constraint by querying the sys.check_constraint, sys.default_constraints, sys.key_constraints, and sys.foreign_keys catalog views.

Eine PRIMARY KEY-Einschränkung kann nicht gelöscht werden, wenn ein XML-Index für die Tabelle vorhanden ist.A PRIMARY KEY constraint can't be dropped if an XML index exists on the table.

INDEX index_nameINDEX index_name
Gibt an, dass index_name aus der Tabelle entfernt wird.Specifies that index_name is removed from the table.

Die Syntax ALTER TABLE... ADD/DROP/ALTER INDEX wird nur für speicheroptimierte Tabelle unterstützt.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

Wichtig

Wenn keine ALTER TABLE-Anweisung verwendet wird, werden die Anweisungen CREATE INDEX, DROP INDEX, ALTER INDEX und PAD_INDEX nicht für Indizes auf speicheroptimierten Tabellen unterstützt.Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

COLUMN column_nameCOLUMN column_name
Gibt an, dass contraint_name oder column_name aus der Tabelle gelöscht wird.Specifies that constraint_name or column_name is removed from the table. Es können mehrere Spalten aufgeführt werden.Multiple columns can be listed.

Unter folgenden Umständen kann eine Spalte nicht gelöscht werden:A column can't be dropped when it's:

  • Wenn sie in einem Index als Schlüsselspalte oder als INCLUDE-Element verwendet wird.Used in an index, whether as a key column or as an INCLUDE
  • Wenn sie in einer CHECK-, FOREIGN KEY-, UNIQUE- oder PRIMARY KEY-Einschränkung verwendet wird.Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.
  • Wenn ihr ein mit dem DEFAULT-Schlüsselwort definierter Standardwert zugeordnet ist oder wenn sie an ein Standardobjekt gebunden ist.Associated with a default that's defined with the DEFAULT keyword, or bound to a default object.
  • Wenn sie an eine Regel gebunden ist.Bound to a rule.

Hinweis

Durch Löschen einer Spalte wird der Speicherplatz der Spalte nicht freigegeben.Dropping a column doesn't reclaim the disk space of the column. Unter Umständen müssen Sie den Speicherplatz einer gelöschten Spalte freigeben, wenn das Limit der Zeilengröße einer Tabelle fast erreicht oder überschritten ist.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. Zum Freigeben des Speicherplatzes erstellen Sie einen gruppierten Index für die Tabelle oder erstellen einen vorhandenen gruppierten Index mithilfe von ALTER INDEX neu.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. Weitere Informationen zu den Auswirkungen gelöschter LOB-Datentypen finden Sie in diesem CSS-Blogbeitrag.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIMEPERIOD FOR SYSTEM_TIME
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Löscht die Spezifikation der Spalten, die das System zur Systemversionierung verwendet.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option>WITH <drop_clustered_constraint_option>
Gibt an, dass mindestens eine Option zum Löschen einer gruppierten Einschränkung festgelegt wurde.Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Überschreibt die Konfigurationsoption Max. Grad an Parallelität nur für die Dauer des Vorgangs.Overrides the max degree of parallelism configuration option only for the duration of the operation. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität.For more information, see Configure the max degree of parallelism Server Configuration Option.

Verwenden Sie die MAXDOP-Option, um die Anzahl der Prozessoren zu beschränken, die für die Ausführung paralleler Pläne verwendet werden.Use the MAXDOP option to limit the number of processors used in parallel plan execution. Maximal sind 64 Prozessoren zulässig.The maximum is 64 processors.

max_degree_of_parallelism kann einer der folgenden Werte sein:max_degree_of_parallelism can be one of the following values:

11
Unterdrückt das Generieren paralleler Pläne.Suppresses parallel plan generation.

>1>1
Begrenzt die Höchstzahl von Prozessoren in einem parallelen Indexvorgang auf die angegebene ZahlRestricts the maximum number of processors used in a parallel index operation to the specified number.

0 (Standard)0 (default)
Verwendet abhängig von der aktuellen Systemarbeitsauslastung die tatsächliche Anzahl von Prozessoren oder weniger Prozessoren.Uses the actual number of processors or fewer based on the current system workload.

Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgängen.For more information, see Configure Parallel Index Operations.

Hinweis

Parallele Indexvorgänge sind nicht in jeder Edition von SQL ServerSQL Server verfügbar.Parallel index operations aren't available in every edition of SQL ServerSQL Server. Weitere Informationen finden Sie unter Editionen und unterstützte Features von SQL Server 2016 und unter Editionen und unterstützte Features von SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

ONLINE = { ON | OFF } <wie bei drop_clustered_constraint_option>ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>
Gibt an, ob die zugrunde liegenden Tabellen und zugeordneten Indizes für Abfragen und Datenänderungen während des Indexvorgangs verfügbar sind.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Der Standardwert ist OFF.The default is OFF. Sie können REBUILD als ONLINE-Vorgang ausführen.You can run REBUILD as an ONLINE operation.

ONON
Lang andauernde Tabellensperren werden nicht für die Dauer des Indexvorgangs aufrechterhalten.Long-term table locks aren't held for the duration of the index operation. Während der Hauptphase des Indexvorgangs wird nur eine beabsichtigte freigegebene Sperre für die Quelltabelle aufrechterhalten.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Durch dieses Verhalten können Abfragen oder Updates der zugrunde liegenden Tabelle und Indizes fortgesetzt werden.This behavior enables queries or updates to the underlying table and indexes to continue. Zu Beginn des Vorgangs wird das Quellobjekt für kurze Zeit mit einer gemeinsamen Sperre (Shared, S) belegt.At the start of the operation, a Shared (S) lock is held on the source object for a short time. Am Ende des Vorgangs wird für kurze Zeit eine gemeinsame Sperre (S) für die Quelle aktiviert, wenn ein nicht gruppierter Index erstellt wird.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. Alternativ dazu wird eine Schemaänderungssperre (Schema Modification, SCH-M) aktiviert, wenn ein gruppierter Index online erstellt oder gelöscht wird und wenn ein gruppierter oder nicht gruppierter Index neu erstellt wird.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. ONLINE kann nicht auf ON festgelegt werden, wenn ein Index für eine lokale temporäre Tabelle erstellt wird.ONLINE can't be set to ON when an index is being created on a local temporary table. Nur ein Heap-Neuerstellungsvorgang mit einem einzelnen Thread ist zulässig.Only single-threaded heap rebuild operation is allowed.

Um die DDL für SWITCH oder für eine Onlineneuerstellung eines Indexes auszuführen, müssen alle aktiven blockierenden Transaktionen, die in einer bestimmten Tabelle ausgeführt werden, abgeschlossen sein.To run the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. Bei der Ausführung verhindert SWITCH oder der Neuerstellungsvorgang das Starten neuer Transaktionen. Dies kann sich auf den Arbeitsauslastungsdurchsatz auswirken und den Zugriff auf die zugrunde liegende Tabelle vorübergehend deutlich einschränken.When executing, the SWITCH or rebuild operation prevents new transactions from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
Die Tabellensperren werden für die Dauer des Indexvorgangs angewendet.Table locks apply for the duration of the index operation. Ein Offlineindexvorgang, bei dem ein gruppierter Index erstellt, neu erstellt oder gelöscht bzw. ein nicht gruppierter Index neu erstellt oder gelöscht wird, aktiviert eine Schemaänderungssperre (SCH-M) für die Tabelle.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. Durch diese Sperre wird verhindert, dass Benutzer für die Dauer des Vorgangs auf die zugrunde liegende Tabelle zugreifen können.This lock prevents all user access to the underlying table for the duration of the operation. Ein Offlineindexvorgang, bei dem ein nicht gruppierter Index erstellt wird, aktiviert eine freigegebene Sperre (S) für die Tabelle.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Durch diese Sperre werden Updates der zugrunde liegenden Tabelle verhindert. Lesevorgänge wie SELECT-Anweisungen sind jedoch zulässig.This lock prevents updates to the underlying table but allows read operations, such as SELECT statements. Heap-Neuerstellungsvorgänge mit mehreren Threads sind zulässig.Multi-threaded heap rebuild operations are allowed.

Weitere Informationen finden Sie unter Funktionsweise von Onlineindexvorgängen.For more information, see How Online Index Operations Work.

Hinweis

Onlineindexvorgänge sind nicht in jeder Edition von SQL ServerSQL Serververfügbar.Online index operations are not available in every edition of SQL ServerSQL Server. Weitere Informationen finden Sie unter Editionen und unterstützte Features von SQL Server 2016 und unter Editionen und unterstützte Features von SQL Server 2017.For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVE TO { partition_scheme_name ( column_name [ 1 , ... n] ) | filegroup | " default " }MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " }
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt einen Speicherort an, an den die Datenzeilen verschoben werden sollen, die sich aktuell auf der Blattebene des gruppierten Indexes befinden.Specifies a location to move the data rows currently in the leaf level of the clustered index. Die Tabelle wird an den neuen Speicherort verschoben.The table is moved to the new location. Diese Option gilt nur für Einschränkungen, durch die ein gruppierter Index erstellt wird.This option applies only to constraints that create a clustered index.

Hinweis

In diesem Zusammenhang ist „default“ kein Schlüsselwort.In this context, default isn't a keyword. Es ist ein Bezeichner für die Standarddateigruppe und muss begrenzt werden, wie in MOVE TO " default " oder MOVE TO [ default ] .It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. Wenn " default " angegeben ist, muss die QUOTED_IDENTIFIER-Option in der aktuellen Sitzung auf ON festgelegt sein.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Dies ist die Standardeinstellung.This is the default setting. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

{ CHECK | NOCHECK } CONSTRAINT{ CHECK | NOCHECK } CONSTRAINT
Gibt an, dass contraint_name aktiviert oder deaktiviert wird.Specifies that constraint_name is enabled or disabled. Diese Option kann nur mit FOREIGN KEY- und CHECK-Einschränkungen verwendet werden.This option can only be used with FOREIGN KEY and CHECK constraints. Wenn NOCHECK angegeben wird, wird die Einschränkung deaktiviert, und zukünftige Einfügungen oder Updates der Spalte werden nicht anhand der Einschränkungsbedingungen überprüft.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. DEFAULT-, PRIMARY KEY- und UNIQUE-Einschränkungen können nicht deaktiviert werden.DEFAULT, PRIMARY KEY, and UNIQUE constraints can't be disabled.

ALLALL
Gibt an, dass alle Einschränkungen entweder mit der NOCHECK-Option deaktiviert oder mit der CHECK-Option aktiviert werden.Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER{ ENABLE | DISABLE } TRIGGER
Gibt an, dass trigger_name aktiviert oder deaktiviert wird.Specifies that trigger_name is enabled or disabled. Wenn ein Trigger deaktiviert wird, bleibt er dennoch weiterhin für die Tabelle definiert.When a trigger is disabled, it's still defined for the table. Bei der Ausführung von INSERT-, UPDATE- oder DELETE-Anweisungen für die Tabelle werden die Aktionen im Trigger jedoch erst ausgeführt, wenn der Trigger wieder aktiviert wird.However, when INSERT, UPDATE, or DELETE statements run against the table, the actions in the trigger aren't carried out until the trigger is re-enabled.

ALLALL
Gibt an, dass alle Trigger in der Tabelle aktiviert oder deaktiviert werden.Specifies that all triggers in the table are enabled or disabled.

trigger_nametrigger_name
Gibt den Namen des Triggers an, der deaktiviert oder aktiviert werden soll.Specifies the name of the trigger to disable or enable.

{ ENABLE | DISABLE } CHANGE_TRACKING{ ENABLE | DISABLE } CHANGE_TRACKING
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt an, ob die Änderungsnachverfolgung für die Tabelle deaktiviert bzw. aktiviert wurde.Specifies whether change tracking is enabled disabled for the table. Standardmäßig ist die Änderungsnachverfolgung deaktiviert.By default, change tracking is disabled.

Diese Option ist nur dann verfügbar, wenn die Änderungsnachverfolgung für die Datenbank aktiviert ist.This option is available only when change tracking is enabled for the database. Weitere Informationen finden Sie unter ALTER DATABASE SET-Optionen.For more information, see ALTER DATABASE SET Options.

Um die Änderungsnachverfolgung zu aktivieren, muss die Tabelle über einen Primärschlüssel verfügen.To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt an, ob die Datenbank-EngineDatabase Engine verfolgt, welche Spalten mit Änderungsnachverfolgung aktualisiert wurden.Specifies whether the Datenbank-EngineDatabase Engine tracks, which change tracked columns were updated. Der Standardwert ist OFF.The default value is OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name .SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Verlagert einen Datenblock auf eine der folgenden Arten:Switches a block of data in one of the following ways:

  • Weist alle Daten einer Tabelle als Partition einer bereits vorhandenen partitionierten Tabelle neu zu.Reassigns all data of a table as a partition to an already-existing partitioned table.
  • Wechselt eine Partition von einer partitionierten Tabelle zu einer anderen.Switches a partition from one partitioned table to another.
  • Weist alle Daten aus einer Partition einer partitionierten Tabelle einer bereits vorhandenen nicht partitionierten Tabelle neu zu.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Wenn table eine partitionierte Tabelle ist, muss source_partition_number_expression angegeben werden.If table is a partitioned table, you must specify source_partition_number_expression. Wenn target_table partitioniert ist, muss target_partition_number_expression angegeben werden.If target_table is partitioned, you must specify target_partition_number_expression. Wenn die Daten einer Tabelle als Partition einer vorhandenen partitionierten Tabelle neu zugewiesen werden oder eine Partition von einer partitionierten Tabelle zu einer anderen gewechselt wird, muss die Zielpartition vorhanden und leer sein.When reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

Wenn die Daten einer Partition neu zugewiesen werden, sodass sie eine einzelne Tabelle bilden, muss die Zieltabelle bereits vorhanden und leer sein.When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. Die Quelltabelle oder -partition und die Zieltabelle oder -partition müssen sich in derselben Dateigruppe befinden.Both the source table or partition, and the target table or partition, must be located in the same filegroup. Die entsprechenden Indizes oder Indexpartitionen müssen sich ebenfalls in derselben Dateigruppe befinden.The corresponding indexes, or index partitions, must also be located in the same filegroup. Darüber hinaus gelten weitere Einschränkungen für das Wechseln von Partitionen.Many additional restrictions apply to switching partitions. table und target_table dürfen nicht gleich sein.table and target_table can't be the same. target_table kann ein mehrteiliger Bezeichner sein.target_table can be a multi-part identifier.

source_partition_number_expression und target_partition_number_expression sind konstante Ausdrücke, die auf Variablen und Funktionen verweisen können.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. Diese enthalten benutzerdefinierte Typvariablen und benutzerdefinierte Funktionen.These include user-defined type variables and user-defined functions. Sie können nicht auf Transact-SQLTransact-SQL-Ausdrücke verweisen.They can't reference Transact-SQLTransact-SQL expressions.

Eine partitionierte Tabelle mit einem gruppierten Columnstore-Index verhält sich wie ein partitionierter Heap:A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • Der Primärschlüssel muss den Partitionsschlüssel beinhalten.The primary key must include the partition key.
  • Der eindeutige Index muss den Partitionsschlüssel beinhalten.A unique index must include the partition key. Durch das Einbeziehen des Partitionsschlüssels in einen eindeutigen Bezeichner kann sich jedoch die Eindeutigkeit verändern.But, including the partition key with an existing unique index can change the uniqueness.
  • Alle nicht gruppierten Indizes müssen den Partitionsschlüssel enthalten, damit Partitionen gewechselt werden können.To switch partitions, all nonclustered indexes must include the partition key.

Informationen zu SWITCH-Einschränkungen beim Verwenden von Replikaten finden Sie unter Replizieren partitionierter Tabellen und Indizes.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

Nicht gruppierte Columnstore-Indizes für SQL ServerSQL Server 2016 CTP1 und für Versionen von SQL-Datenbank vor V12 waren schreibgeschützt.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. Nicht gruppierte Columnstore-Indizes müssen im aktuellen Format erneut erstellt werden (das aktualisiert werden kann), bevor PARTITION-Vorgänge ausgeführt werden können.You must rebuild Nonclustered columnstore indexes to the current format (which is updatable) before any PARTITION operations can be run.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " } )SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server). FILESTREAM wird von Azure SQL-DatenbankAzure SQL Database nicht unterstützt.Azure SQL-DatenbankAzure SQL Databasedoesn't support FILESTREAM.

Gibt an, wo FILESTREAM-Daten gespeichert werden.Specifies where FILESTREAM data is stored.

ALTER TABLE mit der SET FILESTREAM_ON-Klausel ist nur erfolgreich, wenn die Tabelle keine FILESTREAM-Spalten enthält.ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. Die FILESTREAM-Spalten können mit einer zweiten ALTER TABLE-Anweisung hinzugefügt werden.You can add FILESTREAM columns by using a second ALTER TABLE statement.

Wenn partition_scheme_name angegeben wurde, gelten die Regeln für CREATE TABLE.If you specify partition_scheme_name, the rules for CREATE TABLE apply. Stellen Sie sicher, dass die Tabelle bereits für Zeilendaten partitioniert ist und dass das Partitionsschema die gleiche Partitionsfunktion und die gleichen Partitionsspalten wie das FILESTREAM-Partitionsschema verwendet.Be sure the table is already partitioned for row data, and its partition scheme uses the same partition function and columns as the FILESTREAM partition scheme.

filestream_filegroup_name gibt den Namen einer FILESTREAM-Dateigruppe an.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. Für die Dateigruppe muss eine Datei mit einer CREATE DATABASE-Anweisung oder einer ALTER DATABASE-Anweisung definiert worden sein. Andernfalls tritt ein Fehler auf.The filegroup must have one file that's defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error results.

" default " gibt die FILESTREAM-Dateigruppe mit dem DEFAULT-Eigenschaftensatz an." default " specifies the FILESTREAM filegroup with the DEFAULT property set. Wenn keine FILESTREAM-Dateigruppe vorhanden ist, tritt ein Fehler auf.If there's no FILESTREAM filegroup, an error results.

" NULL " gibt an, dass alle Verweise auf FILESTREAM-Dateigruppen für die Tabelle entfernt werden." NULL " specifies that all references to FILESTREAM filegroups for the table are removed. Alle FILESTREAM-Spalten müssen zuerst gelöscht werden.All FILESTREAM columns must be dropped first. Verwenden Sie SET FILESTREAM_ON =" NULL " , um alle mit einer Tabelle verknüpften FILESTREAM-Daten zu löschen.Use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that's associated with a table.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name .SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]) ] } )
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Deaktiviert oder aktiviert die Systemversionsverwaltung einer Tabelle.Either disables or enables system versioning of a table. Das System überprüft, ob die Einschränkungsanfoderungen des Datentyps, der NULL-Zulässigkeit und des Primärschlüssels für die Systemversionierung eingehalten wurden, um die Systemversionierung einer Tabelle zu ermöglichen.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. Wenn das Argument HISTORY_TABLE nicht verwendet wird, generiert das System eine neue Verlaufstabelle, die dem Schema der aktuellen Tabelle entspricht, erstellt eine Verknüpfung zwischen den beiden Tabellen und ermöglicht dem System, den Verlauf von jedem Datensatz der aktuellen Tabelle in der Verlaufstabelle aufzuzeichnen.If you don't use the HISTORY_TABLE argument, the system generates a new history table matching the schema of the current table, creates a link between the two tables, and enables the system to record the history of each record in the current table in the history table. Der Name dieser Verlaufstabelle ist dann MSSQL_TemporalHistoryFor<primary_table_object_id>.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. Wenn Sie das Argument HISTORY_TABLE verwenden, um eine Verknüpfung mit einer vorhandenen Verlaufstabelle zu erstellen und diese zu verwenden, erstellt das System eine Verknüpfung zwischen der aktuellen Tabelle und der angegebenen Tabelle.If you use the HISTORY_TABLE argument to create a link to and use an existing history table, the system creates a link between the current table and the specified table. Wenn Sie eine Verknüpfung mit einer vorhandenen Verlaufstabelle erstellen, können Sie eine Datenkonsistenzprüfung durchführen.When creating a link to an existing history table, you can choose to do a data consistency check. Diese Datenkonsistenzprüfung stellt sicher, dass vorhandene Datensätze nicht überlappen.This data consistency check ensures that existing records don't overlap. Die Datenkonsistenzprüfung ist standardmäßig aktiviert.Running the data consistency check is the default. Weitere Informationen finden Sie unter Temporal Tables.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }
Gilt für: SQL Server 2017 (14.x)SQL Server 2017 (14.x) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Azure SQL-DatenbankAzure SQL Database.

Gibt die endliche oder unendliche Aufbewahrungsdauer für Verlaufsdaten in temporalen Tabellen an.Specifies finite or infinite retention for historical data in a temporal table. Wenn sie weggelassen wird, wird von einer unendlichen Vermerkdauer ausgegangen.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt die zulässigen Methoden der Sperrenausweitung für eine Tabelle an.Specifies the allowed methods of lock escalation for a table.

AUTOAUTO
Mit dieser Option kann die SQL Server-Datenbank-EngineSQL Server Database Engine die für das Tabellenschema geeignete Granularität der Sperrenausweitung auswählen.This option allows SQL Server-Datenbank-EngineSQL Server Database Engine to select the lock escalation granularity that's appropriate for the table schema.

  • Wenn die Tabelle partitioniert ist, ist die Sperrenausweitung bis zur Heap- oder B-Struktur (HoBT)-Granularität zulässig.If the table is partitioned, lock escalation will be allowed to the heap or B-tree (HoBT) granularity. Dies bedeutet, dass eine Ausweitung auf Partitionsebene zulässig ist.In other words, escalation will be allowed to the partition level. Nach der Ausweitung der Sperre auf die HoBT-Ebene wird die Sperrenausweitung nicht bis zur TABLE-Granularität fortgeführt.After the lock is escalated to the HoBT level, the lock will not be escalated later to TABLE granularity.
  • Wenn die Tabelle nicht partitioniert ist, wird die Sperre bis zur TABLE-Granularität ausgeweitet.If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLETABLE
Die Sperrenausweitung wird immer mit der Granularität der Tabellenebene ausgeführt, unabhängig davon, ob die Tabelle partitioniert ist.Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. TABLE ist der Standardwert.TABLE is the default value.

DISABLEDISABLE
Verhindert die Sperrenausweitung in den meisten Fällen.Prevents lock escalation in most cases. Sperren auf Tabellenebene sind jedoch nicht völlig ausgeschlossen.Table-level locks aren't completely disallowed. Wenn Sie z.B. eine Tabelle scannen, die keinen gruppierten Index unter der Serializable-Isolationsstufe aufweist, muss die Datenbank-EngineDatabase Engine eine Tabellensperre zulassen, damit die Datenintegrität gewahrt wird.For example, when you're scanning a table that has no clustered index under the serializable isolation level, Datenbank-EngineDatabase Engine must take a table lock to protect data integrity.

REBUILDREBUILD
Verwenden Sie die REBUILD WITH-Syntax, um eine gesamte Tabelle neu zu erstellen, einschließlich aller Partitionen in einer partitionierten Tabelle.Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. Wenn die Tabelle einen gruppierten Index besitzt, erstellt die REBUILD-Option den gruppierten Index neu.If the table has a clustered index, the REBUILD option rebuilds the clustered index. REBUILD kann als ONLINE-Vorgang ausgeführt werden.REBUILD can be run as an ONLINE operation.

Verwenden Sie die REBUILD PARTITION-Syntax, um eine einzelne Partition in einer partitionierten Tabelle neu zu erstellen.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Erstellt alle Partitionen neu, wenn die Komprimierungseinstellungen für die Partition geändert werden.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> )REBUILD WITH ( <rebuild_option> )
Alle Optionen gelten für eine Tabelle mit einem gruppierten Index.All options apply to a table with a clustered index. Wenn die Tabelle nicht über einen gruppierten Index verfügt, wird die Heapstruktur nur von einigen der Optionen beeinflusst.If the table doesn't have a clustered index, the heap structure is only affected by some of the options.

Wenn mit dem REBUILD-Vorgang keine bestimmte Komprimierungseinstellung angegeben wird, wird die aktuelle Komprimierungseinstellung für die Partition verwendet.When a specific compression setting isn't specified with the REBUILD operation, the current compression setting for the partition is used. Um die aktuelle Einstellung zurückzugeben, fragen Sie die data_compression-Spalte in der sys.partitions-Katalogsicht ab.To return the current setting, query the data_compression column in the sys.partitions catalog view.

Die vollständigen Beschreibungen dieser Optionen zum Neuerstellen finden Sie unter index_option.For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSIONDATA_COMPRESSION
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gibt die Datenkomprimierungsoption für die angegebene Tabelle, die Partitionsnummer oder den Bereich von Partitionen an.Specifies the data compression option for the specified table, partition number, or range of partitions. Folgende Optionen stehen zur Verfügung:The options are as follows:

NONE Die Tabelle oder die angegebenen Partitionen werden nicht komprimiert.NONE Table or specified partitions aren't compressed. Diese Option gilt nicht für Columnstore-Tabellen.This option doesn't apply to columnstore tables.

ROW Die Tabelle oder die angegebenen Partitionen werden mit Zeilenkomprimierung komprimiert.ROW Table or specified partitions are compressed by using row compression. Diese Option gilt nicht für Columnstore-Tabellen.This option doesn't apply to columnstore tables.

PAGE Die Tabelle oder die angegebenen Partitionen werden mit Seitenkomprimierung komprimiert.PAGE Table or specified partitions are compressed by using page compression. Diese Option gilt nicht für Columnstore-Tabellen.This option doesn't apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
Gilt für: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gilt nur für columnstore-Tabellen.Applies only to columnstore tables. COLUMNSTORE gibt an, dass eine Partition, die mit der COLUMNSTORE_ARCHIVE-Option komprimiert wurde, dekomprimiert werden soll.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. Nachdem die Daten wiederhergestellt wurden, sind sie weiterhin mit der Columnstore-Komprimierung komprimiert, die für alle Columnstore-Tabellen verwendet wird.When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
Gilt für: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Gilt nur für columnstore-Tabellen. Dies sind Tabellen, die mit einem gruppierten columnstore-Index gespeichert wurden.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. Durch COLUMNSTORE_ARCHIVE wird die angegebene Partition weiter in eine geringere Größe komprimiert.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Verwenden Sie diese Option bei der Archivierung und in anderen Situationen, in denen es auf eine geringere Speicherbelegung und nicht auf den zusätzlichen Zeitaufwand für das Speichern und Abrufen ankommt.Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

Informationen zur gleichzeitigen Neuerstellung mehrerer Partitionen finden Sie unter index_option.To rebuild multiple partitions at the same time, see index_option. Wenn die Tabelle nicht über einen gruppierten Index verfügt, werden bei Änderungen an der Datenkomprimierung der Heap und die nicht gruppierten Indizes neu erstellt.If the table doesn't have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. Weitere Informationen zur Datenkomprimierung finden Sie unter Datenkomprimierung.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <wie bei single_partition_rebuild_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
Gibt an, ob eine einzelne Partition der zugrunde liegenden Tabellen und der zugeordneten Indizes für Abfragen und Datenänderungen während des Indexvorgangs verfügbar ist.Specifies whether a single partition of the underlying tables and associated indexes is available for queries and data modification during the index operation. Der Standardwert ist OFF.The default is OFF. Sie können REBUILD als ONLINE-Vorgang ausführen.You can run REBUILD as an ONLINE operation.

ONON
Lang andauernde Tabellensperren werden nicht für die Dauer des Indexvorgangs aufrechterhalten.Long-term table locks aren't held for the duration of the index operation. Erfordert eine S-Sperre für die Tabelle am Anfang der Indexneuerstellung und eine Sch-M-Sperre für die Tabelle am Ende der Onlineneuerstellung des Indexes.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. Obwohl beide Sperren kurze Metadatensperren sind, muss die Sch-M-Sperre auf den Abschluss aller blockierenden Transaktionen warten.Although both locks are short metadata locks, the Sch-M lock must wait for all blocking transactions to be completed. Während der Wartezeit sperrt die Sch-M-Sperre alle anderen Transaktionen, die an dieser Sperre warten, wenn sie auf die gleiche Tabelle zugreifen.During the wait time,, the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Hinweis

Durch Neuerstellung von Onlineindizes können die low_priority_lock_wait-Optionen festgelegt werden, die weiter unten in diesem Abschnitt beschrieben werden.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
Die Tabellensperren werden für die Dauer des Indexvorgangs angewendet.Table locks are applied for the duration of the index operation. Dadurch wird verhindert, dass Benutzer für die Dauer des Vorgangs auf die zugrunde liegende Tabelle zugreifen können.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNScolumn_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Gilt für: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Der Name des Spaltensatzes.The name of the column set. Bei einem Spaltensatz handelt es sich um eine nicht typisierte XML-Darstellung, die alle Sparsespalten einer Tabelle in einer strukturierten Ausgabe kombiniert.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. Sie können einer Tabelle, die Sparsespalten enthält, keinen Spaltensatz hinzufügen.A column set can't be added to a table that contains sparse columns. Weitere Informationen zu Spaltensätzen finden Sie unter Verwenden von Spaltensätzen.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE{ ENABLE | DISABLE } FILETABLE_NAMESPACE
Gilt für: SQL ServerSQL Server (SQL Server 2012 (11.x)SQL Server 2012 (11.x) bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL ServerSQL Server).

Aktiviert oder deaktiviert die systemdefinierten Einschränkungen für eine FileTable.Enables or disables the system-defined constraints on a FileTable. Kann nur mit einer FileTable verwendet werden.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )SET ( FILETABLE_DIRECTORY = directory_name )
Gilt für: SQL ServerSQL Server (SQL Server 2012 (11.x)SQL Server 2012 (11.x) bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL ServerSQL Server. FILETABLE wird von Azure SQL-DatenbankAzure SQL Database nicht unterstützt.Azure SQL-DatenbankAzure SQL Database doesn't support FILETABLE.

Gibt den Windows-kompatiblen FileTable-Verzeichnisnamen an.Specifies the Windows-compatible FileTable directory name. Dieser Name sollte für alle FileTable-Verzeichnisnamen in der Datenbank eindeutig sein.This name should be unique among all the FileTable directory names in the database. Bei Eindeutigkeitsvergleichen wird die Groß-/Kleinschreibung unabhängig von den SQL-Sortiereinstellungen nicht beachtet.Uniqueness comparison is case-insensitive, despite the SQL collation settings. Kann nur mit einer FileTable verwendet werden.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] )
        } )

Gilt für: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL ServerSQL Server).

Aktiviert bzw. deaktiviert Stretch Database für die Datenbank.Enables or disables Stretch Database for a table. Weitere Informationen finden Sie unter Stretch Database.For more information, see Stretch Database.

Aktivieren von Stretch Database für eine TabelleEnabling Stretch Database for a table

Wenn Sie durch Angeben von ON Stretch für eine Tabelle aktivieren, können Sie optional MIGRATION_STATE = OUTBOUND festlegen, um sofort mit dem Migrieren von Daten zu beginnen, oder Sie können MIGRATION_STATE = PAUSED festlegen, um die Datenmigration zu verzögern.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. Der Standardwert lautet MIGRATION_STATE = OUTBOUND.The default value is MIGRATION_STATE = OUTBOUND. Weitere Informationen über das Aktivieren von Stretch für eine Tabelle finden Sie unter Aktivieren von Stretch Database für eine Tabelle.For more information about enabling Stretch for a table, see Enable Stretch Database for a table.

Voraussetzungen.Prerequisites. Sie müssen Stretch auf dem Server und auf der Datenbank aktivieren, bevor Sie Stretch für eine Tabelle aktivieren können.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. Weitere Informationen finden Sie unter Aktivieren von Stretch Database für eine Datenbank.For more information, see Enable Stretch Database for a database.

Berechtigungen.Permissions. Zum Aktivieren von Stretch für eine Datenbank oder eine Tabelle benötigen Sie die „db_owner“-Berechtigungen.Enabling Stretch for a database or a table requires db_owner permissions. Zum Aktivieren von Stretch für eine Tabelle benötigen Sie auch die ALTER-Berechtigungen für die Tabelle.Enabling Stretch for a table also requires ALTER permissions on the table.

Deaktivieren von Stretch Database für eine TabelleDisabling Stretch Database for a table

Wenn Sie Stretch für eine Tabelle deaktivieren, haben Sie zwei Möglichkeiten für die Remotedaten, die bereits zu Azure migriert wurden.When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. Weitere Informationen finden Sie unter Deaktivieren von Stretch Database und Zurückholen von Remotedaten.For more information, see Disable Stretch Database and bring back remote data.

  • Führen Sie den folgenden Befehl aus, um Stretch für eine Tabelle zu deaktivieren und die Remotedaten einer Tabelle aus Azure zurück zu SQL Server zu kopieren.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. Dieser Befehl kann nicht abgebrochen werden.This command can't be canceled.

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

Dieser Vorgang verursacht Datenübertragungskosten und kann nicht abgebrochen werden.This operation incurs data transfer costs, and it can't be canceled. Weitere Informationen finden Sie unter Datenübertragungen – Preisdetails.For more information, see Data Transfers Pricing Details.

Nachdem die Remotedaten von Azure zurück zu SQL Server kopiert wurden, wird Stretch für die Tabelle deaktiviert.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • Führen Sie den folgenden Befehl aus, um Stretch für eine Tabelle zu deaktivieren und die Remotedaten zu verwerfen.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 ) ) ;
    

Nachdem Sie Stretch Database für eine Tabelle deaktiviert haben, wird die Datenmigration beendet und die Abfrageergebnisse enthalten keine Ergebnisse aus der Remotetabelle mehr.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

Auch wenn Stretch deaktiviert wird, wird die Remotetabelle nicht entfernt.Disabling Stretch doesn't remove the remote table. Wenn Sie die Remotetabelle löschen möchten, muss dieser Vorgang über das Azure-Portal erfolgen.If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
Gilt für: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL ServerSQL Server).

Gibt optional ein Filterprädikat zum Auswählen der Zeilen an, die aus einer Tabelle migriert werden sollen, die sowohl Verlaufsdaten als auch aktuelle Daten enthält.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. Das Prädikat muss eine deterministische Inline-Tabellenwertfunktion aufrufen.The predicate must call a deterministic inline table-valued function. Weitere Informationen finden Sie unter Aktivieren von Stretch Database für eine Tabelle und Auswählen zu migrierender Zeilen mithilfe einer Filterfunktion – Stretch Database.For more information, see Enable Stretch Database for a table and Select rows to migrate by using a filter function - Stretch Database.

Wichtig

Wenn Sie ein schwaches Filterprädikat angeben, wird die Datenmigration ebenfalls unzureichend ausgeführt.If you provide a filter predicate that performs poorly, data migration also performs poorly. Stretch-Datenbank wendet das Filterprädikat über den CROSS APPLY-Operator auf die Tabelle an.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

Wenn Sie kein Filterprädikat angeben, wird die gesamte Tabelle migriert.If you don't specify a filter predicate, the entire table is migrated.

Wenn Sie ein Filterprädikat angeben, müssen Sie auch MIGRATION_STATE angeben.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
Gilt für: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) bis SQL ServerSQL Server).Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL ServerSQL Server).

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
Gilt für: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Bei der Onlineindexneuerstellung muss auf blockierende Vorgänge für diese Tabelle gewartet werden.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY gibt an, dass der Onlineneuerstellungsvorgang für den Index auf Sperren mit niedriger Priorität wartet und die weitere Ausführung anderer Vorgänge ermöglicht, während der Onlineerstellungsvorgang für den Index wartet.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation waits for low-priority locks, allowing other operations to carry on while the online index build operation is waiting. Die Option WAIT AT LOW PRIORITY auszulassen, entspricht WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is the same as WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES ]MAX_DURATION = time [MINUTES ]
Gilt für: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Die Wartezeit (ein ganzzahliger Wert in Minuten), für die SWITCH oder die Sperren der Onlineindexneuerstellung mit niedriger Priorität warten, wenn der DDL-Befehl ausgeführt wird.The wait time, which is an integer value specified in minutes, that the SWITCH or online index rebuild locks wait with low priority when running the DDL command. Wenn der Vorgang während des MAX_DURATION-Zeitraums blockiert wird, wird eine der ABORT_AFTER_WAIT-Aktionen ausgeführt.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will run. MAX_DURATION wird immer in Minuten angegeben, und das Wort MINUTES kann ausgelassen werden.MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
Gilt für: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

KeineNONE
Es wird weiterhin mit normaler (regulärer) Priorität auf die Sperre gewartet.Continue waiting for the lock with normal (regular) priority.

SELFSELF
SWITCH oder der aktuell ausgeführte DDL-Vorgang zur Neuerstellung des Onlineindexes wird beendet, ohne Aktionen durchzuführen.Exit the SWITCH or online index rebuild DDL operation currently being run without taking any action.

BLOCKERSBLOCKERS
Alle Benutzertransaktionen, die derzeit SWITCH oder den DDL-Vorgang zur Neuerstellung des Onlineindexes blockieren, werden beendet, sodass der Vorgang fortgesetzt werden kann.Kill all user transactions that currently block the SWITCH or online index rebuild DDL operation so that the operation can continue.

Erfordert die ALTER ANY CONNECTION-Berechtigung.Requires ALTER ANY CONNECTION permission.

IF EXISTSIF EXISTS
Gilt für: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server) und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server) and Azure SQL-DatenbankAzure SQL Database.

Löscht die Spalte oder Einschränkung nur, wenn diese bereits vorhanden ist.Conditionally drops the column or constraint only if it already exists.

RemarksRemarks

Verwenden Sie INSERT, um neue Datenzeilen hinzuzufügen.To add new rows of data, use INSERT. Verwenden Sie DELETE oder TRUNCATE TABLE, um Datenzeilen zu entfernen.To remove rows of data, use DELETE or TRUNCATE TABLE. Verwenden Sie UPDATE, um die Werte in vorhandenen Zeilen zu ändern.To change the values in existing rows, use UPDATE.

Wenn der Prozedurcache Ausführungspläne enthält, die auf die Tabelle verweisen, kennzeichnet ALTER TABLE diese für die erneute Kompilierung bei der nächsten Ausführung.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.

Ändern der Größe einer SpalteChanging the Size of a Column

Sie können Länge, Genauigkeit oder Dezimalstellen einer Spalte ändern, indem Sie die neue Größe für den Spaltendatentyp angeben.You can change the length, precision, or scale of a column by specifying a new size for the column data type. Verwenden Sie die ALTER COLUMN-Klausel.Use the ALTER COLUMN clause. Wenn die Spalte Daten enthält, darf die neue Größe nicht unter der maximalen Datenmenge liegen.If data exists in the column, the new size can't be smaller than the maximum size of the data. Außerdem kann die Spalte nicht in einem Index definiert werden, es sei denn, die Spalte ist vom Datentyp varchar, nvarchar oder varbinary und der Index ist nicht das Ergebnis einer PRIMARY KEY-Einschränkung.Also, you can't define the column in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index isn't the result of a PRIMARY KEY constraint. Sehen Sie sich hierzu das Beispiel in dem kurzen Abschnitt mit dem Titel Ändern einer Spaltendefinition an.See the example in the short section titled Altering a Column Definition.

Sperren und ALTER TABLELocks and ALTER TABLE

Änderungen, die Sie in ALTER TABLE angeben, werden sofort implementiert.Changes you specify in ALTER TABLE implement immediately. Wenn die Änderungen Änderungen der Zeilen in der Tabelle erfordern, aktualisiert ALTER TABLE die Zeilen.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. ALTER TABLE belegt die Tabelle mit einer Schemaänderungssperre (SCH-M), um sicherzustellen, dass andere Verbindungen während der Änderung noch nicht einmal auf die Metadaten der Tabelle verweisen können. Eine Ausnahme sind Onlineindexvorgänge, die am Ende eine kurze SCH-M-Sperre erfordern.ALTER TABLE acquires a schema modify (SCH-M) lock on the table to make sure that no other connections reference even the metadata for the table during the change, except online index operations that require a short SCH-M lock at the end. Bei einem ALTER TABLE...SWITCH-Vorgang werden sowohl die Quell- als auch die Zieltabelle mit der Sperre belegt.In an ALTER TABLE...SWITCH operation, the lock is acquired on both the source and target tables. Die an der Tabelle vorgenommenen Änderungen werden protokolliert und sind vollständig wiederherstellbar.The modifications made to the table are logged and fully recoverable. Änderungen, die sich auf sämtliche Zeilen einer großen Tabelle auswirken (z.B. das Löschen einer Spalte oder in einigen Editionen von SQL ServerSQL Server das Hinzufügen einer NOT NULL-Spalte mit einem Standardwert) kann viel Zeit in Anspruch nehmen und dazu führen, dass viele Protokolldatensätze generiert werden.Changes that affect all the rows in large tables, such as dropping a column or, on some editions of SQL ServerSQL Server, adding a NOT NULL column with a default value, can take a long time to complete and generate many log records. Diese ALTER TABLE-Anweisungen sollten ebenso vorsichtig ausgeführt werden wie jede INSERT-, UPDATE- oder DELETE-Anweisung, die sich auf viele Zeilen auswirkt.Run these ALTER TABLE statements with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

Hinzufügen von NOT NULL-Spalten als OnlinevorgangAdding NOT NULL Columns as an Online Operation

Ab SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition ist das Hinzufügen einer NOT NULL-Spalte mit einem Standardwert ein Onlinevorgang, wenn der Standardwert eine Laufzeitkonstante darstellt.Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x) Enterprise Edition, adding a NOT NULL column with a default value is an online operation when the default value is a runtime constant. Dies bedeutet, dass der Vorgang trotz der Anzahl von Zeilen in der Tabelle nahezu sofort abgeschlossen wird.This means that the operation is completed almost instantaneously despite the number of rows in the table. Dies liegt daran, dass die vorhandenen Zeilen in der Tabelle während des Vorgangs nicht aktualisiert werden.Because, the existing rows in the table aren't updated during the operation. Stattdessen wird der Standardwert nur in den Metadaten der Tabelle gespeichert und der Wert in Abfragen, die auf diese Zeilen zugreifen, nur nach Bedarf gesucht.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. Dieses Verhalten erfolgt automatisch.This behavior is automatic. Es ist keine zusätzliche Syntax erforderlich, um den Onlinevorgang außerhalb der ADD COLUMN-Syntax zu implementieren.No additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. Eine Laufzeitkonstante ist ein Ausdruck, der zur Laufzeit trotz Determinismus den gleichen Wert für jede Zeile in der Tabelle erzeugt.A runtime constant is an expression that produces the same value at runtime for each row in the table despite its determinism. Der konstante Ausdruck "My temporary data" oder die GETUTCDATETIME()-Systemfunktion sind z. B. Laufzeitkonstanten.For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. Im Gegensatz dazu sind die Funktionen NEWID() oder NEWSEQUENTIALID() keine Laufzeitkonstanten, da für jede Zeile in der Tabelle ein eindeutiger Wert erzeugt wird.In contrast, the functions NEWID() or NEWSEQUENTIALID() aren't runtime constants, because a unique value is produced for each row in the table. Das Hinzufügen einer NOT NULL-Spalte mit einem Standardwert, der keine Laufzeitkonstante ist, wird immer offline ausgeführt, und dabei wird eine exklusive SCH-M-Sperre für die Dauer des Vorgangs aktiviert.Adding a NOT NULL column with a default value that's not a runtime constant is always run offline and an exclusive (SCH-M) lock is acquired for the duration of the operation.

Während die vorhandenen Zeilen auf den in Metadaten gespeicherten Wert verweisen, wird der Standardwert für alle neu eingefügten Zeilen in der Zeile gespeichert, ohne einen anderen Wert für die Spalte anzugeben.While the existing rows reference the value stored in metadata, the default value is stored on the row for any new rows that are inserted and don't specify another value for the column. Der in Metadaten gespeicherte Standardwert wird in eine vorhandene Zeile verschoben, wenn die Zeile aktualisiert wird (auch wenn die tatsächliche Spalte nicht in der UPDATE-Anweisung angegeben wird) oder wenn die Tabelle oder der gruppierte Index neu erstellt wird.The default value stored in metadata moves to an existing row when the row is updated (even if the actual column isn't specified in the UPDATE statement), or if the table or clustered index is rebuilt.

Spalten vom Typ varchar(max) , nvarchar(max) , varbinary(max) , xml, text, ntext, image, hierarchyid, geometry, geography oder CLR UDTS können nicht in einem Onlinevorgang hinzugefügt werden.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, can't be added in an online operation. Eine Spalte kann nicht online hinzugefügt werden, wenn dies dazu führt, dass die maximal mögliche Zeilengröße den Grenzwert von 8.060 Byte überschreitet.A column can't be added online if doing so causes the maximum possible row size to exceed the 8,060-byte limit. Die Spalte wird in diesem Fall als Offlinevorgang hinzugefügt.The column is added as an offline operation in this case.

Ausführung paralleler PläneParallel Plan Execution

In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise und höher wird die Anzahl von Prozessoren, die zur Ausführung einer einzelnen ALTER TABLE ADD CONSTRAINT-Anweisung (indexbasiert) oder einer ALTER TABLE DROP CONSTRAINT-Anweisung (gruppierter Index) verwendet werden, durch die Konfigurationsoption Max. Grad an Parallelität und durch die aktuelle Arbeitsauslastung bestimmt.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. Wenn das Datenbank-EngineDatabase Engine erkennt, dass das System ausgelastet ist, wird der Grad an Parallelität für den Vorgang automatisch reduziert, bevor mit der Ausführung der Anweisung begonnen wird.If the Datenbank-EngineDatabase Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. Sie können die Anzahl der Prozessoren, die zur Ausführung der Anweisung verwendet werden, durch Angeben der MAXDOP-Option manuell konfigurieren.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität.For more information, see Configure the max degree of parallelism Server Configuration Option.

Partitionierte TabellenPartitioned Tables

Neben dem Ausführen von SWITCH-Vorgängen mit partitionierten Tabellen können mit ALTER TABLE der Status der Spalten, Einschränkungen und Trigger einer partitionierten Tabelle genau wie bei nicht partitionierten Tabellen geändert werden.In addition to performing SWITCH operations that involve partitioned tables, use ALTER TABLE to change the state of the columns, constraints, and triggers of a partitioned table just like it's used for nonpartitioned tables. Die Partitionierung der Tabelle selbst kann jedoch mit der Anweisung nicht geändert werden.However, this statement can't be used to change the way the table itself is partitioned. Verwenden Sie zum Neupartitionieren einer partitionierten Tabelle ALTER PARTITION SCHEME und ALTER PARTITION FUNCTION.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. Zudem können Sie den Datentyp einer Spalte in einer partitionierten Tabelle nicht ändern.Additionally, you can't change the data type of a column of a partitioned table.

Einschränkungen für Tabellen mit schemagebundenen SichtenRestrictions on Tables with Schema-Bound Views

Die Einschränkungen, die für ALTER TABLE-Anweisungen für Tabellen mit schemagebundenen Sichten gelten, sind dieselben, die derzeit beim Ändern von Tabellen mit einem einfachen Index angewendet werden.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. Das Hinzufügen einer Spalte ist zulässig.Adding a column is allowed. Das Entfernen oder Ändern einer Spalte, die Bestandteil einer schemagebundenen Sicht ist, ist dagegen nicht zulässig.However, removing or changing a column that participates in any schema-bound view isn't allowed. Wenn für die ALTER TABLE-Anweisung das Ändern einer in einer schemagebundenen Sicht verwendeten Spalte erforderlich ist, schlägt ALTER TABLE fehl, und das Datenbank-EngineDatabase Engine löst eine Fehlermeldung aus.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the Datenbank-EngineDatabase Engine raises an error message. Weitere Informationen zu Schemabindung und indizierten Sichten finden Sie unter CREATE VIEW.For more information about schema binding and indexed views, see CREATE VIEW.

Das Hinzufügen oder Entfernen von Triggern für Basistabellen wird durch das Erstellen einer schemagebundenen Sicht, die auf die Tabellen verweist, nicht beeinflusst.Adding or removing triggers on base tables isn't affected by creating a schema-bound view that references the tables.

Indizes und ALTER TABLEIndexes and ALTER TABLE

Als Teil einer Einschränkung erstellte Indizes werden gelöscht, wenn die Einschränkung gelöscht wird.Indexes created as part of a constraint are dropped when the constraint is dropped. Mit CREATE INDEX erstellte Indizes müssen mit DROP INDEX gelöscht werden.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. Verwenden Sie die ALTER INDEX-Anweisung, um einen Index neu zu erstellen, der Teil einer Einschränkungsdefinition ist. Die Einschränkung muss nicht gelöscht und mit ALTER TABLE erneut hinzugefügt werden.Use The ALTER INDEX statement to rebuild an index part of a constraint definition; the constraint doesn't have to be dropped and added again with ALTER TABLE.

Alle auf einer Spalte basierenden Indizes und Einschränkungen müssen entfernt werden, bevor die Spalte entfernt werden kann.All indexes and constraints based on a column must be removed before the column can be removed.

Wenn Sie eine Einschränkung löschen, für die ein gruppierter Index erstellt wurde, werden die Datenzeilen, die auf der Blattebene des gruppierten Indexes gespeichert waren, in einer nicht gruppierten Tabelle gespeichert.When you delete a constraint that created a clustered index, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. Sie können den gruppierten Index löschen und die daraus resultierende Tabelle in einer einzigen Transaktion in eine andere Dateigruppe oder in ein anderes Partitionsschema verschieben, indem Sie die MOVE TO-Option angeben.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. Die MOVE TO-Option weist die folgenden Einschränkungen auf:The MOVE TO option has the following restrictions:

  • MOVE TO ist für indizierte Sichten oder nicht gruppierte Indizes nicht gültig.MOVE TO isn't valid for indexed views or nonclustered indexes.
  • Das Partitionsschema oder die Dateigruppe muss bereits vorhanden sein.The partition scheme or filegroup must already exist.
  • Wird MOVE TO nicht angegeben, wird die Tabelle in demselben Partitionsschema oder derselben Dateigruppe platziert, das bzw. die für den gruppierten Index definiert war.If MOVE TO isn't specified, the table is located in the same partition scheme or filegroup as was defined for the clustered index.

Beim Löschen eines gruppierten Indexes können Sie die ONLINE = ON-Option angeben, sodass die DROP INDEX-Transaktion keine Abfragen und Änderungen der zugrunde liegenden Daten und zugeordneten nicht gruppierten Indizes blockiert.When you drop a clustered index, specify the ONLINE = ON option so the DROP INDEX transaction doesn't block queries and modifications to the underlying data and associated nonclustered indexes.

Für ONLINE = ON gelten folgende Einschränkungen:ONLINE = ON has the following restrictions:

  • ONLINE = ON ist nicht gültig für gruppierte Indizes, die auch deaktiviert sind.ONLINE = ON isn't valid for clustered indexes that are also disabled. Deaktivierte Indizes müssen mit ONLINE = OFF gelöscht werden.Disabled indexes must be dropped by using ONLINE = OFF.
  • Es können nicht mehrere Indizes gleichzeitig gelöscht werden.Only one index at a time can be dropped.
  • ONLINE = ON ist nicht gültig für indizierte Sichten, nicht gruppierte Indizes oder Indizes für lokale temporäre Tabellen.ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • ONLINE = ON ist für Columnstore-Indizes nicht gültig.ONLINE = ON isn't valid for columnstore indexes.

Zum Löschen eines gruppierten Indexes ist temporärer Speicherplatz im Umfang des vorhandenen gruppierten Indexes erforderlich.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. Dieser zusätzliche Speicherplatz wird nach Abschluss des Vorgangs freigegeben.This additional space is released as soon as the operation is completed.

Hinweis

Die unter <drop_clustered_constraint_option> aufgeführten Optionen gelten für gruppierte Indizes für Tabellen und können nicht auf gruppierte Indizes für Sichten oder nicht gruppierte Indizes angewendet werden.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and can't be applied to clustered indexes on views or nonclustered indexes.

Replizieren von SchemaänderungenReplicating Schema Changes

Wenn Sie ALTER TABLE für eine veröffentlichte Tabelle auf einem SQL ServerSQL Server-Verleger ausführen, wird diese Änderung standardmäßig an alle SQL ServerSQL Server-Abonnenten weitergegeben.When you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, by default, that change propagates to all SQL ServerSQL Server Subscribers. Für diese Funktionalität bestehen einige Einschränkungen.This functionality has some restrictions. Sie können sie deaktivieren.You can disable it. Weitere Informationen finden Sie unter Vornehmen von Schemaänderungen in Veröffentlichungsdatenbanken.For more information, see Make Schema Changes on Publication Databases.

DatenkomprimierungData Compression

Für Systemtabellen ist die Komprimierung nicht verfügbar.System tables can't be enabled for compression. Wenn die Tabelle ein Heap ist, erfolgt der Neuerstellungsvorgang für den ONLINE-Modus mit einem einzelnen Thread.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. Verwenden Sie den OFFLINE-Modus für einen Multithreaded-Neuerstellungsvorgang von Heaps.Use OFFLINE mode for a multi-threaded heap rebuild operation. Weitere Informationen zur Datenkomprimierung finden Sie unter Datenkomprimierung.For a more information about data compression, seeData Compression.

Mit der gespeicherten Prozedur sp_estimate_data_compression_savings können Sie einschätzen, wie sich eine Änderung des Komprimierungsstatus auf eine Tabelle, einen Index oder eine Partition auswirkt.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.

Für partitionierte Tabellen gelten die folgenden Einschränkungen:The following restrictions apply to partitioned tables:

  • Sie können die Komprimierungseinstellung einer einzelnen Partition nicht ändern, wenn die Tabelle nicht ausgerichtete Indizes aufweist.You can't change the compression setting of a single partition if the table has nonaligned indexes.
  • Mit der ALTER TABLE <table> REBUILD PARTITION...-Syntax wird die angegebene Partition neu erstellt.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • Mit der ALTER TABLE <table> REBUILD WITH...-Syntax werden alle Partitionen neu erstellt.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

Löschen von NTEXT-SpaltenDropping NTEXT Columns

Wenn NTEXT-Spalten gelöscht werden, wird das Cleanup der gelöschten Daten als serialisierter Vorgang für alle Zeilen durchgeführt.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. Die Bereinigung kann lange Zeit in Anspruch nehmen.The cleanup can require a large amount of time. Wenn Sie eine NTEXT-Spalte in einer Tabelle mit einer großen Zeilenanzahl löschen, aktualisieren Sie die NTEXT-Spalte zunächst auf den Wert NULL, und löschen Sie dann die Spalte.When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. Sie können diese Option mit parallelen Vorgängen und damit wesentlich schneller ausführen.You can run this option with parallel operations and make it much faster.

Onlineneuerstellung von IndizesOnline Index Rebuild

Um die DDL-Anweisung für eine Onlineindexneuerstellung auszuführen, müssen alle aktiven blockierenden Transaktionen, die für eine bestimmte Tabelle ausgeführt werden, abgeschlossen sein.To run the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Wenn die Onlineindexneuerstellung gestartet wird, werden alle neuen Transaktionen blockiert, die zur Ausführung in dieser Tabelle bereit sind.When the online index rebuild launches, it blocks all new transactions that are ready to start running on this table. Obwohl die Sperre für die Onlineindexneuerstellung nur kurz dauert, kann das Warten auf den Abschluss aller noch offenen Transaktionen und das Blockieren des Starts aller neuen Transaktionen für eine bestimmte Tabelle den Durchsatz beeinträchtigen.Although the duration of the lock for online index rebuild is short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput. Dies kann zur Verlangsamung oder Ausfall einer Arbeitsauslastung führen und den Zugriff auf die zugrunde liegende Tabelle deutlich einschränken.This can cause a workload slow-down or timeout and significantly limit access to the underlying table. Mit der WAIT_AT_LOW_PRIORITY-Option können Datenbankadministratoren die S-Sperre sowie Sch-M-Sperren, die für die Onlineneuerstellung von Indizes erforderlich sind, verwalten und eine von drei Optionen auswählen.The WAIT_AT_LOW_PRIORITY option allows DBAs to manage the S-lock and Sch-M locks required for online index rebuilds and lets them to select one of three options. In allen drei Fällen gilt: Sind während der Wartezeit ((MAX_DURATION =n [minutes])) keine blockierenden Aktivitäten vorhanden, wird die Onlineindexneuerstellung ohne Wartezeit sofort ausgeführt, und die DDL-Anweisung wird abgeschlossen.In all three cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is run immediately without waiting and the DDL statement is completed.

KompatibilitätsunterstützungCompatibility Support

Die ALTER TABLE-Anweisung unterstützt nur zweiteilige Tabellennamen (schema.object).The ALTER TABLE statement supports only two-part (schema.object) table names. In SQL ServerSQL Server schlägt die Angabe eines Tabellennamens mit den folgenden Formaten zur Kompilierzeit mit Fehler 117 fehl.In SQL ServerSQL Server, specifying a table name using the following formats fails at compile time with error 117.

  • server.database.schema.tableserver.database.schema.table
  • .database.schema.table.database.schema.table
  • ..schema.table..schema.table

Bei früheren Versionen wurde durch die Angabe des Formats „server.database.schema.table“ der Fehler 4902 zurückgegeben.In earlier versions, specifying the format server.database.schema.table returned error 4902. Die Angabe des Formats ".database.schema.table" oder "..schema.table" war erfolgreich.Specifying the format .database.schema.table or the format ..schema.table succeeded.

Um das Problem zu beheben, vermeiden Sie die Verwendung eines vierteiligen Präfixes.To resolve the problem, remove the use of a four-part prefix.

BerechtigungenPermissions

Erfordert die ALTER-Berechtigung für die Tabelle.Requires ALTER permission on the table.

ALTER TABLE-Berechtigungen gelten für beide an einer ALTER TABLE SWITCH-Anweisung beteiligten Tabellen.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. Alle verschobenen Daten erben die Sicherheitseinstellungen der Zieltabelle.Any data that's switched inherits the security of the target table.

Falls Sie Spalten in der ALTER TABLE-Anweisung mit einem benutzerdefinierten CLR-Typ (Common Language Runtime) oder Aliasdatentyp definieren, ist die REFERENCES-Berechtigung für den Typ erforderlich.If you've defined any columns in the ALTER TABLE statement to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

Für das Hinzufügen einer Spalte, durch die die Zeilen der Tabelle aktualisiert werden, ist die UPDATE-Berechtigung für die Tabelle erforderlich.Adding a column that updates the rows of the table requires UPDATE permission on the table. Dies gilt beispielsweise für das Hinzufügen einer NOT NULL-Spalte mit einem Standardwert oder für das Hinzufügen einer Identitätsspalte zu einer nicht leeren Tabelle.For example, adding a NOT NULL column with a default value or adding an identity column when the table isn't empty.

BeispieleExamples

KategorieCategory FunktionssyntaxelementeFeatured syntax elements
Hinzufügen von Spalten und EinschränkungenAdding columns and constraints ADD • PRIMARY KEY mit Indexoptionen • Sparsespalten und Spaltensätze •ADD • PRIMARY KEY with index options • sparse columns and column sets •
Löschen von Spalten und EinschränkungenDropping columns and constraints DROPDROP
Ändern einer SpaltendefinitionAltering a column definition Ändern des Datentyps • Ändern der Spaltengröße • Sortierungchange data type • change column size • collation
Ändern einer TabellendefinitionAltering a table definition DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • ÄnderungsnachverfolgungDATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
Deaktivieren und Aktivieren von Einschränkungen und TriggernDisabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER
   

Hinzufügen von Spalten und EinschränkungenAdding Columns and Constraints

Die Beispiele in diesem Abschnitt veranschaulichen das Hinzufügen von Spalten und Einschränkungen zu einer Tabelle.Examples in this section demonstrate adding columns and constraints to a table.

A.A. Hinzufügen einer neuen SpalteAdding a new column

Im folgenden Beispiel wird eine Spalte hinzugefügt, die NULL-Werte zulässt und für die keine Werte durch eine DEFAULT-Definition bereitgestellt werden.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. Jede Zeile in der neuen Spalte erhält einen NULL-Wert.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. Hinzufügen einer Spalte mit einer EinschränkungAdding a column with a constraint

Im folgenden Beispiel wird eine neue Spalte mit einer UNIQUE-Einschränkung hinzugefügt.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. Hinzufügen einer nicht überprüften CHECK-Einschränkung zu einer vorhandenen SpalteAdding an unverified CHECK constraint to an existing column

Im folgenden Beispiel wird einer vorhandenen Spalte in der Tabelle eine Einschränkung hinzugefügt.The following example adds a constraint to an existing column in the table. Die Spalte hat einen Wert, der die Einschränkung verletzt.The column has a value that violates the constraint. Deshalb wird WITH NOCHECK verwendet, um zu verhindern, dass die Einschränkung für vorhandene Zeilen überprüft wird, und um das Hinzufügen der Einschränkung zu ermöglichen.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. Hinzufügen einer DEFAULT-Einschränkung zu einer vorhandenen SpalteAdding a DEFAULT constraint to an existing column

Im folgenden Beispiel wird eine Tabelle mit zwei Spalten erstellt und ein Wert in die erste Spalte eingefügt, während die andere Spalte NULL bleibt.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. Anschließend wird der zweiten Spalte eine DEFAULT-Einschränkung hinzugefügt.A DEFAULT constraint is then added to the second column. Um zu überprüfen, ob der Standardwert angewendet wird, wird ein weiterer Wert in die erste Spalte eingefügt und die Tabelle abgefragt.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. Hinzufügen mehrerer Spalten mit EinschränkungenAdding several columns with constraints

Im folgenden Beispiel werden mehrere Spalten mit Einschränkungen hinzugefügt, die mit der neuen Spalte definiert werden.The following example adds several columns with constraints defined with the new column. Die erste neue Spalte weist eine IDENTITY-Eigenschaft auf.The first new column has an IDENTITY property. Jede Zeile in der Tabelle besitzt neue inkrementelle Werte in der Identitätsspalte.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. Hinzufügen einer Spalte, die NULL-Werte zulässt, mit StandardwertenAdding a nullable column with default values

Im folgenden Beispiel wird eine Spalte, die NULL-Werte zulässt, mit einer DEFAULT-Definition hinzugefügt und WITH VALUES verwendet, um Werte für jede vorhandene Zeile in der Tabelle bereitzustellen.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. Ohne WITH VALUES hat jede Zeile in der neuen Spalte den Wert NULL.If WITH VALUES isn't used, each row has the value NULL in the new column.

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

G.G. Erstellen einer PRIMARY KEY-Einschränkung mit Index- oder DatenkomprimierungsoptionenCreating a PRIMARY KEY constraint with index or data compression options

Im folgenden Beispiel wird die PRIMARY KEY-Einschränkung PK_TransactionHistoryArchive_TransactionID erstellt, und es werden die Optionen FILLFACTOR, ONLINE und PAD_INDEX festgelegt.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. Der entstehende gruppierte Index hat denselben Namen wie die Einschränkung.The resulting clustered index will have the same name as the constraint.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

In diesem ähnlichen Beispiel werden Seitenkomprimierung und der gruppierte Primärschlüssel angewandt.This similar example applies page compression while applying the clustered primary key.

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

H.H. Hinzufügen einer SparsespalteAdding a sparse column

In den folgenden Beispielen wird gezeigt, wie Sparsespalten der Tabelle T1 hinzugefügt und geändert werden.The following examples show adding and modifying sparse columns in table T1. Der Code zum Erstellen der Tabelle T1 lautet wie folgt.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

Um eine zusätzliche Sparsespalte C5 hinzuzufügen, führen Sie die folgende Anweisung aus.To add an additional sparse column C5, execute the following statement.

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

Um die Nicht-Sparsespalte C4 in eine Sparsespalte umzuwandeln, führen Sie die folgende Anweisung aus.To convert the C4 non-sparse column to a sparse column, execute the following statement.

ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO

Um die C4-Sparsespalte in eine Nicht-Sparsespalte umzuwandeln, führen Sie die folgende Anweisung aus.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. Hinzufügen eines SpaltensatzesAdding a column set

In den folgenden Beispielen wird veranschaulicht, wie eine Spalte der Tabelle T2 hinzugefügt wird.The following examples show adding a column to table T2. Sie können einer Tabelle, die bereits Sparsespalten enthält, keinen Spaltensatz hinzufügen.A column set can't be added to a table that already contains sparse columns. Der Code zum Erstellen der Tabelle T2 lautet wie folgt.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

Durch die folgenden drei Anweisungen werden der Spaltensatz CS hinzugefügt und dann die Spalten C2 und C3 in SPARSE geändert.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. Hinzufügen einer verschlüsselten SpalteAdding an encrypted column

Die folgende Anweisung fügt eine verschlüsselte Spalte mit dem Namen PromotionCode hinzu.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') ;

Löschen von Spalten und EinschränkungenDropping Columns and Constraints

In den Beispielen in diesem Abschnitt wird das Löschen von Spalten und Einschränkungen veranschaulicht.The examples in this section demonstrate dropping columns and constraints.

A.A. Löschen einer oder mehrerer SpaltenDropping a column or columns

Im ersten Beispiel wird eine Tabelle durch Entfernen einer Spalte geändert.The first example modifies a table to remove a column. Im zweiten Beispiel werden mehrere Spalten entfernt.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. Löschen von Einschränkungen und SpaltenDropping constraints and columns

Im ersten Beispiel wird eine UNIQUE-Einschränkung aus einer Tabelle entfernt.The first example removes a UNIQUE constraint from a table. Im zweiten Beispiel werden zwei Einschränkungen und eine einzelne Spalte entfernt.The second example removes two constraints and a single column.

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

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

DROP TABLE dbo.doc_exc;
GO

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

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

    DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.C. Löschen einer PRIMARY KEY-Einschränkung im ONLINE-ModusDropping a PRIMARY KEY constraint in the ONLINE mode

Im folgenden Beispiel wird eine PRIMARY KEY-Einschränkung gelöscht, wobei die ONLINE-Option auf ON festgelegt wird.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. Hinzufügen und Löschen einer FOREIGN KEY-EinschränkungAdding and dropping a FOREIGN KEY constraint

Im folgenden Beispiel wird die ContactBackup-Tabelle erstellt und dann geändert, indem zuerst eine FOREIGN KEY-Einschränkung hinzugefügt wird, die auf die Person.Person-Tabelle verweist, und dann die FOREIGN KEY-Einschränkung gelöscht wird.The following example creates the table ContactBackup, and then alters the table, first by adding a FOREIGN KEY constraint that references the table Person.Person, then by dropping the FOREIGN KEY constraint.

CREATE TABLE Person.ContactBackup
    (ContactID int) ;
GO

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

ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact ;
GO

DROP TABLE Person.ContactBackup ;

Pfeilsymbol mit dem Link „Zurück zum Anfang“ BeispieleArrow icon used with Back to Top link Examples

Ändern einer SpaltendefinitionAltering a Column Definition

A.A. Ändern des Datentyps einer SpalteChanging the data type of a column

Im folgenden Beispiel wird eine Spalte einer Tabelle von INT in DECIMAL geändert.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. Ändern der Größe einer SpalteChanging the size of a column

Im folgenden Beispiel werden die Größe einer varchar-Spalte sowie die Genauigkeit und die Dezimalstellen einer decimal-Spalte geändert.The following example increases the size of a varchar column and the precision and scale of a decimal column. Da die Spalten Daten enthalten, kann die Spaltengröße nur erhöht werden.Because the columns contain data, the column size can only be increased. Beachten Sie auch, dass col_a in einem eindeutigen Index definiert ist.Also notice that col_a is defined in a unique index. Die Größe von col_a kann erhöht werden, da die Spalte vom Datentyp varchar und der Index nicht das Ergebnis einer PRIMARY KEY-Einschränkung ist.The size of col_a can still be increased because the data type is a varchar and the index isn't the result of a PRIMARY KEY constraint.

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

C.C. Ändern von SpaltensortierungenChanging column collation

Im folgenden Beispiel wird gezeigt, wie die Sortierung einer Spalte geändert wird.The following example shows how to change the collation of a column. Zuerst wird eine Tabelle mit der Standardbenutzersortierung erstellt.First, a table is created table with the default user collation.

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

Anschließend wird die Sortierung der Spalte C2 in Latin1_General_BIN geändert.Next, column C2 collation is changed to Latin1_General_BIN. Der Datentyp ist erforderlich, auch wenn er nicht geändert wird.The data type is required, even though it isn't changed.

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

D.D. Verschlüsseln einer SpalteEncrypting a column

Das folgende Beispiel zeigt, wie Sie eine Spalte mit Always Encrypted mit Secure Enclaves verschlüsseln.The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

Zunächst wird eine Tabelle ohne jegliche verschlüsselte Spalten erstellt.First, a table is created without any encrypted columns.

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

Als Nächstes wird die Spalte „C2“ mit einem Spaltenverschlüsselungsschlüssel namens „CEK1“ und Verschlüsselung nach dem Zufallsprinzip verschlüsselt.Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. Für die erfolgreiche Ausführung der Anweisung ist Folgendes erforderlich:For the following statement to succeed:

  • Der Spaltenverschlüsselungsschlüssel muss Enclave-fähig sein.The column encryption key must be enclave-enabled. Das bedeutet, dass er mit einem Spaltenhauptschlüssel verschlüsselt sein muss, der Enclave-Berechnungen zulässt.Meaning, it must be encrypted with a column master key that allows enclave computations.
  • Die SQL Server-Zielinstanz muss Always Encrypted mit Secure Enclaves unterstützen.The target SQL Server instance must support Always Encrypted with secure enclaves.
  • Die Anweisung muss über eine Verbindung übermittelt werden, die für Always Encrypted mit Secure Enclaves eingerichtet ist, und unter Verwendung eines unterstützten Clienttreibers.The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • Außerdem benötigt die aufrufende Anwendung Zugriff auf den Spaltenhauptschlüssel, der „CEK1“ schützt.The calling application must have access to the column master key, protecting CEK1.
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL;
GO

Ändern einer TabellendefinitionAltering a Table Definition

Die Beispiele in diesem Abschnitt veranschaulichen, wie die Definition einer Tabelle geändert wird.The examples in this section demonstrate how to alter the definition of a table.

A.A. Ändern einer Tabelle, um die Komprimierung zu ändernModifying a table to change the compression

Im folgenden Beispiel wird die Komprimierung einer nicht partitionierten Tabelle geändert.The following example changes the compression of a nonpartitioned table. Der Heap oder der gruppierte Index wird neu erstellt.The heap or clustered index will be rebuilt. Wenn die Tabelle ein Heap ist, werden alle nicht gruppierten Indizes neu erstellt.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);

Im folgenden Beispiel wird die Komprimierung einer partitionierten Tabelle geändert.The following example changes the compression of a partitioned table. Die REBUILD PARTITION = 1-Syntax bewirkt, dass nur die Partition 1 neu erstellt wird.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

Mit der folgenden alternativen Syntax werden im gleichen Vorgang alle Partitionen in der Tabelle neu erstellt.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

Weitere Beispiele für die Datenkomprimierung finden Sie unter Datenkomprimierung.For additional data compression examples, see Data Compression.

B.B. Ändern einer columnstore-Tabelle, um die Archivierungskomprimierung zu ändernModifying a columnstore table to change archival compression

Im folgenden Beispiel wird eine columnstore-Tabellenpartition weiter komprimiert, indem ein zusätzlicher Komprimierungsalgorithmus angewendet wird.The following example further compresses a columnstore table partition by applying an additional compression algorithm. Durch diese Komprimierung wird zwar die Tabellengröße reduziert, aber die zum Speichern und Abrufen benötigte Zeit wird verlängert.This compression reduces the table to a smaller size, but also increases the time required for storage and retrieval. Dies empfiehlt sich bei der Archivierung und in Situationen, in denen es auf eine geringere Speicherbelegung und nicht auf den zusätzlichen Zeitaufwand für das Speichern und Abrufen ankommt.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

Gilt für: SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

Im folgenden Beispiel wird eine columnstore-Tabellenpartition, die mit der COLUMNSTORE_ARCHIVE-Option komprimiert wurde, dekomprimiert.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. Nachdem die Daten wiederhergestellt wurden, sind sie weiterhin mit der Columnstore-Komprimierung komprimiert, die für alle Columnstore-Tabellen verwendet wird.When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

Gilt für: SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

C.C. Wechseln von Partitionen zwischen TabellenSwitching partitions between tables

Im folgenden Beispiel wird eine partitionierte Tabelle erstellt, wobei vorausgesetzt wird, dass das myRangePS1-Partitionsschema bereits in der Datenbank erstellt wurde.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. Anschließend wird eine nicht partitionierte Tabelle mit derselben Struktur wie die partitionierte Tabelle und in derselben Dateigruppe wie PARTITION 2 der PartitionTable-Tabelle erstellt.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. Die Daten von PARTITION 2 der PartitionTable-Tabelle werden dann in die NonPartitionTable-Tabelle verschoben.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. Zulassen der Sperrenausweitung in partitionierten TabellenAllowing lock escalation on partitioned tables

Im folgenden Beispiel wird die Sperrenausweitung auf die Partitionsebene einer partitionierten Tabelle ermöglicht.The following example enables lock escalation to the partition level on a partitioned table. Wenn die Tabelle nicht partitioniert ist, wird die Sperrenausweitung auf der TABLE-Ebene festgelegt.If the table isn't partitioned, lock escalation is set at the TABLE level.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

E.E. Konfigurieren der Änderungsnachverfolgung in einer TabelleConfiguring change tracking on a table

Im folgenden Beispiel wird die Änderungsnachverfolgung für die Person.Person-Tabelle aktiviert.The following example enables change tracking on the Person.Person table.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

USE AdventureWorks;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;

Im folgenden Beispiel werden die Änderungsnachverfolgung sowie die Verfolgung von Spalten aktiviert, die während einer Änderung aktualisiert werden.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server.

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

Im folgenden Beispiel wird die Änderungsnachverfolgung für die Person.Person-Tabelle deaktiviert.The following example disables change tracking on the Person.Person table.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

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

Deaktivieren und Aktivieren von Einschränkungen und TriggernDisabling and Enabling Constraints and Triggers

A.A. Deaktivieren und erneutes Aktivieren einer EinschränkungDisabling and re-enabling a constraint

Im folgenden Beispiel wird eine Einschränkung deaktiviert, die die in den Daten akzeptierten Gehälter begrenzt.The following example disables a constraint that limits the salaries accepted in the data. NOCHECK CONSTRAINT wird mit ALTER TABLE verwendet, um die Einschränkung zu deaktivieren und eine Einfügung zuzulassen, die die Einschränkung normalerweise verletzen würde.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. Mit CHECK CONSTRAINT wird die Einschränkung wieder aktiviert.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. Deaktivieren und erneutes Aktivieren eines TriggersDisabling and re-enabling a trigger

Im folgenden Beispiel wird die DISABLE TRIGGER-Option von ALTER TABLE verwendet, um den Trigger zu deaktivieren und eine Einfügung zuzulassen, die den Trigger normalerweise verletzen würde.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. Anschließend wird der Trigger mithilfe von ENABLE TRIGGER wieder aktiviert.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

OnlinevorgängeOnline Operations

A.A. Onlineindexneuerstellung mit LOW_PRIORITY_WAIT-OptionenOnline index rebuild using low-priority wait options

Im folgenden Beispiel wird gezeigt, wie eine Onlineindexneuerstellung mithilfe der LOW_PRIORITY_WAIT-Optionen ausgeführt wird.The following example shows how to perform an online index rebuild specifying the low-priority wait options.

Gilt für: SQL Server 2014 (12.x)SQL Server 2014 (12.x) bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL ServerSQL Server and Azure SQL-DatenbankAzure 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. OnlinespaltenänderungOnline Alter Column

Das folgende Beispiel zeigt, wie Sie einen ALTER COLUMN-Vorgang mit der Option ONLINE ausführen.The following example shows how to run an alter column operation with the ONLINE option.

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server and Azure SQL-DatenbankAzure 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

ZeilenversionsverwaltungSystem Versioning

Mit den folgenden vier Beispielen können Sie sich mit der Syntax für die Systemversionierung vertraut machen.The following four examples will help you become familiar with the syntax for using system versioning. Weitere Informationen erhalten Sie unter Erste Schritte mit temporalen Tabellen mit Systemversionsverwaltung.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server and Azure SQL-DatenbankAzure SQL Database.

A.A. Hinzufügen der Systemversionierung zu vorhandenen TabellenAdd System Versioning to Existing Tables

Im Folgenden wird veranschaulicht, wie Sie die Systemversionierung einer vorhandenen Tabelle hinzufügen und eine neue Verlaufstabelle erstellen.The following example shows how to add system versioning to an existing table and create a future history table. In diesem Beispiel wird davon ausgegangen, dass eine Tabelle mit dem Namen InsurancePolicy mit einem festgelegten Primärschlüssel bereits vorhanden ist.This example assumes that there's an existing table called InsurancePolicy with a primary key defined. Dieses Beispiel füllt die neu erstellten Zeitraumspalten für die Systemversionsverwaltung mit Standardwerten für Start- und Endzeitpunkt auf, da diese Werte nicht NULL sein dürfen.This example populates the newly created period columns for system versioning using default values for the start and end times because these values can't be null. In diesem Beispiel wird die HIDDEN-Klausel verwendet, um sicherzustellen, dass vorhandene Anwendungen, die mit der aktuellen Tabelle interagieren, nicht beeinträchtigt werden.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. Außerdem wird HISTORY_RETENTION_PERIOD verwendet, das nur in SQL-DatenbankSQL Database verfügbar ist.It also uses HISTORY_RETENTION_PERIOD that's available on SQL-DatenbankSQL Database only.

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

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

B.B. Migrieren einer vorhandenen Projektmappe zur SystemversionierungMigrate An Existing Solution to Use System Versioning

In folgendem Beispiel wird gezeigt, wie Sie die Migration zur Systemversionierung von einer Projektmappe durchführen, die Trigger verwendet, um die Unterstützung für temporale Tabellen nachzuahmen.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. Im Beispiel wird davon ausgegangen, dass eine Projektmappe vorhanden ist, die eine ProjectTask- und eine ProjectTaskHistory-Tabelle für ihre vorhandene Projektmappe verwendet, dass sie die Spalten Changed Date und Revised Date für ihren Zeitraum verwendet, dass diese Zeitraumspalten nicht den Datentyp datetime2 verwenden und dass für die ProjectTask-Tabelle ein Primärschlüssel festgelegt ist.The example assumes there's an existing solution that uses a ProjectTask table and a ProjectTaskHistory table for its existing solution, that's uses the Changed Date and Revised Date columns for its periods, that these period columns don't use the datetime2 datatype and that the ProjectTask table has a primary key defined.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

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

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

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

C.C. Deaktivieren und erneutes Aktivieren der Systemversionierung zum Ändern des TabellenschemasDisabling and Re-Enabling System Versioning to Change Table Schema

In diesem Beispiel wird gezeigt, wie Sie die Systemversionierung in der Department-Tabelle deaktivieren, eine Spalte hinzufügen und die Systemversionierung erneut aktivieren können.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. Das Deaktivieren der Systemversionsverwaltung ist nötig, um das Tabellenschema ändern zu können.Disabling system versioning is required to modify the table schema. Führen Sie diese Schritte während einer Transaktion durch, um Aktualisierungen beider Tabellen zu verhindern, während das Tabellenschema aktualisiert wird. Dadurch kann der Datenbankadministrator die Datenkonsistenzprüfung überspringen, wenn die Systemversionsverwaltung erneut aktiviert wird. So wird die Leistung verbessert.Do these steps within a transaction to prevent updates to both tables while updating the table schema, which enables the DBA to skip the data consistency check when re-enabling system versioning and gain a performance benefit. Für Aufgaben wie das Erstellen von Statistiken, das Wechseln von Partitionen oder das Anwenden der Komprimierung auf eine oder beide Tabellen ist das Deaktivieren der Systemversionsverwaltung nicht erforderlich.Tasks such as creating statistics, switching partitions, or applying compression to one or both tables doesn't require disabling system versioning.

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

D.D. Entfernen der SystemversionierungRemoving System Versioning

In diesem Beispiel wird gezeigt, wie Sie die Systemversionierung aus der Tabelle „Department“ entfernen und die DepartmentHistory-Tabelle vollständig löschen.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. Sie können auch die Zeitraumspalten löschen, die vom System zum Erfassen von Systemversionierungsinformationen verwendet werden.Optionally, you might also want to drop the period columns used by the system to record system versioning information. Die Tabellen Department und DepartmentHistory können nicht gelöscht werden, solange die Systemversionsverwaltung aktiviert ist.You can't drop either the Department or the DepartmentHistory tables while system versioning is enabled.

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

Beispiele: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL DW) und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

In allen folgenden Beispielen A bis C wird die FactResellerSales-Tabelle der AdventureWorksPDW2012AdventureWorksPDW2012-Datenbank verwendet.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Bestimmen, ob eine Tabelle partitioniert istDetermining if a table is partitioned

Die folgende Abfrage gibt mindestens eine Zeile zurück, wenn die FactResellerSales -Tabelle partitioniert ist.The following query returns one or more rows if the table FactResellerSales is partitioned. Wenn die Tabelle nicht partitioniert ist, werden keine Zeilen zurückgegeben.If the table isn't partitioned, no rows are returned.

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

B.B. Bestimmen von Begrenzungswerte für eine partitionierte TabelleDetermining boundary values for a partitioned table

Die folgende Abfrage gibt die Begrenzungswerte für jede Partition in der FactResellerSales -Tabelle zurück.The following query returns the boundary values for each partition in the FactResellerSales table.

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

C.C. Bestimmen der Partitionsspalte für eine partitionierte TabelleDetermining the partition column for a partitioned table

Die folgende Abfrage gibt den Namen der Partitionierungsspalte für die Tabelle zurück.The following query returns the name of the partitioning column for table. FactResellerSales.FactResellerSales.

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

D.D. Zusammenführen zweier PartitionenMerging two partitions

In folgendem Beispiel werden zwei Partitionen in einer Tabelle zusammengeführt.The following example merges two partitions on a table.

Die Customer-Tabelle verfügt über die folgende Struktur: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)));

Der folgende Befehl kombiniert die Partitionsgrenzen 10 und 25.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);

Die neue DLL für die Tabelle ist:The new DDL for the table is:

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

E.E. Teilen einer PartitionSplitting a partition

In folgendem Beispiel wird eine Partition in einer Tabelle geteilt.The following example splits a partition on a table.

Die Customer-Tabelle verfügt über die folgende Struktur: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 )));

Der folgende Befehl erstellt eine neue Partitionsgrenze mit dem Wert 75, in der Mitte zwischen 50 und 100.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);

Die neue DLL für die Tabelle ist:The new DDL for the table is:

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

F.F. Verwenden von SWITCH zum Verschieben einer Partition in eine VerlaufstabelleUsing SWITCH to move a partition to a history table

In folgendem Beispiel werden die Daten in einer Partition der Orders-Tabelle in eine Partition der OrdersHistory-Tabelle verschoben.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

Die Orders-Tabelle verfügt über die folgende Struktur: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 diesem Beispiel verfügt die Orders-Tabelle über die folgenden Partitionen.In this example, the Orders table has the following partitions. Jede Partition enthält Daten.Each partition contains data.

PartitionPartition Enthält Daten?Has data? BegrenzungsbereichBoundary range
11 JaYes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 JaYes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 JaYes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 JaYes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 JaYes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
     
  • Partition 1 (enthält Daten): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partition 2 (enthält Daten): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partition 3 (enthält Daten): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partition 4 (enthält Daten): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partition 5 (enthält Daten): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

Die OrdersHistory-Tabelle verfügt über die folgende DLL, die die gleichen Spalten und Spaltennamen wie die Orders-Tabelle aufweist.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. Diese werden in der id-Spalte mittels Hash verteilt.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' )));

Obwohl die Spalten und Spaltennamen identisch sein müssen, müssen die Partitionsbegrenzungen nicht übereinstimmen.Although the columns and column names must be the same, the partition boundaries don't need to be the same. In diesem Beispiel verfügt die OrdersHistory-Tabelle über zwei Partitionen, die beide leer sind:In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • Partition 1 (keine Daten): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • Partition 2 (leer): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Für die letzten beiden Tabellen verschiebt der Befehl alle Zeilen mit OrderDate < '2004-01-01' von der Orders-Tabelle in die OrdersHistory-Tabelle.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;

Dadurch ist die erste Partition in Orders leer, während die erste Partition in OrdersHistory Daten enthält.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. Die Tabellen sehen nun wie folgt aus:The tables now appear as follows:

Orders-TabelleOrders table

  • Partition 1 (leer): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • Partition 2 (enthält Daten): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partition 3 (enthält Daten): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partition 4 (enthält Daten): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partition 5 (enthält Daten): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

OrdersHistory-TabelleOrdersHistory table

  • Partition 1 (enthält Daten): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partition 2 (leer): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Bereinigen Sie die Orders-Tabelle, indem Sie die leere Partition entfernen, indem Sie Partition 1 und 2 folgendermaßen zusammenführen: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');

Nach dem Merge verfügt die Orders-Tabelle über die folgenden Partitionen:After the merge, the Orders table has the following partitions:

Orders-TabelleOrders table

  • Partition 1 (enthält Daten): OrderDate < '2005-01-01'Partition 1 (has data): OrderDate < '2005-01-01'
  • Partition 2 (enthält Daten): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partition 3 (enthält Daten): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partition 4 (enthält Daten): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

Angenommen, es vergeht ein weiteres Jahr, und Sie möchten das Jahr 2005 archivieren.Suppose another year passes and you're ready to archive the year 2005. Sie können dem Jahr 2005 eine leere Partition in der OrdersHistory-Tabelle zuweisen, indem Sie die leere Partition folgendermaßen teilen: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');

Nach dem Teilen verfügt die OrdersHistory-Tabelle über die folgenden Partitionen:After the split, the OrdersHistory table has the following partitions:

OrdersHistory-TabelleOrdersHistory table

  • Partition 1 (enthält Daten): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • Partition 2 (leer): '2004-01-01' < '2005-01-01'Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • Partition 3 (leer): '2005-01-01' <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

Weitere InformationenSee Also