Delen via


ALTER TABLE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Hiermee wijzigt u een tabeldefinitie door kolommen en beperkingen te wijzigen, toe te voegen of te verwijderen. ALTER TABLE ook worden partities opnieuw toegewezen en opnieuw gebouwd, of worden beperkingen en triggers uitgeschakeld en ingeschakeld.

Note

Momenteel wordt ALTER TABLE in Fabric Warehouse alleen ondersteund voor beperkingen en het toevoegen van null-kolommen. Zie syntaxis voor warehouse in Microsoft Fabric. Momenteel zijn tabellen die zijn geoptimaliseerd voor geheugen niet beschikbaar in SQL Database in Microsoft Fabric Preview.

De syntaxis voor ALTER TABLE is anders voor tabellen op basis van schijven en tabellen die zijn geoptimaliseerd voor geheugen. Gebruik de volgende koppelingen om u rechtstreeks naar het juiste syntaxisblok voor uw tabeltypen en naar de juiste syntaxisvoorbeelden te leiden:

Tabellen op basis van schijven:

Tabellen die zijn geoptimaliseerd voor geheugen:

Zie Transact-SQL syntaxisconventiesvoor meer informatie over de syntaxisconventies.

Syntaxis voor tabellen op basis van schijven

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] ,
                start_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID START
                   [ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  end_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID END
                   [ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  start_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER START
                   [ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
            DEFAULT constant_expression [WITH VALUES],
                  end_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER END
                   [ HIDDEN ] 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 }
                          }
                          ]
                        )
                      ]
                  }
            | DATA_DELETION =
                {
                      OFF
                    | ON
                        [(  [ FILTER_COLUMN = column_name ]
                            [, 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 } )
}

Zie voor meer informatie:

Syntaxis voor tabellen die zijn geoptimaliseerd voor geheugen

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

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

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

    | DROP
     [ {
         CONSTRAINT [ IF EXISTS ]
         {
              constraint_name
          } [ ,...n ]
        | INDEX [ IF EXISTS ]
      {
         index_name
       } [ ,...n ]
          | COLUMN [ IF EXISTS ]
          {
              column_name
          } [ ,...n ]
          | PERIOD FOR SYSTEM_TIME
     } [ ,...n ] ]
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
        { ALL | constraint_name [ ,...n ] }

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

    | SWITCH [ [ PARTITION ] source_partition_number_expression ]
        TO target_table
        [ PARTITION target_partition_number_expression ]
        [ WITH ( <low_priority_lock_wait> ) ]

}
[ ; ]

-- ALTER TABLE options

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

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

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

Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse

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
        | PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
        | UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
    }
<rebuild_option > ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}

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

Note

Serverloze SQL-pool in Azure Synapse Analytics ondersteunt alleen externe en tijdelijke tabellen.

Syntaxis voor warehouse in Fabric

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
  ADD  { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]

<column_options> ::=
[ NULL ] -- default is NULL

<data type> ::=
datetime2 ( n )
| date
| time ( n )
| float [ ( n ) ]
| real [ ( n ) ]
| decimal [ ( precision [ , scale ] ) ]
| numeric [ ( precision [ , scale ] ) ]
| bigint
| int
| smallint
| bit
| varchar [ ( n ) ]
| char [ ( n ) ]
| varbinary [ ( n ) ]
| uniqueidentifier

<column_constraint>::=
    [ CONSTRAINT constraint_name ]
    {
       PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
        | UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
    }

Arguments

database_name

De naam van de database waarin de tabel is gemaakt.

schema_name

De naam van het schema waartoe de tabel behoort.

table_name

De naam van de tabel die moet worden gewijzigd. Als de tabel zich niet in de huidige database bevindt of zich in het schema bevindt dat eigendom is van de huidige gebruiker, moet u expliciet de database en het schema opgeven.

ALTER COLUMN

Hiermee geeft u op dat de benoemde kolom moet worden gewijzigd of gewijzigd.

De gewijzigde kolom kan niet het volgende zijn:

  • Een kolom met een tijdstempel gegevenstype.

  • De ROWGUIDCOL voor de tabel.

  • Een berekende kolom of wordt gebruikt in een berekende kolom.

  • Wordt gebruikt in statistieken die door de CREATE STATISTICS instructie worden gegenereerd. Gebruikers moeten de DROP STATISTICS statistieken verwijderen voordat ALTER COLUMN ze kunnen slagen. Voer deze query uit om alle door de gebruiker gemaakte statistieken en statistiekenkolommen voor een tabel op te halen.

    SELECT s.name AS statistics_name,
           c.name AS column_name,
           sc.stats_column_id
    FROM sys.stats AS s
         INNER JOIN sys.stats_columns AS sc
             ON s.object_id = sc.object_id
            AND s.stats_id = sc.stats_id
         INNER JOIN sys.columns AS c
             ON sc.object_id = c.object_id
            AND c.column_id = sc.column_id
    WHERE s.object_id = OBJECT_ID('<table_name>');
    

    Note

    Statistieken die automatisch worden gegenereerd door de queryoptimalisatie, worden automatisch verwijderd door ALTER COLUMN.

  • Wordt gebruikt in een PRIMARY KEY of [FOREIGN KEY] REFERENCES beperking.

  • Wordt gebruikt in een CHECK of UNIQUE beperking. Het wijzigen van de lengte van een kolom met variabele lengte die wordt gebruikt in een CHECK of UNIQUE beperking is echter toegestaan.

  • Gekoppeld aan een standaarddefinitie. De lengte, precisie of schaal van een kolom kan echter worden gewijzigd als het gegevenstype niet wordt gewijzigd.

Het gegevenstype van tekst, ntexten afbeelding kolommen kunnen alleen op de volgende manieren worden gewijzigd:

  • tekstvarchar(max), nvarchar(max)of xml-
  • ntextvarchar(max), nvarchar(max)of xml-
  • afbeeldingvarbinary(max)

Sommige wijzigingen in het gegevenstype kunnen leiden tot een wijziging in de gegevens. Als u bijvoorbeeld een kolom nchar of nvarchar wijzigt in teken of varchar, kan dit leiden tot de conversie van uitgebreide tekens. Zie CAST en CONVERTvoor meer informatie. Het verminderen van de precisie of schaal van een kolom kan leiden tot afkapping van gegevens.

Note

Het gegevenstype van een kolom van een gepartitioneerde tabel kan niet worden gewijzigd.

Het gegevenstype van kolommen in een index kan niet worden gewijzigd, tenzij de kolom een varchar, nvarcharof varbinaire gegevenstype is en de nieuwe grootte gelijk is aan of groter is dan de oude grootte.

Een kolom die is opgenomen in een primaire-sleutelbeperking, kan niet worden gewijzigd van NOT NULL in NULL.

Wanneer u Always Encrypted (zonder beveiligde enclaves) gebruikt, kunt u het ENCRYPTED WITHgegevenstype wijzigen in een compatibel gegevenstype (bijvoorbeeld INT ), BIGINTmaar u kunt geen versleutelingsinstellingen wijzigen.

Wanneer u Always Encrypted gebruikt met beveiligde enclaves, kunt u elke versleutelingsinstelling wijzigen als de kolomversleutelingssleutel (en de nieuwe kolomversleutelingssleutel, als u de sleutel wijzigt), enclaveberekeningen ondersteunen (versleuteld met kolomhoofdsleutels met enclave). Zie Always Encrypted met beveiligde enclavesvoor meer informatie.

Wanneer u een kolom wijzigt, houdt de database-engine elke wijziging bij door een rij in een systeemtabel toe te voegen en de vorige kolomwijziging als een verwijderde kolom te markeren. In het zeldzame geval dat u een kolom te vaak wijzigt, kan de database-engine de limiet voor de recordgrootte bereiken. Als dit gebeurt, krijgt u fout 511 of 1708. U kunt deze fouten voorkomen door de geclusterde index periodiek opnieuw op te bouwen in de tabel of het aantal kolomwijzigingen te verminderen.

column_name

De naam van de kolom die moet worden gewijzigd, toegevoegd of verwijderd. De column_name maximum is 128 tekens. Voor nieuwe kolommen kunt u column_name weglaten voor kolommen die zijn gemaakt met een tijdstempel gegevenstype. De naam tijdstempel wordt gebruikt als u geen column_name opgeeft voor een tijdstempelkolom gegevenstype.

Note

Nieuwe kolommen worden toegevoegd nadat alle bestaande kolommen in de tabel zijn gewijzigd.

[ type_schema_name. ] type_name

Het nieuwe gegevenstype voor de gewijzigde kolom of het gegevenstype voor de toegevoegde kolom. U kunt geen type_name opgeven voor bestaande kolommen met gepartitioneerde tabellen. type_name kan een van de volgende typen zijn:

  • Een SQL Server-systeemgegevenstype.
  • Een aliasgegevenstype op basis van een sql Server-systeemgegevenstype. U maakt aliasgegevenstypen met de CREATE TYPE instructie voordat ze kunnen worden gebruikt in een tabeldefinitie.
  • Een door de gebruiker gedefinieerd .NET Framework-type en het schema waartoe het behoort. U maakt door de gebruiker gedefinieerde typen met de CREATE TYPE instructie voordat deze kunnen worden gebruikt in een tabeldefinitie.

Hier volgen criteria voor type_name van een gewijzigde kolom:

  • Het vorige gegevenstype moet impliciet worden omgezet in het nieuwe gegevenstype.
  • type_name kan niet worden tijdstempel.
  • ANSI_NULL standaardwaarden altijd ingeschakeld zijn voor ALTER COLUMN; als deze niet is opgegeven, kan de kolom null worden gebruikt.
  • ANSI_PADDING opvulling is altijd ON voor ALTER COLUMN.
  • Als de gewijzigde kolom een identiteitskolom is, moet new_data_type een gegevenstype zijn dat ondersteuning biedt voor de identiteitseigenschap.
  • De huidige instelling voor SET ARITHABORT wordt genegeerd. ALTER TABLE werkt alsof ARITHABORT is ingesteld op ON.

Note

Als de COLLATE component niet is opgegeven, zorgt het wijzigen van het gegevenstype van een kolom ervoor dat een sortering wordt gewijzigd in de standaardsortering van de database.

precision

De precisie voor het opgegeven gegevenstype. Zie Precisie, schaal en lengte voor meer informatie over geldige precisiewaarden.

scale

De schaal voor het opgegeven gegevenstype. Zie Precisie, schaal en lengte voor meer informatie over geldige schaalwaarden.

max

Is alleen van toepassing op de varchar, nvarcharen varbinary gegevenstypen voor het opslaan van 2^31-1 bytes aan tekens, binaire gegevens en Unicode-gegevens.

xml_schema_collection

Van toepassing op: SQL Server en Azure SQL Database.

Is alleen van toepassing op het xml- gegevenstype voor het koppelen van een XML-schema aan het type. Voordat u een xml- kolom naar een schemaverzameling typt, maakt u eerst de schemaverzameling in de database met behulp van XML-SCHEMAVERZAMELING maken.

< COLLATION_NAME> SORTEREN

Hiermee geeft u de nieuwe sortering voor de gewijzigde kolom. Als deze niet is opgegeven, wordt aan de kolom de standaardsortering van de database toegewezen. De sorteringsnaam kan een Windows-sorteringsnaam of een SQL-sorteringsnaam zijn. Zie Voor een lijst en meer informatie , Windows-sorteringsnaam en SQL Server-sorteringsnaam.

De COLLATE component wijzigt alleen de sorteringen van kolommen van het teken, varchar, nchar en nvarchar-gegevenstypen . Als u de sortering van een door de gebruiker gedefinieerde aliasgegevenstypekolom wilt wijzigen, gebruikt u afzonderlijke ALTER TABLE instructies om de kolom te wijzigen in een sql Server-systeemgegevenstype. Wijzig vervolgens de sortering en wijzig de kolom weer in een aliasgegevenstype.

ALTER COLUMN kan geen sorteringswijziging hebben als een of meer van de volgende voorwaarden bestaan:

  • Een CHECK beperking, FOREIGN KEY beperking of berekende kolommen verwijzen naar de gewijzigde kolom.
  • Alle indexen, statistieken of volledige-tekstindexen worden in de kolom gemaakt. Statistieken die automatisch worden gemaakt in de kolom worden verwijderd als de kolomsortering wordt gewijzigd.
  • Een schemagebonden weergave of functie verwijst naar de kolom.

Zie COLLATEvoor meer informatie over ondersteunde sorteringen.

NULL | NIET NULL

Hiermee geeft u op of de kolom null-waarden kan accepteren. Kolommen waarvoor null-waarden niet zijn toegestaan, worden alleen toegevoegd ALTER TABLE als ze een standaardwaarde hebben opgegeven of als de tabel leeg is. U kunt alleen opgeven NOT NULL voor berekende kolommen als u ook hebt opgegeven PERSISTED. Als de nieuwe kolom null-waarden toestaat en u geen standaardwaarde opgeeft, bevat de nieuwe kolom een null-waarde voor elke rij in de tabel. Als de nieuwe kolom null-waarden toestaat en u een standaarddefinitie toevoegt aan de nieuwe kolom, kunt WITH VALUES u de standaardwaarde opslaan in de nieuwe kolom voor elke bestaande rij in de tabel.

Als de nieuwe kolom geen null-waarden toestaat en de tabel niet leeg is, moet u een DEFAULT definitie toevoegen met de nieuwe kolom. En de nieuwe kolom wordt automatisch geladen met de standaardwaarde in de nieuwe kolommen in elke bestaande rij.

U kunt opgeven NULLALTER COLUMN dat een NOT NULL kolom null-waarden toestaat, met uitzondering van kolommen in PRIMARY KEY beperkingen. U kunt alleen opgeven NOT NULLALTER COLUMN als de kolom geen null-waarden bevat. De null-waarden moeten worden bijgewerkt naar een bepaalde waarde voordat de ALTER COLUMNNOT NULL waarde is toegestaan, bijvoorbeeld:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;

Wanneer u een tabel met de CREATE TABLE of ALTER TABLE instructies maakt of wijzigt, beïnvloeden de database- en sessie-instellingen de null-waarde van het gegevenstype dat wordt gebruikt in een kolomdefinitie. Zorg ervoor dat u altijd expliciet een kolom definieert als NULL of NOT NULL voor niet-gecomputeerde kolommen.

Als u een kolom met een door de gebruiker gedefinieerd gegevenstype toevoegt, moet u ervoor zorgen dat u de kolom met dezelfde null-waarde definieert als het door de gebruiker gedefinieerde gegevenstype. En geef een standaardwaarde op voor de kolom. Zie CREATE TABLEvoor meer informatie.

Note

Als NULL of NOT NULL is opgegeven met ALTER COLUMN, moet new_data_type [(precisie [, schaal ])] ook worden opgegeven. Als het gegevenstype, de precisie en de schaal niet worden gewijzigd, geeft u de huidige kolomwaarden op.

[ {ADD | DROP} ROWGUIDCOL ]

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u op dat de ROWGUIDCOL eigenschap wordt toegevoegd aan of verwijderd uit de opgegeven kolom. ROWGUIDCOL geeft aan dat de kolom een rij-GUID-kolom is. U kunt slechts één uniekeidentifierkolom per tabel instellen als de ROWGUIDCOL kolom. En u kunt de ROWGUIDCOL eigenschap alleen toewijzen aan een uniekeidentifier-kolom . U kunt niet toewijzen aan ROWGUIDCOL een kolom van een door de gebruiker gedefinieerd gegevenstype.

ROWGUIDCOL dwingt geen uniekheid af van de waarden die zijn opgeslagen in de kolom en genereert niet automatisch waarden voor nieuwe rijen die in de tabel worden ingevoegd. Als u unieke waarden voor elke kolom wilt genereren, gebruikt u de functie NEWID() of NEWSEQUENTIALID() in INSERT instructies. U kunt ook de functie NEWID() of NEWSEQUENTIALID() opgeven als de standaardfunctie voor de kolom.

[ {ADD | DROP} PERSISTENT ]

Hiermee geeft u op dat de PERSISTED eigenschap wordt toegevoegd aan of verwijderd uit de opgegeven kolom. De kolom moet een berekende kolom zijn die is gedefinieerd met een deterministische expressie. Voor kolommen die zijn opgegeven als PERSISTED, slaat de database-engine de berekende waarden fysiek op in de tabel en werkt de waarden bij wanneer andere kolommen waarop de berekende kolom afhankelijk is, worden bijgewerkt. Door een berekende kolom als PERSISTEDte markeren, kunt u indexen maken voor berekende kolommen die zijn gedefinieerd op expressies die deterministisch zijn, maar niet nauwkeurig. Zie Indexen voor berekende kolommen voor meer informatie.

SET QUOTED_IDENTIFIER moet zijn ON wanneer u indexen maakt of wijzigt in berekende kolommen of geïndexeerde weergaven. Zie SET QUOTED_IDENTIFIERvoor meer informatie.

Elke berekende kolom die wordt gebruikt als een partitioneringskolom van een gepartitioneerde tabel, moet expliciet worden gemarkeerd PERSISTED.

Note

In een Fabric SQL-database zijn berekende kolommen toegestaan, maar worden momenteel niet gespiegeld naar Fabric OneLake.

NEERZETTEN NIET VOOR REPLICATIE

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u op dat waarden worden verhoogd in identiteitskolommen wanneer replicatieagenten invoegbewerkingen uitvoeren. U kunt deze component alleen opgeven als column_name een identiteitskolom is.

SPARSE

Geeft aan dat de kolom een sparse-kolom is. De opslag van sparsekolommen is geoptimaliseerd voor null-waarden. U kunt geen parseringskolommen instellen als NOT NULL. Wanneer u een kolom converteert van sparse naar niet-parseren of van niet-parseren naar sparse, wordt met deze optie de tabel vergrendeld voor de duur van de uitvoering van de opdracht. Mogelijk moet u de REBUILD component gebruiken om ruimtebesparingen vrij te maken. Zie Sparse-kolommen gebruiken voor aanvullende beperkingen en meer informatie over sparsekolommen.

GEMASKEERD TOEVOEGEN MET ( FUNCTIE = 'mask_function')

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

Hiermee geeft u een dynamisch gegevensmasker. mask_function is de naam van de maskeringsfunctie met de juiste parameters. Er zijn drie functies beschikbaar:

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

Hiervoor is toestemming vereist ALTER ANY MASK .

Als u een masker wilt verwijderen, gebruikt u DROP MASKED. Zie Dynamische gegevensmaskering voor functieparameters.

Voor het toevoegen en neerzetten van een masker is een machtiging vereist ALTER ANY MASK .

WITH ( ONLINE = AAN | UIT) <van toepassing op het wijzigen van een kolom>

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

Hiermee kunnen veel wijzigingskolomacties worden uitgevoerd terwijl de tabel beschikbaar blijft. De standaardwaarde is OFF. U kunt de kolom online wijzigen voor kolomwijzigingen met betrekking tot gegevenstype, kolomlengte of precisie, nullabiliteit, parsiteit en sortering.

Met een online-wijzigingskolom kunnen gebruikers gemaakt en autostatistiek verwijzen naar de gewijzigde kolom voor de duur van de ALTER COLUMN bewerking, waardoor query's op de gebruikelijke manier kunnen worden uitgevoerd. Aan het einde van de bewerking worden autostatsen die verwijzen naar de kolom verwijderd en worden door de gebruiker gemaakte statistieken ongeldig gemaakt. De gebruiker moet door de gebruiker gegenereerde statistieken handmatig bijwerken nadat de bewerking is voltooid. Als de kolom deel uitmaakt van een filterexpressie voor statistieken of indexen, kunt u geen wijzigingskolombewerking uitvoeren.

  • Terwijl de online bewerking voor het wijzigen van kolommen wordt uitgevoerd, wordt elke DDL-bewerking die afhankelijk kan zijn van die kolom (zoals het maken of wijzigen van indexen, weergaven, enzovoort) geblokkeerd of mislukt met een geschikte fout. Dit gedrag garandeert dat de online-wijzigingskolom niet mislukt vanwege afhankelijkheden die zijn geïntroduceerd tijdens het uitvoeren van de bewerking.

  • Het wijzigen van een kolom van NOT NULL in wordt NULL niet ondersteund als een onlinebewerking wanneer naar de gewijzigde kolom wordt verwezen door niet-geclusterde indexen.

  • Online ALTER wordt niet ondersteund wanneer naar de kolom wordt verwezen door een controlebeperking en de ALTER bewerking de precisie van de kolom (numeriek ofdatum/tijd) beperkt.

  • De optie WAIT_AT_LOW_PRIORITY kan niet worden gebruikt met een online wijzigende kolom.

  • ALTER COLUMN ... ADD/DROP PERSISTED wordt niet ondersteund voor online alter column.

  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION wordt niet beïnvloed door een online-wijzigingskolom.

  • Online wijzigen kolom biedt geen ondersteuning voor het wijzigen van een tabel waarbij wijzigingen bijhouden is ingeschakeld of dat is een uitgever van samenvoegreplicatie.

  • Online alter column biedt geen ondersteuning voor het wijzigen van of naar CLR-gegevenstypen.

  • De online-wijzigingskolom biedt geen ondersteuning voor het wijzigen van een XML-gegevenstype dat een andere schemaverzameling heeft dan de huidige schemaverzameling.

  • Bij online wijzigen van kolommen worden de beperkingen voor wanneer een kolom kan worden gewijzigd, niet beperkt. Verwijzingen per index/statistieken, enzovoort, kunnen ertoe leiden dat de wijziging mislukt.

  • Online wijzigen kolom biedt geen ondersteuning voor het gelijktijdig wijzigen van meer dan één kolom.

  • Online alter column heeft geen effect in een tijdelijke tabel met systeemversies. ALTER de kolom wordt niet als online uitgevoerd, ongeacht welke waarde is opgegeven voor ONLINE de optie.

Online alter column heeft vergelijkbare vereisten, beperkingen en functionaliteit als het opnieuw samenstellen van online indexen, waaronder:

  • Het opnieuw opbouwen van online indexen wordt niet ondersteund wanneer de tabel verouderde LOB- of filestreamkolommen bevat of wanneer de tabel een columnstore-index heeft. Dezelfde beperkingen gelden voor online alter column.
  • Een bestaande kolom die wordt gewijzigd, vereist twee keer de ruimtetoewijzing, voor de oorspronkelijke kolom en voor de zojuist gemaakte verborgen kolom.
  • De vergrendelingsstrategie tijdens een bewerking voor het online wijzigen van kolommen volgt hetzelfde vergrendelingspatroon dat wordt gebruikt voor het bouwen van online indexen.

MET CONTROLE | MET NOCHECK

Hiermee geeft u op of de gegevens in de tabel wel of niet worden gevalideerd op basis van een nieuw toegevoegde of opnieuw ingeschakelde FOREIGN KEY of CHECK beperking. Als u niet opgeeft, WITH CHECK wordt ervan uitgegaan dat er nieuwe beperkingen gelden en WITH NOCHECK wordt ervan uitgegaan dat deze beperkingen opnieuw zijn ingeschakeld.

Als u geen nieuwe CHECK of FOREIGN KEY beperkingen wilt controleren op bestaande gegevens, gebruikt u WITH NOCHECK. We raden u niet aan dit te doen, behalve in zeldzame gevallen. De nieuwe beperking wordt geëvalueerd in alle latere gegevensupdates. Eventuele schendingen van beperkingen die worden onderdrukt WITH NOCHECK wanneer de beperking wordt toegevoegd, kunnen ervoor zorgen dat toekomstige updates mislukken als ze rijen bijwerken met gegevens die niet voldoen aan de beperking. De queryoptimalisatie beschouwt geen beperkingen die zijn gedefinieerd WITH NOCHECK. Dergelijke beperkingen worden genegeerd totdat ze worden ingeschakeld met behulp van ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL. Zie Beperkingen voor refererende sleutels uitschakelen met INSERT- en UPDATE-instructies voor meer informatie.

ALTER INDEX index_name

Hiermee geeft u op dat het aantal buckets voor index_name moet worden gewijzigd of gewijzigd.

De syntaxis ALTER TABLE ... ADD/DROP/ALTER INDEX wordt alleen ondersteund voor tabellen die zijn geoptimaliseerd voor geheugen.

Important

Zonder een ALTER TABLE instructie worden de instructies CREATE INDEX, DROP INDEX, ALTER INDEX en PAD_INDEX niet ondersteund voor indexen in tabellen die zijn geoptimaliseerd voor geheugen.

ADD

Hiermee geeft u op dat een of meer kolomdefinities, berekende kolomdefinities of tabelbeperkingen worden toegevoegd. Of de kolommen die door het systeem worden gebruikt voor systeemversiebeheer, worden toegevoegd. Voor tabellen die zijn geoptimaliseerd voor geheugen, kunt u een index toevoegen.

Note

Nieuwe kolommen worden toegevoegd nadat alle bestaande kolommen in de tabel zijn gewijzigd.

Important

Zonder een ALTER TABLE instructie worden de instructies CREATE INDEX, DROP INDEX, ALTER INDEX en PAD_INDEX niet ondersteund voor indexen in tabellen die zijn geoptimaliseerd voor geheugen.

PERIODE VOOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )

Van toepassing op: SQL Server 2017 (14.x) en latere versies en Azure SQL Database.

Hiermee geeft u de namen op van de kolommen die het systeem gebruikt om de periode vast te leggen waarvoor een record geldig is. U kunt bestaande kolommen opgeven of nieuwe kolommen maken als onderdeel van het ADD PERIOD FOR SYSTEM_TIME argument. Stel de kolommen in met het gegevenstype datetime2 en definieer ze als NOT NULL. Als u een puntkolom definieert als NULL, wordt er een fout weergegeven. U kunt een column_constraint en/of Standaardwaarden opgeven voor kolommen voor de system_start_time en system_end_time kolommen. Zie voorbeeld A in de volgende systeemversiebeheer voorbeelden die laten zien hoe u een standaardwaarde gebruikt voor de kolom system_end_time.

Gebruik dit argument met het SET SYSTEM_VERSIONING argument om een bestaande tabel een tijdelijke tabel te maken. Zie Tijdelijke tabellen en Aan de slag met tijdelijke tabellen voor meer informatie.

Vanaf SQL Server 2017 (14.x) kunnen gebruikers een of beide puntkolommen HIDDEN met vlag markeren om deze kolommen impliciet te verbergen, SELECT * FROM <table_name> zodat er geen waarde voor de kolommen wordt geretourneerd. Standaard worden puntkolommen niet verborgen. Om te kunnen worden gebruikt, moeten verborgen kolommen expliciet worden opgenomen in alle query's die rechtstreeks naar de tijdelijke tabel verwijzen.

DROP

Hiermee geeft u op dat een of meer kolomdefinities, berekende kolomdefinities of tabelbeperkingen worden verwijderd of om de specificatie te verwijderen voor de kolommen die door het systeem worden gebruikt voor systeemversiebeheer.

Note

Kolommen die in grootboektabellen worden verwijderd, worden alleen voorlopig verwijderd. Een verwijderde kolom blijft in de grootboektabel staan, maar wordt gemarkeerd als een verwijderde kolom door de dropped_ledger_table kolom in sys.tables te stellen op 1. De grootboekweergave van de tabel met verwijderde grootboekgegevens wordt ook gemarkeerd als verwijderd door de kolom dropped_ledger_view in sys.tables in te stellen op 1. De naam van een verwijderde grootboektabel, de geschiedenistabel en de grootboekweergave wordt gewijzigd door een voorvoegsel (MSSQL_DroppedLedgerTable, MSSQL_DroppedLedgerHistory, MSSQL_DroppedLedgerView) toe te voegen en een GUID toe te voegen aan de oorspronkelijke naam.

CONSTRAINT-constraint_name

Hiermee geeft u op dat constraint_name uit de tabel wordt verwijderd. Er kunnen meerdere beperkingen worden vermeld.

U kunt de door de gebruiker gedefinieerde of door het systeem opgegeven naam van de beperking bepalen door een query uit te voeren op de sys.check_constraint, sys.default_constraints, sys.key_constraintsen sys.foreign_keys catalogusweergaven.

Een PRIMARY KEY beperking kan niet worden verwijderd als er een XML-index in de tabel bestaat.

INDEX-index_name

Hiermee geeft u op dat index_name uit de tabel wordt verwijderd.

De syntaxis ALTER TABLE ...ALTER INDEXADD/DROP/wordt alleen ondersteund voor tabellen die zijn geoptimaliseerd voor geheugen.

Important

Zonder een ALTER TABLE instructie worden de instructies CREATE INDEX, DROP INDEX, ALTER INDEX en PAD_INDEX niet ondersteund voor indexen in tabellen die zijn geoptimaliseerd voor geheugen.

KOLOM column_name

Hiermee geeft u op dat constraint_name of column_name uit de tabel wordt verwijderd. Er kunnen meerdere kolommen worden weergegeven.

Een kolom kan niet worden verwijderd wanneer dit het volgende is:

  • Wordt gebruikt in een index, hetzij als sleutelkolom of als een INCLUDE
  • Wordt gebruikt in eenCHECK, FOREIGN KEYof UNIQUEPRIMARY KEY beperking.
  • Gekoppeld aan een standaardwaarde die is gedefinieerd met het DEFAULT trefwoord of gebonden aan een standaardobject.
  • Gebonden aan een regel.

Note

Als u een kolom verwijdert, wordt de schijfruimte van de kolom niet vrijgemaakt. Mogelijk moet u de schijfruimte van een verwijderde kolom vrijmaken wanneer de rijgrootte van een tabel bijna is bereikt of de limiet ervan is overschreden. Maak ruimte vrij door een geclusterde index in de tabel te maken of een bestaande geclusterde index opnieuw te bouwen met behulp van ALTER INDEX. Zie dit CSS-blogberichtvoor informatie over de impact van het verwijderen van LOB-gegevenstypen.

PERIODE VOOR SYSTEM_TIME

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

Hiermee wordt de specificatie verwijderd voor de kolommen die door het systeem worden gebruikt voor systeemversiebeheer.

MET <drop_clustered_constraint_option>

Hiermee geeft u op dat een of meer opties voor gegroepeerde beperkingen zijn ingesteld.

MAXDOP = max_degree_of_parallelism

Van toepassing op: SQL Server en Azure SQL Database.

Overschrijft de maximale mate van parallelle uitvoering configuratieoptie alleen voor de duur van de bewerking. Zie Serverconfiguratie: maximale mate van parallelle uitvoering voor meer informatie.

Gebruik de MAXDOP optie om het aantal processors dat wordt gebruikt in parallelle uitvoering van het plan te beperken. Het maximum is 64 processors.

max_degree_of_parallelism kan een van de volgende waarden zijn:

  • 1

    Onderdrukt het genereren van parallelle plannen.

  • >1

    Hiermee beperkt u het maximum aantal processors dat in een parallelle indexbewerking wordt gebruikt tot het opgegeven getal.

  • 0 (standaard)

    Gebruikt het werkelijke aantal processors of minder op basis van de huidige systeemworkload.

Zie Parallelle indexbewerkingen configurerenvoor meer informatie.

Note

Parallelle indexbewerkingen zijn niet beschikbaar in elke editie van SQL Server. Zie Edities en ondersteunde functies van SQL Server 2022voor meer informatie.

ONLINE = { ON | OFF } <van toepassing op drop_clustered_constraint_option>

Hiermee geeft u op of onderliggende tabellen en bijbehorende indexen beschikbaar zijn voor query's en gegevenswijziging tijdens de indexbewerking. De standaardwaarde is OFF. U kunt als een ONLINE bewerking uitvoerenREBUILD.

  • ON

    Langetermijntabelvergrendelingen worden niet bewaard voor de duur van de indexbewerking. Tijdens de hoofdfase van de indexbewerking wordt alleen een Intent Share-vergrendeling (IS) op de brontabel bewaard. Met dit gedrag kunnen query's of updates voor de onderliggende tabel en indexen worden voortgezet. Aan het begin van de bewerking wordt een gedeelde vergrendeling (S) gedurende korte tijd op het bronobject bewaard. Aan het einde van de bewerking wordt gedurende korte tijd een S-vergrendeling (Gedeeld) verkregen op de bron als er een niet-geclusterde index wordt gemaakt. Of een Sch-M -vergrendeling (schemawijziging) wordt verkregen wanneer een geclusterde index online wordt gemaakt of verwijderd en wanneer een geclusterde of niet-geclusterde index opnieuw wordt opgebouwd. ONLINE kan niet worden ingesteld op ON wanneer een index wordt gemaakt in een lokale tijdelijke tabel. Alleen herbouwbewerking met één thread met heap is toegestaan.

    Als u de DDL wilt uitvoeren voor SWITCH of het opnieuw samenstellen van online indexen, moeten alle actieve blokkerende transacties die in een bepaalde tabel worden uitgevoerd, worden voltooid. Wanneer u de bewerking uitvoert, voorkomt u SWITCH dat nieuwe transacties worden gestart en kunnen deze de doorvoer van de werkbelasting aanzienlijk beïnvloeden en de toegang tot de onderliggende tabel tijdelijk vertragen.

  • OFF

    Tabelvergrendelingen zijn van toepassing voor de duur van de indexbewerking. Een offline indexbewerking waarmee een geclusterde index wordt gemaakt, opnieuw wordt opgebouwd of verwijderd, of een niet-geclusterde index wordt opgebouwd of verwijderd, wordt een schemawijziging (Sch-M) voor de tabel verkregen. Deze vergrendeling voorkomt dat alle gebruikers toegang hebben tot de onderliggende tabel voor de duur van de bewerking. Een offline indexbewerking waarmee een niet-geclusterde index wordt gemaakt, verkrijgt een gedeelde (S)-vergrendeling op de tabel. Deze vergrendeling voorkomt updates van de onderliggende tabel, maar staat leesbewerkingen toe, zoals SELECT instructies. Herbouwbewerkingen met meerdere threads met heap zijn toegestaan.

    Zie Hoe online indexbewerkingen werken voor meer informatie.

    Note

    Online indexbewerkingen zijn niet beschikbaar in elke editie van SQL Server. Zie Edities en ondersteunde functies van SQL Server 2022voor meer informatie.

MOVE TO { partition_scheme_name(column_name [ ,...n ] ) | bestandsgroep | "standaard" }

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u een locatie op voor het verplaatsen van de gegevensrijen die zich momenteel op het bladniveau van de geclusterde index bevinden. De tabel wordt verplaatst naar de nieuwe locatie. Deze optie is alleen van toepassing op beperkingen waarmee een geclusterde index wordt gemaakt.

Note

In deze context default is dit geen trefwoord. Het is een id voor de standaardbestandsgroep en moet worden gescheiden, zoals in MOVE TO "default" of MOVE TO [default]. Als "default" dit is opgegeven, moet de QUOTED_IDENTIFIER optie voor de huidige sessie zijn ON . Dit is de standaardinstelling. Zie SET QUOTED_IDENTIFIERvoor meer informatie.

{ CHECK | NOCHECK } CONSTRAINT

Hiermee geeft u op dat constraint_name is ingeschakeld of uitgeschakeld. Deze optie kan alleen worden gebruikt met FOREIGN KEY en CHECK beperkingen. Wanneer NOCHECK deze is opgegeven, wordt de beperking uitgeschakeld en worden toekomstige invoegingen of updates van de kolom niet gevalideerd op basis van de beperkingsvoorwaarden. DEFAULT, PRIMARY KEYen UNIQUE beperkingen kunnen niet worden uitgeschakeld.

  • ALL

    Hiermee geeft u op dat alle beperkingen zijn uitgeschakeld met de NOCHECK optie of zijn ingeschakeld met de CHECK optie.

{ ENABLE | DISABLE } TRIGGER

Hiermee geeft u op dat trigger_name is ingeschakeld of uitgeschakeld. Wanneer een trigger is uitgeschakeld, wordt deze nog steeds gedefinieerd voor de tabel. Wanneer INSERT, UPDATEof DELETE instructies worden uitgevoerd op basis van de tabel, worden de acties in de trigger echter pas uitgevoerd als de trigger opnieuw is ingeschakeld.

  • ALL

    Hiermee geeft u op dat alle triggers in de tabel zijn ingeschakeld of uitgeschakeld.

  • trigger_name

    Hiermee geeft u de naam van de trigger om uit te schakelen of in te schakelen.

{ ENABLE | UITSCHAKELEN } CHANGE_TRACKING

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u op of het bijhouden van wijzigingen is ingeschakeld voor de tabel. Wijzigingen bijhouden is standaard uitgeschakeld.

Deze optie is alleen beschikbaar wanneer wijzigingen bijhouden is ingeschakeld voor de database. Zie OPTIES VOOR ALTER DATABASE SET voor meer informatie.

Als u wijzigingen bijhouden wilt inschakelen, moet de tabel een primaire sleutel hebben.

WITH ( TRACK_COLUMNS_UPDATED = { ON | UIT } )

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u op of de database-engine tracks, die bijgehouden kolommen wijzigen, zijn bijgewerkt. De standaardwaarde is OFF.

SCHAKEL OVER [ PARTITIE source_partition_number_expression ] NAAR [ schema_name. ] target_table [ PARTITIE target_partition_number_expression ]

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee schakelt u een blok gegevens op een van de volgende manieren uit:

  • Alle gegevens van een tabel opnieuw toewijzen als een partitie aan een reeds bestaande gepartitioneerde tabel.
  • Hiermee schakelt u een partitie van de ene gepartitioneerde tabel naar een andere.
  • Alle gegevens in één partitie van een gepartitioneerde tabel opnieuw toewijzen aan een bestaande niet-gepartitioneerde tabel.

Als tabel een gepartitioneerde tabel is, moet u source_partition_number_expressionopgeven. Als target_table is gepartitioneerd, moet u target_partition_number_expressionopgeven. Wanneer u de gegevens van een tabel opnieuw toedeelt als een partitie aan een reeds bestaande gepartitioneerde tabel of een partitie van de ene gepartitioneerde tabel naar de andere overschakelt, moet de doelpartitie bestaan en moet deze leeg zijn.

Wanneer u de gegevens van één partitie opnieuw toedeelt om één tabel te vormen, moet de doeltabel al bestaan en moet deze leeg zijn. Zowel de brontabel of -partitie als de doeltabel of -partitie moeten zich in dezelfde bestandsgroep bevinden. De bijbehorende indexen, of indexpartities, moeten zich ook in dezelfde bestandsgroep bevinden. Veel extra beperkingen zijn van toepassing op het schakelen tussen partities. tabel en target_table kunnen niet hetzelfde zijn. target_table kan een id met meerdere onderdelen zijn.

Zowel source_partition_number_expression als target_partition_number_expression zijn constante expressies die kunnen verwijzen naar variabelen en functies. Dit zijn door de gebruiker gedefinieerde typevariabelen en door de gebruiker gedefinieerde functies. Ze kunnen niet verwijzen naar Transact-SQL expressies.

Een gepartitioneerde tabel met een geclusterde columnstore-index gedraagt zich als een gepartitioneerde heap:

  • De primaire sleutel moet de partitiesleutel bevatten.
  • Een unieke index moet de partitiesleutel bevatten. Maar, inclusief de partitiesleutel met een bestaande unieke index, kan de uniekheid wijzigen.
  • Als u wilt schakelen tussen partities, moeten alle niet-geclusterde indexen de partitiesleutel bevatten.

Zie SWITCHGepartitioneerde tabellen en indexen repliceren voor beperkingen bij het gebruik van replicatie.

Niet-geclusterde columnstore-indexen zijn gebouwd in een alleen-lezen indeling voor SQL Server 2016 (13.x) en voor SQL Database vóór versie V12. U moet niet-geclusterde columnstore-indexen opnieuw opbouwen naar de huidige indeling (die kan worden bijgewerkt) voordat alle PARTITION bewerkingen kunnen worden uitgevoerd.

Limitations

Als beide tabellen identiek zijn gepartitioneerd, inclusief niet-geclusterde indexen en de doeltabel geen niet-geclusterde indexen bevat, treedt er mogelijk een 4907-fout op.

Voorbeelduitvoer:

Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "standaard" | "NULL" })

Van toepassing op: SQL Server. Azure SQL Database biedt geen ondersteuning voor FILESTREAM.

Hiermee geeft u op waar FILESTREAM-gegevens worden opgeslagen.

ALTER TABLE als de SET FILESTREAM_ON component alleen slaagt als de tabel geen FILESTREAM-kolommen heeft. U kunt FILESTREAM-kolommen toevoegen met behulp van een tweede ALTER TABLE instructie.

Als u partition_scheme_nameopgeeft, zijn de regels voor CREATE TABLE van toepassing. Zorg ervoor dat de tabel al is gepartitioneerd voor rijgegevens en het bijbehorende partitieschema dezelfde partitiefunctie en kolommen gebruikt als het FILESTREAM-partitieschema.

filestream_filegroup_name geeft de naam van een FILESTREAM-bestandsgroep op. De bestandsgroep moet één bestand hebben dat is gedefinieerd voor de bestandsgroep met behulp van een CREATE DATABASE - of ALTER DATABASE-instructie , of u krijgt een foutmelding.

"default" hiermee geeft u de FILESTREAM-bestandsgroep op met de DEFAULT eigenschappenset. Als er geen FILESTREAM-bestandsgroep is, krijgt u een foutmelding.

"NULL" geeft aan dat alle verwijzingen naar FILESTREAM-bestandsgroepen voor de tabel worden verwijderd. Alle FILESTREAM-kolommen moeten eerst worden verwijderd. Hiermee SET FILESTREAM_ON = "NULL" verwijdert u alle FILESTREAM-gegevens die aan een tabel zijn gekoppeld.

SET ( SYSTEM_VERSIONING = { UIT | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

Systeemversiebeheer van een tabel wordt uitgeschakeld of ingeschakeld. Als u systeemversiebeheer van een tabel wilt inschakelen, controleert het systeem of aan de vereisten voor systeemversiebeheer wordt voldaan voor het gegevenstype, de beperking voor null-functionaliteit en de primaire-sleutelbeperking voor systeemversiebeheer. Het systeem registreert de geschiedenis van elke record in de systeemversietabel in een afzonderlijke geschiedenistabel. Als het HISTORY_TABLE argument niet wordt gebruikt, is MSSQL_TemporalHistoryFor<primary_table_object_id>de naam van deze geschiedenistabel. Als de geschiedenistabel niet bestaat, genereert het systeem een nieuwe geschiedenistabel die overeenkomt met het schema van de huidige tabel, maakt u een koppeling tussen de twee tabellen en kan het systeem de geschiedenis van elke record in de huidige tabel in de geschiedenistabel vastleggen. Als u het argument HISTORY_TABLE gebruikt om een koppeling naar een bestaande geschiedenistabel te maken en te gebruiken, maakt het systeem een koppeling tussen de huidige tabel en de opgegeven tabel. Wanneer u een koppeling naar een bestaande geschiedenistabel maakt, kunt u ervoor kiezen om een gegevensconsistentiecontrole uit te voeren. Deze controle op gegevensconsistentie zorgt ervoor dat bestaande records niet overlappen. Het uitvoeren van de controle voor gegevensconsistentie is de standaardinstelling. Gebruik het argument SYSTEM_VERSIONING = ON voor een tabel die is gedefinieerd met de PERIOD FOR SYSTEM_TIME component om de bestaande tabel een tijdelijke tabel te maken. Zie Tijdelijke tabellen voor meer informatie.

HISTORY_RETENTION_PERIOD = { ONEINDIG | getal { DAG | DAGEN | WEEK | WEKEN | MAAND | MAANDEN | YEAR | JAAR }

van toepassing op: SQL Server 2017 (14.x) en Azure SQL Database.

Hiermee geeft u eindige of oneindige retentie voor historische gegevens in een tijdelijke tabel. Als u dit weglaat, wordt ervan uitgegaan dat oneindige retentie wordt gebruikt.

DATA_DELETION

van toepassing op: Azure SQL Edge alleen

Hiermee schakelt u het opschonen van oude of verouderde gegevens uit tabellen in een database op basis van bewaarbeleid in. Zie Gegevensretentie in- en uitschakelenvoor meer informatie. De volgende parameters moeten worden opgegeven om gegevensretentie in te schakelen.

  • FILTER_COLUMN = { column_name }

    Hiermee geeft u de kolom op die moet worden gebruikt om te bepalen of de rijen in de tabel verouderd zijn of niet. De volgende gegevenstypen zijn toegestaan voor de filterkolom.

    • date
    • datum/tijd
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { ONEINDIG | getal { DAG | DAGEN | WEEK | WEKEN | MAAND | MAANDEN | YEAR | JAAR }

    Hiermee geeft u het bewaarperiodebeleid voor de tabel. De bewaarperiode wordt opgegeven als een combinatie van een positieve geheel getalwaarde en de datumonderdeeleenheid.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u de toegestane methoden voor escalatie van vergrendeling voor een tabel.

  • AUTO

    Met deze optie kan SQL Server Database Engine de granulariteit voor escalatievergrendeling selecteren die geschikt is voor het tabelschema.

    • Als de tabel is gepartitioneerd, is escalatie van vergrendelingen toegestaan voor de granulariteit van de heap of B-tree (HoBT). Met andere woorden, escalatie is toegestaan tot het partitieniveau. Nadat de vergrendeling is geëscaleerd naar het HoBT-niveau, wordt de vergrendeling later niet geëscaleerd naar TABLE granulariteit.

    • Als de tabel niet is gepartitioneerd, wordt de escalatie van de vergrendeling uitgevoerd op de TABLE granulariteit.

  • TABLE

    Escalatie van vergrendelingen wordt uitgevoerd op granulariteit op tabelniveau, ongeacht of de tabel is gepartitioneerd of niet gepartitioneerd. TABLE is de standaardwaarde.

  • DISABLE

    Voorkomt escalatie van vergrendeling in de meeste gevallen. Vergrendelingen op tabelniveau zijn niet volledig toegestaan. Wanneer u bijvoorbeeld een tabel scant die geen geclusterde index heeft onder het serialiseerbare isolatieniveau, moet Database Engine een tabelvergrendeling nemen om de gegevensintegriteit te beschermen.

REBUILD

Gebruik de REBUILD WITH syntaxis om een hele tabel opnieuw te bouwen, inclusief alle partities in een gepartitioneerde tabel. Als de tabel een geclusterde index heeft, wordt met de REBUILD optie de geclusterde index opnieuw opgebouwd. REBUILD kan worden uitgevoerd als een ONLINE bewerking.

Gebruik de REBUILD PARTITION syntaxis om één partitie opnieuw te bouwen in een gepartitioneerde tabel.

PARTITION = ALL

Van toepassing op: SQL Server en Azure SQL Database.

Herbouwt alle partities bij het wijzigen van de partitiecompressie-instellingen.

HERBOUWEN MET ( <rebuild_option> )

Alle opties zijn van toepassing op een tabel met een geclusterde index. Als de tabel geen geclusterde index heeft, wordt de heap-structuur alleen beïnvloed door een aantal van de opties.

Wanneer een specifieke compressie-instelling niet is opgegeven bij de REBUILD bewerking, wordt de huidige compressie-instelling voor de partitie gebruikt. Als u de huidige instelling wilt retourneren, voert u een query uit op de kolom data_compression in de sys.partitions catalogusweergave.

Zie ALTER TABLE index_optionvoor volledige beschrijvingen van de opties voor opnieuw opbouwen.

DATA_COMPRESSION

Van toepassing op: SQL Server en Azure SQL Database.

Hiermee geeft u de optie voor gegevenscompressie voor de opgegeven tabel, partitienummer of bereik van partities. De opties zijn als volgt:

  • NONE

    Tabel- of opgegeven partities worden niet gecomprimeerd. Deze optie is niet van toepassing op columnstore-tabellen.

  • ROEIEN

    Tabel- of opgegeven partities worden gecomprimeerd met behulp van rijcompressie. Deze optie is niet van toepassing op columnstore-tabellen.

  • BLADZIJDE

    Tabel- of opgegeven partities worden gecomprimeerd met behulp van paginacompressie. Deze optie is niet van toepassing op columnstore-tabellen.

  • COLUMNSTORE

    Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

    Alleen van toepassing op columnstore-tabellen. COLUMNSTORE geeft aan om een partitie die met de COLUMNSTORE_ARCHIVE optie is gecomprimeerd, te decomprimeren. Wanneer de gegevens worden hersteld, worden deze gecomprimeerd met de columnstore-compressie die wordt gebruikt voor alle columnstore-tabellen.

  • COLUMNSTORE_ARCHIVE

    Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

    Is alleen van toepassing op columnstore-tabellen, die zijn opgeslagen met een geclusterde columnstore-index. COLUMNSTORE_ARCHIVE comprimeert de opgegeven partitie verder naar een kleinere grootte. Gebruik deze optie voor archivering of andere situaties waarvoor minder opslag is vereist en die meer tijd kunnen bieden voor opslag en ophalen.

    Zie index_optionals u meerdere partities tegelijk opnieuw wilt bouwen. Als de tabel geen geclusterde index heeft, wordt de heap en de niet-geclusterde indexen opnieuw opgebouwd door de gegevenscompressie te wijzigen. Zie Gegevenscompressie voor meer informatie over compressie.

    ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROW of PAGE is niet toegestaan voor SQL Database in Microsoft Fabric Preview.

XML_COMPRESSION

van toepassing op: SQL Server 2022 (16.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u de optie VOOR XML-compressie voor alle xml- gegevenstypekolommen in de tabel. De opties zijn als volgt:

  • ON

    Kolommen met het xml- gegevenstype worden gecomprimeerd.

  • OFF

    Kolommen met het xml- gegevenstype worden niet gecomprimeerd.

ONLINE = { ON | OFF } <van toepassing op single_partition_rebuild_option>

Hiermee geeft u op of één partitie van de onderliggende tabellen en bijbehorende indexen beschikbaar is voor query's en gegevenswijziging tijdens de indexbewerking. De standaardwaarde is OFF. U kunt als een ONLINE bewerking uitvoerenREBUILD.

  • ON

    Langetermijntabelvergrendelingen worden niet bewaard voor de duur van de indexbewerking. S-lock op de tabel is vereist aan het begin van de index opnieuw opbouwen en een Sch-M vergrendeling op de tabel aan het einde van de online index opnieuw opbouwen. Hoewel beide vergrendelingen korte metagegevensvergrendelingen zijn, moet de Sch-M-vergrendeling wachten tot alle blokkeringstransacties zijn voltooid. Tijdens de wachttijd blokkeert de Sch-M vergrendeling alle andere transacties die achter deze vergrendeling wachten bij het openen van dezelfde tabel.

    Note

    Het opnieuw samenstellen van online indexen kan de low_priority_lock_wait opties instellen die verderop in deze sectie worden beschreven.

  • OFF

    Tabelvergrendelingen worden toegepast voor de duur van de indexbewerking. Hiermee voorkomt u dat alle gebruikers toegang hebben tot de onderliggende tabel voor de duur van de bewerking.

COLUMN_SET_NAME XML-COLUMN_SET VOOR ALL_SPARSE_COLUMNS

Van toepassing op: SQL Server en Azure SQL Database.

De naam van de kolomset. Een kolomset is een niet-getypte XML-weergave die alle geparseerde kolommen van een tabel combineert in een gestructureerde uitvoer. Een kolomset kan niet worden toegevoegd aan een tabel met parseringskolommen. Zie Kolomsets gebruiken voor meer informatie over kolomsets.

{ ENABLE | UITSCHAKELEN } FILETABLE_NAMESPACE

Van toepassing op: SQL Server.

Hiermee schakelt u de door het systeem gedefinieerde beperkingen voor een FileTable in of uit. Kan alleen worden gebruikt met een FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )

Van toepassing op: SQL Server. Azure SQL Database biedt geen ondersteuning voor FileTable.

Hiermee geeft u de naam van de windows-compatibele FileTable-map. Deze naam moet uniek zijn voor alle bestandstabelmapnamen in de database. Vergelijking van uniekheid is niet hoofdlettergevoelig, ondanks de SQL-sorteringsinstellingen. Kan alleen worden gebruikt met een FileTable.

REMOTE_DATA_ARCHIVE

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

Hiermee schakelt u Stretch Database voor een tabel in of uit. Zie Stretch Databasevoor meer informatie.

Important

Stretch Database is afgeschaft in SQL Server 2022 (16.x) en Azure SQL Database. Deze functie wordt verwijderd in een toekomstige versie van de database-engine. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie.

Stretch Database inschakelen voor een tabel

Wanneer u Stretch inschakelt voor een tabel door ONop te geven, moet u ook MIGRATION_STATE = OUTBOUND opgeven om gegevens onmiddellijk te migreren of MIGRATION_STATE = PAUSED om de gegevensmigratie uit te stellen. De standaardwaarde is MIGRATION_STATE = OUTBOUND. Zie Stretch Database inschakelen voor een tabelvoor meer informatie over het inschakelen van Stretch voor een tabel.

Prerequisites. Voordat u Stretch inschakelt voor een tabel, moet u Stretch inschakelen op de server en in de database. Zie Stretch Database inschakelen voor een databasevoor meer informatie.

Permissions. Voor het inschakelen van Stretch voor een database of tabel zijn db_owner machtigingen vereist. Voor het inschakelen van Stretch voor een tabel zijn ook machtigingen voor de tabel vereist ALTER .

Stretch Database uitschakelen voor een tabel

Wanneer u Stretch voor een tabel uitschakelt, hebt u twee opties voor de externe gegevens die al naar Azure zijn gemigreerd. Zie Stretch Database uitschakelen en externe gegevens terugbrengenvoor meer informatie.

  • Voer de volgende opdracht uit om Stretch voor een tabel uit te schakelen en de externe gegevens voor de tabel van Azure terug te kopiëren naar SQL Server. Deze opdracht kan niet worden geannuleerd.

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

Deze bewerking brengt kosten voor gegevensoverdracht in rekening en kan niet worden geannuleerd. Zie Prijsinformatie voor gegevensoverdrachtenvoor meer informatie.

Nadat alle externe gegevens zijn gekopieerd van Azure naar SQL Server, is Stretch uitgeschakeld voor de tabel.

  • Als u Stretch wilt uitschakelen voor een tabel en de externe gegevens wilt verlaten, voert u de volgende opdracht uit.

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

Nadat u Stretch Database voor een tabel hebt uitgeschakeld, stopt de gegevensmigratie en bevatten queryresultaten geen resultaten meer uit de externe tabel.

Als u Stretch uitschakelt, wordt de externe tabel niet verwijderd. Als u de externe tabel wilt verwijderen, zet u deze neer met behulp van Azure Portal.

[ FILTER_PREDICATE = { null | predicaat } ]

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

U kunt desgewenst een filterpredicaat opgegeven om rijen te selecteren die moeten worden gemigreerd uit een tabel die zowel historische als huidige gegevens bevat. Het predicaat moet een deterministische inline tabelwaardefunctie aanroepen. Zie Stretch Database inschakelen voor een tabel en Rijen selecteren om te migreren met behulp van een filterfunctie - Stretch Databasevoor meer informatie.

Important

Als u een filterpredicaat opgeeft dat slecht presteert, presteert de gegevensmigratie ook slecht. Stretch Database past het filterpredicaat toe op de tabel met behulp van de CROSS APPLY operator.

Als u geen filterpredicaat opgeeft, wordt de hele tabel gemigreerd.

Wanneer u een filterpredicaat opgeeft, moet u ook opgeven MIGRATION_STATE.

MIGRATION_STATE = { UITGAAND | INKOMEND | ONDERBROKEN }

Van toepassing op: SQL Server 2017 (14.x) en latere versies.

WAIT_AT_LOW_PRIORITY

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

Bij het opnieuw samenstellen van een online index moet worden gewacht op blokkeringsbewerkingen in deze tabel. WAIT_AT_LOW_PRIORITY geeft aan dat de onlinebewerking voor het opnieuw opbouwen van indexen wacht op vergrendelingen met lage prioriteit, zodat andere bewerkingen kunnen worden uitgevoerd terwijl de online indexbuildbewerking wacht. Het weglaten van de WAIT AT LOW PRIORITY optie is hetzelfde als WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = tijd [ MINUTEN ]

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

De wachttijd, een geheel getal dat is opgegeven in minuten, dat de SWITCH of online index opnieuw opbouwen wacht met een lage prioriteit bij het uitvoeren van de DDL-opdracht. Als de bewerking voor de MAX_DURATION tijd wordt geblokkeerd, wordt een van de ABORT_AFTER_WAIT acties uitgevoerd. MAX_DURATION de tijd is altijd in minuten en u kunt het woord MINUTESweglaten.

ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS }

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

  • NONE

    Blijf wachten op de vergrendeling met normale (normale) prioriteit.

  • SELF

    Sluit de SWITCH DDL-bewerking of de online index opnieuw op zonder actie te ondernemen.

  • BLOCKERS

    Alle gebruikerstransacties die momenteel de SWITCH DDL-bewerking blokkeren of online index opnieuw samenstellen, zodat de bewerking kan worden voortgezet.

    Hiervoor is toestemming vereist ALTER ANY CONNECTION .

INDIEN AANWEZIG

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

Hiermee wordt de kolom of beperking voorwaardelijk alleen verwijderd als deze al bestaat.

HERVATBAAR = { AAN | UIT}

Van toepassing op: SQL Server 2022 (16.x) en latere versies.

Hiermee geeft u op of een ALTER TABLE ADD CONSTRAINT bewerking kan worden hervat. De bewerking Tabelbeperking toevoegen kan worden hervat wanneer ON. De bewerking Tabelbeperking toevoegen kan niet worden hervat wanneer OFF. De standaardwaarde is OFF. De optie RESUMABLE kan worden gebruikt als onderdeel van de ALTER TABLE index_option in de ALTER TABLE table_constraint.

MAX_DURATION wanneer wordt gebruikt met RESUMABLE = ON (vereist ONLINE = ON) geeft de tijd aan (een geheel getal dat is opgegeven in minuten) dat een hervatbare online bewerking voor het toevoegen van beperkingen wordt uitgevoerd voordat deze wordt onderbroken. Als dit niet is opgegeven, wordt de bewerking voortgezet totdat deze is voltooid.

Zie Hervatbare tabelbeperkingen toevoegen voor meer informatie over het inschakelen en gebruiken van hervatbare ALTER TABLE ADD CONSTRAINT bewerkingen.

Remarks

Als u nieuwe rijen met gegevens wilt toevoegen, gebruikt u INSERT. Als u rijen met gegevens wilt verwijderen, gebruikt u DELETE of TRUNCATE TABLE. Als u de waarden in bestaande rijen wilt wijzigen, gebruikt u UPDATE-.

Als er uitvoeringsplannen in de procedurecache staan die verwijzen naar de tabel, ALTER TABLE markeert u deze om opnieuw te worden gecompileerd bij de volgende uitvoering.

In SQL Database in Microsoft Fabric Preview kunnen sommige tabelfuncties worden gemaakt, maar worden ze niet gespiegeld in de Fabric OneLake. Zie Beperkingen voor spiegeling van Fabric SQL-databases (preview) voor meer informatie.

De grootte van een kolom wijzigen

U kunt de lengte, precisie of schaal van een kolom wijzigen door een nieuwe grootte op te geven voor het kolomgegevenstype. Gebruik de ALTER COLUMN component. Als er gegevens in de kolom aanwezig zijn, kan de nieuwe grootte niet kleiner zijn dan de maximale grootte van de gegevens. U kunt de kolom ook niet definiëren in een index, tenzij de kolom een varchar-, nvarchar- of varbinair gegevenstype is en de index niet het resultaat is van een PRIMARY KEY beperking. Zie het voorbeeld in de korte sectie met de titel Een kolomdefinitie wijzigen.

Vergrendelingen en ALTER TABLE

Wijzigingen die u in ALTER TABLE de implementatie onmiddellijk opgeeft. Als de wijzigingen wijzigingen van de rijen in de tabel vereisen, ALTER TABLE worden de rijen bijgewerkt. ALTER TABLE krijgt een schemawijziging (Sch-M) vergrendeling op de tabel om ervoor te zorgen dat er tijdens de wijziging geen andere verbindingen verwijzen naar zelfs de metagegevens voor de tabel, met uitzondering van online indexbewerkingen waarvoor een korte Sch-M-vergrendeling aan het einde is vereist. In een ALTER TABLE...SWITCH bewerking wordt de vergrendeling verkregen op zowel de bron- als doeltabellen. De wijzigingen in de tabel worden geregistreerd en kunnen volledig worden hersteld. Wijzigingen die van invloed zijn op alle rijen in grote tabellen, zoals het verwijderen van een kolom of, in sommige edities van SQL Server, het toevoegen van een NOT NULL kolom met een standaardwaarde, kan lang duren en veel logboekrecords genereren. Voer deze ALTER TABLE instructies uit met dezelfde zorg als elke INSERT, UPDATEof DELETE instructie die van invloed is op veel rijen.

is van toepassing op Warehouse in Microsoft Fabric.

ALTER TABLE kan geen deel uitmaken van een expliciete transactie.

Uitgebreide gebeurtenissen (XEvents) voor partitieswitch

De volgende XEvents zijn gerelateerd aan ALTER TABLE ... SWITCH PARTITION en online index herbouwt.

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

NOT NULL-kolommen toevoegen als onlinebewerking

In SQL Server 2012 (11.x) Enterprise Edition en latere versies is het toevoegen van een NOT NULL kolom met een standaardwaarde een onlinebewerking wanneer de standaardwaarde een runtimeconstante is. Dit betekent dat de bewerking bijna onmiddellijk wordt voltooid ondanks het aantal rijen in de tabel, omdat de bestaande rijen in de tabel niet worden bijgewerkt tijdens de bewerking. In plaats daarvan wordt de standaardwaarde alleen opgeslagen in de metagegevens van de tabel en wordt de waarde zo nodig opgezoekd in query's die toegang hebben tot deze rijen. Dit gedrag is automatisch. Er is geen extra syntaxis vereist om de onlinebewerking buiten de ADD COLUMN syntaxis te implementeren. Een runtimeconstante is een expressie die dezelfde waarde produceert tijdens runtime voor elke rij in de tabel, ondanks het determinisme. De constante expressie "My temporary data"of de systeemfunctie GETUTCDATETIME() zijn bijvoorbeeld runtimeconstanten. De functies NEWID() of NEWSEQUENTIALID() daarentegen geen runtimeconstanten zijn, omdat er voor elke rij in de tabel een unieke waarde wordt geproduceerd. Het toevoegen van een NOT NULL kolom met een standaardwaarde die geen runtimeconstante is, wordt altijd offline uitgevoerd en er wordt een exclusieve (Sch-M) vergrendeling verkregen voor de duur van de bewerking.

Hoewel de bestaande rijen verwijzen naar de waarde die is opgeslagen in metagegevens, wordt de standaardwaarde opgeslagen in de rij voor nieuwe rijen die zijn ingevoegd en geen andere waarde voor de kolom opgeven. De standaardwaarde die is opgeslagen in metagegevens, wordt verplaatst naar een bestaande rij wanneer de rij wordt bijgewerkt (zelfs als de werkelijke kolom niet is opgegeven in de UPDATE instructie) of als de tabel of geclusterde index opnieuw wordt opgebouwd.

Kolommen van het type varchar(max), nvarchar(max), varbinary(max), xml, tekst, ntext, image, hierarchyid, geometrie, geografie of CLR door de gebruiker gedefinieerde typen kunnen niet worden toegevoegd in een onlinebewerking. Een kolom kan niet online worden toegevoegd als dit ervoor zorgt dat de maximaal mogelijke rijgrootte de limiet van 8.060 byte overschrijdt. De kolom wordt in dit geval toegevoegd als offlinebewerking.

Parallelle uitvoering van plannen

In SQL Server 2012 (11.x) Enterprise Edition en latere versies wordt het aantal processors dat wordt gebruikt om één ALTER TABLE ADD (op index gebaseerde) CONSTRAINT of DROP (geclusterde index) CONSTRAINT -instructie uit te voeren, bepaald door de maximale mate van parallelle configuratie en de huidige workload. Als de database-engine detecteert dat het systeem bezet is, wordt de mate van parallelle uitvoering van de bewerking automatisch verminderd voordat de uitvoering van de instructie wordt gestart. U kunt handmatig het aantal processors configureren dat wordt gebruikt om de instructie uit te voeren door de MAXDOP optie op te geven. Zie Serverconfiguratie: maximale mate van parallelle uitvoering voor meer informatie.

Gepartitioneerde tabellen

Naast het uitvoeren van SWITCH-bewerkingen waarbij gepartitioneerde tabellen zijn betrokken, kunt ALTER TABLE u de status van de kolommen, beperkingen en triggers van een gepartitioneerde tabel wijzigen, net zoals deze wordt gebruikt voor niet-gepartitioneerde tabellen. Deze instructie kan echter niet worden gebruikt om de manier te wijzigen waarop de tabel zelf wordt gepartitioneerd. Als u een gepartitioneerde tabel opnieuw wilt partitioneren, gebruikt u ALTER PARTITION SCHEME en ALTER PARTITION FUNCTION. Daarnaast kunt u het gegevenstype van een kolom van een gepartitioneerde tabel niet wijzigen.

Beperkingen voor tabellen met schemagebonden weergaven

De beperkingen die van toepassing zijn op ALTER TABLE instructies voor tabellen met schemagebonden weergaven zijn hetzelfde als de beperkingen die momenteel worden toegepast bij het wijzigen van tabellen met een eenvoudige index. Het toevoegen van een kolom is toegestaan. Het verwijderen of wijzigen van een kolom die deelneemt aan een schemagebonden weergave is echter niet toegestaan. Als voor de ALTER TABLE instructie een kolom moet worden gewijzigd die wordt gebruikt in een schemagebonden weergave, ALTER TABLE mislukt het en genereert de database-engine een foutbericht. Zie CREATE VIEWvoor meer informatie over schemabinding en geïndexeerde weergaven.

Het toevoegen of verwijderen van triggers op basistabellen wordt niet beïnvloed door een schemagebonden weergave te maken die verwijst naar de tabellen.

Indexen en ALTER TABLE

Indexen die zijn gemaakt als onderdeel van een beperking, worden verwijderd wanneer de beperking wordt verwijderd. Indexen met die zijn gemaakt CREATE INDEX , moeten worden verwijderd met DROP INDEX. Gebruik de ALTER INDEX instructie om een indexonderdeel van een beperkingsdefinitie opnieuw te bouwen. De beperking hoeft niet te worden verwijderd en opnieuw toegevoegd met ALTER TABLE.

Alle indexen en beperkingen op basis van een kolom moeten worden verwijderd voordat de kolom kan worden verwijderd.

Wanneer u een beperking verwijdert die een geclusterde index heeft gemaakt, worden de gegevensrijen die zijn opgeslagen op het bladniveau van de geclusterde index, opgeslagen in een niet-geclusterde tabel. U kunt de geclusterde index verwijderen en de resulterende tabel naar een andere bestandsgroep of partitieschema in één transactie verplaatsen door de MOVE TO optie op te geven. De MOVE TO optie heeft de volgende beperkingen:

  • MOVE TO is niet geldig voor geïndexeerde weergaven of niet-geclusterde indexen.

  • Het partitieschema of de bestandsgroep moet al bestaan.

  • Als MOVE TO deze niet is opgegeven, bevindt de tabel zich in hetzelfde partitieschema of dezelfde bestandsgroep als die is gedefinieerd voor de geclusterde index.

Wanneer u een geclusterde index verwijdert, geeft u de ONLINE = ON optie op, zodat query's en wijzigingen in de onderliggende gegevens en gekoppelde niet-geclusterde indexen niet worden geblokkeerd door de DROP INDEX transactie.

ONLINE = ON heeft de volgende beperkingen:

  • ONLINE = ON is niet geldig voor geclusterde indexen die ook zijn uitgeschakeld. Uitgeschakelde indexen moeten worden verwijderd met behulp van ONLINE = OFF.
  • Er kan slechts één index tegelijk worden verwijderd.
  • ONLINE = ON is niet geldig voor geïndexeerde weergaven, niet-geclusterde indexen of indexen in lokale tijdelijke tabellen.
  • ONLINE = ON is niet geldig voor columnstore-indexen.

Tijdelijke schijfruimte die gelijk is aan de grootte van de bestaande geclusterde index is vereist om een geclusterde index te verwijderen. Deze extra ruimte wordt vrijgegeven zodra de bewerking is voltooid.

Note

De opties onder <drop_clustered_constraint_option> Zijn van toepassing op geclusterde indexen in tabellen en kunnen niet worden toegepast op geclusterde indexen in weergaven of niet-geclusterde indexen.

Schemawijzigingen repliceren

Wanneer u wordt uitgevoerd ALTER TABLE op een gepubliceerde tabel in een SQL Server Publisher, wordt deze wijziging standaard doorgegeven aan alle SQL Server-abonnees. Deze functionaliteit heeft enkele beperkingen. U kunt deze uitschakelen. Zie Schemawijzigingen aanbrengen in publicatiedatabasesvoor meer informatie.

Gegevenscompressie

Systeemtabellen kunnen niet worden ingeschakeld voor compressie. Als de tabel een heap is, wordt de herbouwbewerking voor ONLINE de modus één thread gebruikt. Gebruik OFFLINE de modus voor een herbouwbewerking met meerdere threads. Zie Gegevenscompressie voor meer informatie over gegevenscompressie.

Als u wilt evalueren hoe het wijzigen van de compressiestatus van invloed is op een tabel, een index of een partitie, gebruikt u de opgeslagen procedure van het sp_estimate_data_compression_savings systeem.

De volgende beperkingen gelden voor gepartitioneerde tabellen:

  • U kunt de compressie-instelling van één partitie niet wijzigen als de tabel niet-uitgelijnde indexen heeft.
  • De ALTER TABLE <table> REBUILD PARTITION ... syntaxis herbouwt de opgegeven partitie.
  • De ALTER TABLE <table> REBUILD WITH ... syntaxis herbouwt alle partities.

Ntekstkolommen neerzetten

Wanneer u kolommen neerzet met het afgeschafte gegevenstype ntext , vindt het opschonen van de verwijderde gegevens plaats als een geserialiseerde bewerking op alle rijen. Voor het opschonen kan een grote hoeveelheid tijd nodig zijn. Wanneer u een ntekstkolom in een tabel met veel rijen neer zet, werkt u eerst de ntekstkolom bij naar NULL waarde en zet u de kolom neer. U kunt deze optie uitvoeren met parallelle bewerkingen en deze veel sneller maken.

Online index herbouwen

Als u de DDL-instructie voor het opnieuw samenstellen van een onlineindex wilt uitvoeren, moeten alle actieve blokkerende transacties die in een bepaalde tabel worden uitgevoerd, worden voltooid. Wanneer het opnieuw opbouwen van de onlineindex wordt gestart, worden alle nieuwe transacties geblokkeerd die klaar zijn om in deze tabel te worden uitgevoerd. Hoewel de duur van de vergrendeling voor het opnieuw samenstellen van online indexen kort is, kan het wachten op alle geopende transacties in een bepaalde tabel worden voltooid en de nieuwe transacties worden geblokkeerd om te starten, de doorvoer aanzienlijk beïnvloeden. Dit kan leiden tot een vertraging of time-out voor een workload en de toegang tot de onderliggende tabel aanzienlijk beperken. Met de WAIT_AT_LOW_PRIORITY optie kunnen DBA's de S-vergrendeling en Sch-M vergrendelingen beheren die vereist zijn voor het opnieuw samenstellen van online indexen. In alle drie gevallen: NONE, SELFen , als BLOCKERSer tijdens de wachttijd ((MAX_DURATION = n [minutes])) geen blokkerende activiteiten zijn, wordt de online index opnieuw opbouwen onmiddellijk uitgevoerd zonder te wachten en de DDL-instructie is voltooid.

Compatibiliteitsondersteuning

De ALTER TABLE instructie ondersteunt slechts tweedelige (schema.object) tabelnamen. In SQL Server mislukt het opgeven van een tabelnaam met behulp van de volgende indelingen tijdens het compileren met fout 117.

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

In eerdere versies geeft u de indeling op server.database.schema.table fout 4902 geretourneerd. Het opgeven van de indeling .database.schema.table of de indeling ..schema.table geslaagd.

Verwijder het gebruik van een vierdelige voorvoegsel om het probleem op te lossen.

Permissions

Hiervoor is toestemming vereist ALTER voor de tabel.

ALTER TABLE machtigingen zijn van toepassing op beide tabellen die betrokken zijn bij een ALTER TABLE SWITCH instructie. Alle gegevens die worden overgeschakeld, nemen de beveiliging van de doeltabel over.

Als u kolommen in de ALTER TABLE instructie hebt gedefinieerd als een common language runtime (CLR) door de gebruiker gedefinieerd type of aliasgegevenstype, REFERENCES is de machtiging voor het type vereist.

Voor het toevoegen of wijzigen van een kolom waarmee de rijen van de tabel worden bijgewerkt, is toestemming vereist UPDATE voor de tabel. Als u bijvoorbeeld een NOT NULL kolom met een standaardwaarde toevoegt of een identiteitskolom toevoegt wanneer de tabel niet leeg is.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Category Aanbevolen syntaxiselementen
kolommen en beperkingen toevoegen ADD; PRIMARY KEY met indexopties, parseren van kolommen en kolomsets
kolommen en beperkingen verwijderen DROP
een kolomdefinitie wijzigen gegevenstype wijzigen; kolomgrootte wijzigen; collatie
een tabeldefinitie wijzigen DATA_COMPRESSION; SWITCH PARTITION; ; LOCK ESCALATION wijzigingen bijhouden
beperkingen en triggers uitschakelen en inschakelen CHECK; NO CHECK; ; ENABLE TRIGGERDISABLE TRIGGER
Onlinebewerkingen ONLINE
Systeemversiebeheer SYSTEM_VERSIONING

Kolommen en beperkingen toevoegen

Voorbeelden in deze sectie laten zien hoe u kolommen en beperkingen toevoegt aan een tabel.

A. Een nieuwe kolom toevoegen

In het volgende voorbeeld wordt een kolom toegevoegd die null-waarden toestaat en geen waarden heeft die via een DEFAULT definitie zijn opgegeven. In de nieuwe kolom heeft NULLelke rij .

CREATE TABLE dbo.doc_exa (column_a INT);
GO

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

B. Een kolom met een beperking toevoegen

In het volgende voorbeeld wordt een nieuwe kolom met een UNIQUE beperking toegevoegd.

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

EXECUTE sp_help doc_exc;
GO

DROP TABLE dbo.doc_exc;
GO

C. Een niet-geverifieerde CHECK-beperking toevoegen aan een bestaande kolom

In het volgende voorbeeld wordt een beperking toegevoegd aan een bestaande kolom in de tabel. De kolom heeft een waarde die de beperking schendt. Daarom wordt WITH NOCHECK gebruikt om te voorkomen dat de beperking wordt gevalideerd op basis van bestaande rijen en om toe te staan dat de beperking wordt toegevoegd.

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

EXECUTE sp_help doc_exd;
GO

DROP TABLE dbo.doc_exd;
GO

D. Een STANDAARDbeperking toevoegen aan een bestaande kolom

In het volgende voorbeeld wordt een tabel met twee kolommen gemaakt en wordt een waarde ingevoegd in de eerste kolom en blijft de andere kolom behouden NULL. Vervolgens wordt er een DEFAULT-beperking toegevoegd aan de tweede kolom. Als u wilt controleren of de standaardwaarde is toegepast, wordt er een andere waarde ingevoegd in de eerste kolom en wordt er een query op de tabel uitgevoerd.

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. Meerdere kolommen met beperkingen toevoegen

In het volgende voorbeeld worden verschillende kolommen met beperkingen toegevoegd die zijn gedefinieerd met de nieuwe kolom. De eerste nieuwe kolom heeft een eigenschap IDENTITY. Elke rij in de tabel bevat nieuwe incrementele waarden in de identiteitskolom.

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

ALTER TABLE dbo.doc_exe

    -- Add a PRIMARY KEY identity column.
    ADD 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 FOREIGN KEY 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

EXECUTE sp_help doc_exe;
GO

DROP TABLE dbo.doc_exe;
GO

F. Een kolom met null-waarden toevoegen met standaardwaarden

In het volgende voorbeeld wordt een kolom met null-waarden met een definitie van DEFAULT toegevoegd en wordt WITH VALUES gebruikt om waarden op te geven voor elke bestaande rij in de tabel. Als WITH VALUES deze niet wordt gebruikt, heeft elke rij de waarde NULL in de nieuwe kolom.

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
        CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO

DROP TABLE dbo.doc_exf;
GO

G. Een PRIMAIRE-SLEUTELbeperking maken met opties voor index- of gegevenscompressie

In het volgende voorbeeld wordt de PRIMARY KEY beperking PK_TransactionHistoryArchive_TransactionID gemaakt en worden de opties FILLFACTORingesteld, ONLINEen PAD_INDEX. De resulterende geclusterde index heeft dezelfde naam als de beperking.

Van toepassing op: SQL Server en Azure SQL Database.

USE AdventureWorks2022;
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 dit vergelijkbare voorbeeld wordt paginacompressie toegepast tijdens het toepassen van de geclusterde primaire sleutel.

USE AdventureWorks2022;
GO

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

H. Een sparse-kolom toevoegen

In de volgende voorbeelden ziet u hoe u sparsekolommen toevoegt en wijzigt in tabel T1. De code voor het maken van een tabel T1 is als volgt.

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

Als u een extra sparsekolom C5wilt toevoegen, voert u de volgende instructie uit.

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

Voer de volgende instructie uit om de C4 niet-parse kolom te converteren naar een sparsekolom.

ALTER TABLE T1
    ALTER COLUMN C4 ADD SPARSE;
GO

Als u de C4 sparse-kolom wilt converteren naar een niet-parse kolom, voert u de volgende instructie uit.

ALTER TABLE T1
    ALTER COLUMN C4 DROP SPARSE;
GO

I. Een kolomset toevoegen

In de volgende voorbeelden ziet u hoe u een kolom toevoegt aan tabel T2. Een kolomset kan niet worden toegevoegd aan een tabel die al sparse kolommen bevat. De code voor het maken van een tabel T2 is als volgt.

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

Met de volgende drie instructies voegt u een kolomset met de naam CStoe en wijzigt u vervolgens kolommen C2 en C3 in SPARSE.

ALTER TABLE T2
    ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
GO

ALTER TABLE T2
    ALTER COLUMN C2 ADD SPARSE;
GO

ALTER TABLE T2
    ALTER COLUMN C3 ADD SPARSE;
GO

J. Een versleutelde kolom toevoegen

Met de volgende instructie wordt een versleutelde kolom met de naam PromotionCodetoegevoegd.

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

K. Een primaire sleutel met hervatbare bewerking toevoegen

Hervatbare ALTER TABLE bewerking voor het toevoegen van een primaire sleutel die is geclusterd op kolom (a) met MAX_DURATION van 240 minuten.

ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Kolommen en beperkingen verwijderen

In de voorbeelden in deze sectie ziet u hoe kolommen en beperkingen worden verwijderd.

A. Een kolom of kolommen verwijderen

In het eerste voorbeeld wordt een tabel gewijzigd om een kolom te verwijderen. In het tweede voorbeeld worden meerdere kolommen verwijderd.

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. Beperkingen en kolommen verwijderen

In het eerste voorbeeld wordt een UNIQUE beperking uit een tabel verwijderd. In het tweede voorbeeld worden twee beperkingen en één kolom verwijderd.

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. Een BEPERKING PRIMAIRE SLEUTEL verwijderen in de ONLINEmodus

In het volgende voorbeeld wordt een PRIMARY KEY beperking verwijderd waarbij de ONLINE optie is ingesteld op ON.

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

D. Een beperking REFERERENDE SLEUTEL toevoegen en verwijderen

In het volgende voorbeeld wordt de tabel ContactBackupgemaakt en vervolgens de tabel gewijzigd door eerst een FOREIGN KEY beperking toe te voegen die verwijst naar de tabel Person.Personen vervolgens door de FOREIGN KEY beperking te verwijderen.

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;

Een kolomdefinitie wijzigen

A. Het gegevenstype van een kolom wijzigen

In het volgende voorbeeld wordt een kolom van een tabel gewijzigd van INT in 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. De grootte van een kolom wijzigen

In het volgende voorbeeld wordt de grootte van een varchar kolom en de precisie en schaal van een decimale kolom vergroot. Omdat de kolommen gegevens bevatten, kan de kolomgrootte alleen worden verhoogd. U ziet ook dat col_a is gedefinieerd in een unieke index. De grootte kan col_a nog steeds worden verhoogd omdat het gegevenstype een varchar is en de index niet het resultaat is van een PRIMARY KEY beperking.

-- 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. Kolomsortering wijzigen

In het volgende voorbeeld ziet u hoe u de sortering van een kolom kunt wijzigen. Eerst wordt er een tabel gemaakt met de standaardsortering van gebruikers.

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

Vervolgens wordt C2 sortering gewijzigd in Latin1_General_BIN. Het gegevenstype is vereist, ook al is het niet gewijzigd.

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

D. Een kolom versleutelen

In het volgende voorbeeld ziet u hoe u een kolom versleutelt met behulp van Always Encrypted met beveiligde enclaves.

Eerst wordt er een tabel gemaakt zonder versleutelde kolommen.

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

Vervolgens wordt kolom C2 versleuteld met een kolomversleutelingssleutel, met de naam CEK1en gerandomiseerde versleuteling. De volgende instructie slaagt:

  • De kolomversleutelingssleutel moet enclave zijn ingeschakeld. Dit betekent dat het moet worden versleuteld met een kolomhoofdsleutel (CMK) die enclaveberekeningen toestaat.
  • Het doel-SQL Server-exemplaar moet Always Encrypted ondersteunen met beveiligde enclaves.
  • De instructie moet worden uitgegeven via een verbinding die is ingesteld voor Always Encrypted met beveiligde enclaves en met behulp van een ondersteund clientstuurprogramma.
  • De aanroepende toepassing moet toegang hebben tot de CMK, beveiliging 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

Een tabeldefinitie wijzigen

In de voorbeelden in deze sectie ziet u hoe u de definitie van een tabel kunt wijzigen.

A. Een tabel wijzigen om de compressie te wijzigen

In het volgende voorbeeld wordt de compressie van een niet-gepartitioneerde tabel gewijzigd. De heap- of geclusterde index wordt opnieuw opgebouwd. Als de tabel een heap is, worden alle niet-geclusterde indexen opnieuw opgebouwd.

ALTER TABLE T1 REBUILD
    WITH (DATA_COMPRESSION = PAGE);

In het volgende voorbeeld wordt de compressie van een gepartitioneerde tabel gewijzigd. De REBUILD PARTITION = 1 syntaxis zorgt ervoor dat alleen partitienummer 1 opnieuw worden opgebouwd.

Van toepassing op: SQL Server.

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

Dezelfde bewerking met behulp van de volgende alternatieve syntaxis zorgt ervoor dat alle partities in de tabel opnieuw worden opgebouwd.

Van toepassing op: SQL Server.

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

Zie Gegevenscompressie voor meer voorbeelden van gegevenscompressie.

B. Een columnstore-tabel wijzigen om archiveringscompressie te wijzigen

In het volgende voorbeeld wordt een columnstore-tabelpartitie verder gecomprimeerd door een extra compressie-algoritme toe te passen. Deze compressie vermindert de tabel tot een kleinere grootte, maar verhoogt ook de tijd die nodig is voor opslag en ophalen. Dit is handig voor archivering of voor situaties die minder ruimte nodig hebben en meer tijd kunnen veroorloven voor opslag en ophalen.

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

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

In het volgende voorbeeld wordt een columnstore-tabelpartitie gedecomprimeerd die met de optie is gecomprimeerd COLUMNSTORE_ARCHIVE . Wanneer de gegevens worden hersteld, worden deze gecomprimeerd met de columnstore-compressie die wordt gebruikt voor alle columnstore-tabellen.

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure SQL Database.

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

C. Schakelen tussen partities tussen tabellen

In het volgende voorbeeld wordt een gepartitioneerde tabel gemaakt, ervan uitgaande dat het partitieschema myRangePS1 al in de database is gemaakt. Vervolgens wordt een niet-gepartitioneerde tabel gemaakt met dezelfde structuur als de gepartitioneerde tabel en op dezelfde bestandsgroep als PARTITION 2 van tabel PartitionTable. De gegevens van PARTITION 2 tabel PartitionTable worden vervolgens omgezet in tabel 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. Escalatie van vergrendeling op gepartitioneerde tabellen toestaan

In het volgende voorbeeld wordt escalatie van vergrendelingen naar het partitieniveau in een gepartitioneerde tabel mogelijk. Als de tabel niet is gepartitioneerd, wordt escalatie van vergrendeling ingesteld op het TABLE niveau.

Van toepassing op: SQL Server en Azure SQL Database.

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

E. Wijzigingen bijhouden in een tabel configureren

In het volgende voorbeeld kunt u wijzigingen bijhouden in de Person.Person tabel.

Van toepassing op: SQL Server en Azure SQL Database.

USE AdventureWorks2022;

ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;

In het volgende voorbeeld wordt het bijhouden van wijzigingen ingeschakeld en wordt het bijhouden van de kolommen ingeschakeld die tijdens een wijziging worden bijgewerkt.

Van toepassing op: SQL Server.

USE AdventureWorks2022;
GO

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

In het volgende voorbeeld wordt het bijhouden van wijzigingen in de Person.Person tabel uitgeschakeld.

Van toepassing op: SQL Server en Azure SQL Database.

USE AdventureWorks2022;
GO

ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;

Beperkingen en triggers uitschakelen en inschakelen

A. Een beperking uitschakelen en opnieuw inschakelen

In het volgende voorbeeld wordt een beperking uitgeschakeld waarmee de salarissen die in de gegevens worden geaccepteerd, worden beperkt. NOCHECK CONSTRAINT wordt gebruikt met ALTER TABLE om de beperking uit te schakelen en een invoeging toe te staan die doorgaans de beperking schendt. CHECK CONSTRAINT de beperking opnieuw inschakelt.

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 fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);

B. Een trigger uitschakelen en opnieuw inschakelen

In het volgende voorbeeld wordt de optie DISABLE TRIGGER van ALTER TABLE gebruikt om de trigger uit te schakelen en een invoeging toe te staan die doorgaans de trigger schendt. ENABLE TRIGGER wordt vervolgens gebruikt om de trigger opnieuw in te schakelen.

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

Onlinebewerkingen

A. Online index herbouwen met wachtopties met lage prioriteit

In het volgende voorbeeld ziet u hoe u een online index opnieuw opbouwt die de wachtopties met lage prioriteit aangeeft.

Van toepassing op: SQL Server 2014 (12.x) en latere versies en Azure 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. Online kolom wijzigen

In het volgende voorbeeld ziet u hoe u een bewerking voor een wijzigingskolom uitvoert met de ONLINE optie.

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure 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

EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO

Systeemversiebeheer

De volgende vier voorbeelden helpen u vertrouwd te raken met de syntaxis voor het gebruik van systeemversiebeheer. Zie Aan de slag met tijdelijke tabellen met systeemversies voor meer hulp.

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.

A. Systeemversiebeheer toevoegen aan bestaande tabellen

In het volgende voorbeeld ziet u hoe u systeemversiebeheer toevoegt aan een bestaande tabel en een toekomstige geschiedenistabel maakt. In dit voorbeeld wordt ervan uitgegaan dat er een bestaande tabel met de naam InsurancePolicy met een primaire sleutel is gedefinieerd. In dit voorbeeld worden de zojuist gemaakte periodekolommen voor systeemversiebeheer ingevuld met behulp van standaardwaarden voor de begin- en eindtijd, omdat deze waarden niet null kunnen zijn. In dit voorbeeld wordt de HIDDEN component gebruikt om ervoor te zorgen dat bestaande toepassingen geen invloed hebben op de huidige tabel. Het maakt ook gebruik van dat alleen HISTORY_RETENTION_PERIOD beschikbaar is voor SQL Database.

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

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

B. Een bestaande oplossing migreren om systeemversiebeheer te gebruiken

In het volgende voorbeeld ziet u hoe u migreert naar systeemversiebeheer vanuit een oplossing die triggers gebruikt om tijdelijke ondersteuning na te bootsen. In het voorbeeld wordt ervan uitgegaan dat er een bestaande oplossing is die gebruikmaakt van een ProjectTask tabel en een ProjectTaskHistory tabel voor de bestaande oplossing, die gebruikmaakt van de en Revised Date kolommen voor de Changed Date perioden, dat deze periodekolommen geen datum/tijd2-gegevenstype gebruiken en dat de ProjectTask tabel een primaire sleutel heeft gedefinieerd.

-- 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. Systeemversiebeheer uitschakelen en opnieuw inschakelen om het tabelschema te wijzigen

In dit voorbeeld ziet u hoe u systeemversiebeheer uitschakelt in de Department tabel, een kolom toevoegt en systeemversiebeheer opnieuw inschakelt. Het uitschakelen van systeemversiebeheer is vereist om het tabelschema te wijzigen. Voer deze stappen binnen een transactie uit om te voorkomen dat beide tabellen worden bijgewerkt tijdens het bijwerken van het tabelschema, waardoor de DBA de controle van gegevensconsistentie kan overslaan bij het opnieuw inschakelen van systeemversies en een prestatievoordeel krijgt. Voor taken zoals het maken van statistieken, het schakelen tussen partities of het toepassen van compressie op een of beide tabellen is het uitschakelen van systeemversiebeheer niet vereist.

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. Systeemversiebeheer verwijderen

In dit voorbeeld ziet u hoe u systeemversiebeheer volledig verwijdert uit de tabel Afdeling en de DepartmentHistory tabel verwijdert. Desgewenst wilt u ook de periodekolommen die door het systeem worden gebruikt, verwijderen om informatie over systeemversiebeheer vast te leggen. U kunt de Department of de DepartmentHistory tabellen niet verwijderen terwijl systeemversiebeheer is ingeschakeld.

ALTER TABLE Department
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE Department
    DROP PERIOD FOR SYSTEM_TIME;

DROP TABLE DepartmentHistory;

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

In de volgende voorbeelden A tot en met C wordt de FactResellerSales tabel in de AdventureWorksPDW2022-database gebruikt.

A. Bepalen of een tabel is gepartitioneerd

De volgende query retourneert een of meer rijen als de tabel FactResellerSales is gepartitioneerd. Als de tabel niet is gepartitioneerd, worden er geen rijen geretourneerd.

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

B. Grenswaarden voor een gepartitioneerde tabel bepalen

De volgende query retourneert de grenswaarden voor elke partitie in de FactResellerSales tabel.

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
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.partitions AS p
         ON i.object_id = p.object_id
        AND i.index_id = p.index_id
     INNER JOIN sys.partition_schemes AS s
         ON i.data_space_id = s.data_space_id
     INNER JOIN sys.partition_functions AS f
         ON s.function_id = f.function_id
     LEFT OUTER 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. De partitiekolom voor een gepartitioneerde tabel bepalen

De volgende query retourneert de naam van de partitioneringskolom voor de FactResellerSales tabel.

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
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.columns AS c
         ON t.object_id = c.object_id
     INNER JOIN sys.partition_schemes AS ps
         ON ps.data_space_id = i.data_space_id
     INNER 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. Twee partities samenvoegen

In het volgende voorbeeld worden twee partities in een tabel samengevoegd.

De tabel Customer heeft de volgende definitie:

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

Met de volgende opdracht worden de partitiegrenzen van 10 en 25 gecombineerd.

ALTER TABLE Customer MERGE RANGE (10);

De nieuwe DDL voor de tabel 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. Een partitie splitsen

In het volgende voorbeeld wordt een partitie gesplitst in een tabel.

De Customer tabel heeft de volgende 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)
    )
);

Met de volgende opdracht maakt u een nieuwe partitie die afhankelijk is van de waarde 75, tussen 50 en 100.

ALTER TABLE Customer SPLIT RANGE (75);

De nieuwe DDL voor de tabel 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. Schakeloptie gebruiken om een partitie naar een geschiedenistabel te verplaatsen

In het volgende voorbeeld worden de gegevens in een partitie van de Orders tabel verplaatst naar een partitie in de OrdersHistory tabel.

De Orders tabel heeft de volgende 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 dit voorbeeld bevat de Orders tabel de volgende partities. Elke partitie bevat gegevens.

Partition Heeft u gegevens? Grensbereik
1 Yes OrderDate < '2004-01-01'
2 Yes '2004-01-01' <= OrderDate < '2005-01-01'
3 Yes '2005-01-01' <= OrderDate< '2006-01-01'
4 Yes '2006-01-01'<= OrderDate < '2007-01-01'
5 Yes '2007-01-01' <= OrderDate
  • Partitie 1 (bevat gegevens): OrderDate < '2004-01-01'
  • Partitie 2 (bevat gegevens): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partitie 3 (bevat gegevens): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partitie 4 (bevat gegevens): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partitie 5 (bevat gegevens): '2007-01-01' <= OrderDate

De OrdersHistory tabel heeft de volgende DDL, die identieke kolommen en kolomnamen heeft als de Orders tabel. Beide zijn hash-gedistribueerd op de kolom id.

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

Hoewel de kolommen en kolomnamen hetzelfde moeten zijn, hoeven de partitiegrenzen niet hetzelfde te zijn. In dit voorbeeld bevat de OrdersHistory tabel de volgende twee partities en beide partities zijn leeg:

  • Partitie 1 (geen gegevens): OrderDate < '2004-01-01'
  • Partitie 2 (leeg): '2004-01-01' <= OrderDate

Voor de vorige twee tabellen verplaatst de volgende opdracht alle rijen met OrderDate < '2004-01-01' van de Orders tabel naar de OrdersHistory tabel.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;

Als gevolg hiervan is de eerste partitie in Orders leeg en bevat de eerste partitie in OrdersHistory gegevens. De tabellen worden nu als volgt weergegeven:

Orders tabel

  • Partitie 1 (leeg): OrderDate < '2004-01-01'
  • Partitie 2 (bevat gegevens): '2004-01-01' <= OrderDate < '2005-01-01'
  • Partitie 3 (bevat gegevens): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partitie 4 (bevat gegevens): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partitie 5 (bevat gegevens): '2007-01-01' <= OrderDate

OrdersHistory tabel

  • Partitie 1 (bevat gegevens): OrderDate < '2004-01-01'
  • Partitie 2 (leeg): '2004-01-01' <= OrderDate

Als u de Orders tabel wilt opschonen, kunt u de lege partitie verwijderen door partities samen te 1 voegen en 2 als volgt:

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

Na de samenvoegbewerking heeft de Orders tabel de volgende partities:

Orders tabel

  • Partitie 1 (bevat gegevens): OrderDate < '2005-01-01'
  • Partitie 2 (bevat gegevens): '2005-01-01' <= OrderDate< '2006-01-01'
  • Partitie 3 (bevat gegevens): '2006-01-01'<= OrderDate < '2007-01-01'
  • Partitie 4 (bevat gegevens): '2007-01-01' <= OrderDate

Stel dat een ander jaar voorbij is en u klaar bent om het jaar 2005 te archiveren. U kunt een lege partitie toewijzen voor het jaar 2005 in de OrdersHistory tabel door de lege partitie als volgt te splitsen:

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

Na de splitsing heeft de OrdersHistory tabel de volgende partities:

OrdersHistory tabel

  • Partitie 1 (bevat gegevens): OrderDate < '2004-01-01'
  • Partitie 2 (leeg): '2004-01-01' < '2005-01-01'
  • Partitie 3 (leeg): '2005-01-01' <= OrderDate