Delen via


CREATE TABLE (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Hiermee maakt u een nieuwe tabel in de database.

Notitie

Ga naar CREATE TABLE (Fabric Data Warehouse)voor naslaginformatie over Warehouse in Microsoft Fabric. Als u wilt verwijzen naar Azure Synapse Analytics and Analytics Platform System (PDW), gaat u naar CREATE TABLE (Azure Synapse Analytics).

Transact-SQL syntaxisconventies

Syntaxisopties

Algemene syntaxis

Eenvoudige CREATE TABLE-syntaxis (algemeen als u geen opties gebruikt):

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition> } [ ,... n ] )
[ ; ]

Volledige syntaxis

Syntaxis voor CREATE TABLE op basis van schijf:

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ AS FileTable ]
    ( { <column_definition>
        | <computed_column_definition>
        | <column_set_definition>
        | [ <table_constraint> ] [ ,... n ]
        | [ <table_index> ] }
          [ ,... n ]
          [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
             , system_end_time_column_name ) ]
      )
    [ ON { partition_scheme_name ( partition_column_name )
           | filegroup
           | "default" } ]
    [ TEXTIMAGE_ON { filegroup | "default" } ]
    [ FILESTREAM_ON { partition_scheme_name
           | filegroup
           | "default" } ]
    [ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ]
    [ SPARSE ]
    [ MASKED WITH ( FUNCTION = 'mask_function' ) ]
    [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
    [ IDENTITY [ ( seed , increment ) ] ]
    [ NOT FOR REPLICATION ]
    [ GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] ]
    [ [ CONSTRAINT constraint_name ] {NULL | NOT NULL} ]
    [ ROWGUIDCOL ]
    [ ENCRYPTED WITH
        ( COLUMN_ENCRYPTION_KEY = key_name ,
          ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,
          ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ) ]
    [ <column_constraint> [ ,... n ] ]
    [ <column_index> ]

<data_type> ::=
[ type_schema_name. ] type_name
    [ ( precision [ , scale ] | max |
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]

<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ ( <column_name> [ ,... n ] ) ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ ,... n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
            | filegroup | "default" } ]

  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]

  | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}

<column_index> ::=
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ ,... n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
        | filegroup | "default" } ]

    | [ FOREIGN KEY ]
        REFERENCES referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE } ]
        [ ON UPDATE { NO ACTION } ]
        [ NOT FOR REPLICATION ]

    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]

<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        ( column_name [ ASC | DESC ] [ ,... n ] )
        [
            WITH FILLFACTOR = fillfactor
           | WITH ( <index_option> [ ,... n ] )
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ]
    | FOREIGN KEY
        ( column_name [ ,... n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}

<table_index> ::=
{
    {
      INDEX index_name [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
         ( column_name [ ASC | DESC ] [ ,... n ] )
    | INDEX index_name CLUSTERED COLUMNSTORE [ ORDER (column_name [ , ...n ] ) ]
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
    }
    [ INCLUDE ( column_name [ ,... n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}

<table_option> ::=
{
    [ DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ] ]
    [ XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ] ]
    [ FILETABLE_DIRECTORY = <directory_name> ]
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ SYSTEM_VERSIONING = ON
        [ ( HISTORY_TABLE = schema_name.history_table_name
          [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]
    ) ]
    ]
    [ REMOTE_DATA_ARCHIVE =
      {
        ON [ ( <table_stretch_options> [ ,... n] ) ]
        | OFF ( MIGRATION_STATE = PAUSED )
      }
    ]
    [ DATA_DELETION = ON
          { (
             FILTER_COLUMN = column_name,
             RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
                              | MONTH | MONTHS | YEAR | YEARS } }
        ) }
    ]
    [ LEDGER = ON [ ( <ledger_option> [ ,... n ] ) ]
    | OFF
    ]
}

<ledger_option>::=
{
    [ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ] ]
    [ APPEND_ONLY = ON | OFF ]
}

<ledger_view_option>::=
{
    [ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
    [ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
    [ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
    [ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
}

<table_stretch_options> ::=
{
    [ FILTER_PREDICATE = { NULL | table_predicate_function } , ]
      MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
 }

<index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
  | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
       [ ON PARTITIONS ( { partition_number_expression | <range> }
       [ ,... n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ]
}

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Syntaxis voor tabellen die zijn geoptimaliseerd voor geheugen

Voor geheugen geoptimaliseerde CREATE TABLE-syntaxis:

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition>
    | [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ]
      [ ,... n ] }
      [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
        , system_end_time_column_name ) ]
)
    [ WITH ( <table_option> [ ,... n ] ) ]
 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
    [ NULL | NOT NULL ]
    [ [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
    | [ IDENTITY [ ( 1, 1 ) ] ]
    [ <column_constraint> ]
    [ <column_index> ]

<data_type> ::=
 [type_schema_name. ] type_name [ (precision [ , scale ]) ]

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

<table_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED ( column_name [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column_name [ ,... 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_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
  | [ NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [ Minutes ] } ) ]
      [ ON filegroup_name | default ]

}

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

}

Argumenten

database_name

De naam van de database waarin de tabel wordt gemaakt. database_name moet de naam van een bestaande database opgeven. Als dit niet is opgegeven, wordt database_name standaard ingesteld op de huidige database. De aanmelding voor de huidige verbinding moet zijn gekoppeld aan een bestaande gebruikers-id in de database die is opgegeven door database_nameen die gebruikers-id moet CREATE TABLE-machtigingen hebben.

schema_name

De naam van het schema waartoe de nieuwe tabel behoort.

table_name

De naam van de nieuwe tabel. Tabelnamen moeten de regels voor id'svolgen. table_name mag maximaal 128 tekens lang zijn, met uitzondering van lokale tijdelijke tabelnamen (namen die zijn voorafgegaan door één cijferteken (#)) die maximaal 116 tekens mogen bevatten.

AS FileTable

Van toepassing op: SQL Server 2012 (11.x) en hoger.

Hiermee maakt u de nieuwe tabel als een FileTable. U geeft geen kolommen op omdat een FileTable een vast schema heeft. Zie FileTablesvoor meer informatie.

COLUMN_NAME AS-computed_column_expression

Een expressie die de waarde van een berekende kolom definieert. Een berekende kolom is een virtuele kolom die niet fysiek is opgeslagen in de tabel, tenzij de kolom is gemarkeerd als PERSISTENTED. De kolom wordt berekend op basis van een expressie die gebruikmaakt van andere kolommen in dezelfde tabel. Een berekende kolom kan bijvoorbeeld de definitie hebben: cost AS price * qty. De expressie kan een niet-gecomputeerde kolomnaam, constante, functie, variabele en elke combinatie hiervan zijn die is verbonden door een of meer operators. De expressie kan geen subquery zijn of aliasgegevenstypen bevatten.

Berekende kolommen kunnen worden gebruikt in selecte lijsten, WHERE-componenten, ORDER BY-componenten of andere locaties waar reguliere expressies kunnen worden gebruikt, met de volgende uitzonderingen:

  • Berekende kolommen moeten worden gemarkeerd als PERSISTENTED om deel te nemen aan een BEPERKING REFERERENDE SLEUTEL of CHECK.

  • Een berekende kolom kan worden gebruikt als een sleutelkolom in een index of als onderdeel van een primaire sleutel of unieke beperking, als de berekende kolomwaarde wordt gedefinieerd door een deterministische expressie en het gegevenstype van het resultaat is toegestaan in indexkolommen.

    Als de tabel bijvoorbeeld kolommen met gehele getallen a en bbevat, kan de berekende kolom a + b worden geïndexeerd, maar kan de berekende kolom a + DATEPART(dd, GETDATE()) niet worden geïndexeerd omdat de waarde in volgende aanroepen kan veranderen.

  • Een berekende kolom kan niet het doel zijn van een INSERT- of UPDATE-instructie.

Notitie

Elke rij in een tabel kan verschillende waarden hebben voor kolommen die betrokken zijn bij een berekende kolom; Daarom heeft de berekende kolom mogelijk niet dezelfde waarde voor elke rij.

Op basis van de gebruikte expressies wordt de null-waarde van berekende kolommen automatisch bepaald door de database-engine. Het resultaat van de meeste expressies wordt beschouwd als null-baar, zelfs als er alleen niet-inullable kolommen aanwezig zijn, omdat mogelijke onderloop- of overloop ook NULL-resultaten opleveren. Gebruik de functie COLUMNPROPERTY met de eigenschap AllowsNull om de null-waarde van een berekende kolom in een tabel te onderzoeken. Een expressie die nullable is, kan worden omgezet in een niet-inullable expressie door ISNULL op te geven met de check_expression constante, waarbij de constante een niet-ullige waarde is die wordt vervangen door een NULL-resultaat. DE MACHTIGING VERWIJZINGEN voor het type is vereist voor berekende kolommen op basis van door de gebruiker gedefinieerde typeexpressies (Common Language Runtime) van CLR.

PERSISTENT

Hiermee geeft u op dat de SQL Server Database Engine de berekende waarden fysiek opslaat in de tabel en de waarden bijwerkt wanneer andere kolommen waarvan de berekende kolom afhankelijk is, worden bijgewerkt. Als u een berekende kolom markeert als PERSISTED kunt u een index maken op een berekende kolom die deterministisch is, maar niet nauwkeurig. Zie Indexen voor berekende kolommenvoor meer informatie. Berekende kolommen die worden gebruikt als partitioneringskolommen van een gepartitioneerde tabel, moeten expliciet worden gemarkeerd PERSISTED. computed_column_expression moet deterministisch zijn wanneer PERSISTED is opgegeven.

ON { partition_scheme | bestandsgroep | "standaard" }

Hiermee geeft u het partitieschema of de bestandsgroep op waarop de tabel is opgeslagen. Als partition_scheme is opgegeven, moet de tabel een gepartitioneerde tabel zijn waarvan de partities worden opgeslagen op een set van een of meer bestandsgroepen die zijn opgegeven in partition_scheme. Als bestandsgroep is opgegeven, wordt de tabel opgeslagen in de benoemde bestandsgroep. De bestandsgroep moet bestaan in de database. Als "default" is opgegeven of als ON helemaal niet is opgegeven, wordt de tabel opgeslagen in de standaardbestandsgroep. Het opslagmechanisme van een tabel zoals opgegeven in CREATE TABLE kan vervolgens niet worden gewijzigd.

ON { partition_scheme | bestandsgroep | 'standaard' } kan ook worden opgegeven in een PRIMAIRE SLEUTEL of EEN UNIEKE beperking. Met deze beperkingen worden indexen gemaakt. Als bestandsgroep is opgegeven, wordt de index opgeslagen in de benoemde bestandsgroep. Als "default" is opgegeven of als ON helemaal niet is opgegeven, wordt de index opgeslagen in dezelfde bestandsgroep als de tabel. Als met de beperking PRIMAIRE SLEUTEL of UNIEK een geclusterde index wordt gemaakt, worden de gegevenspagina's voor de tabel opgeslagen in dezelfde bestandsgroep als de index. Als CLUSTERED is opgegeven of als de beperking anders een geclusterde index maakt en een partition_scheme wordt opgegeven die verschilt van de partition_scheme of bestandsgroep van de tabeldefinitie, of omgekeerd, wordt alleen de beperkingsdefinitie uitgevoerd en wordt de andere genegeerd.

Notitie

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

Nadat u een gepartitioneerde tabel hebt gemaakt, kunt u de optie LOCK_ESCALATION voor de tabel instellen op AUTO. Dit kan de gelijktijdigheid verbeteren door vergrendelingen in te schakelen om te escaleren naar partitieniveau (HoBT) in plaats van de tabel. Zie ALTER TABLEvoor meer informatie.

TEXTIMAGE_ON { bestandsgroep | "standaard" }

Geeft aan dat de tekst, ntext, afbeelding, xml-, varchar(max), nvarchar(max), varbinary(max)en CLR door de gebruiker gedefinieerde kolommen (inclusief geometrie en geografie) worden opgeslagen in de opgegeven bestandsgroep.

TEXTIMAGE_ON is niet toegestaan als er geen kolommen met een grote waarde in de tabel staan. TEXTIMAGE_ON kan niet worden opgegeven als partition_scheme is opgegeven. Als "default" is opgegeven of als TEXTIMAGE_ON helemaal niet is opgegeven, worden de kolommen met grote waarden opgeslagen in de standaardbestandsgroep. De opslag van kolomgegevens van grote waarden die zijn opgegeven in CREATE TABLE kunnen vervolgens niet worden gewijzigd.

Notitie

varchar(max), nvarchar(max), varbinary(max), xml- en grote UDT-waarden worden rechtstreeks in de gegevensrij opgeslagen, tot een limiet van 8000 bytes en zolang de waarde aan de record kan voldoen. Als de waarde niet in de record past, wordt een aanwijzer opgeslagen in de rij en wordt de rest uit de rij opgeslagen in de LOB-opslagruimte. 0 is de standaardwaarde, die aangeeft dat alle waarden rechtstreeks in de gegevensrij worden opgeslagen.

TEXTIMAGE_ON alleen de locatie van de LOB-opslagruimte wijzigt, heeft dit geen invloed op het moment dat gegevens in rij worden opgeslagen. Gebruik de optie voor grote waarden buiten rij van sp_tableoption om de hele LOB-waarde uit de rij op te slaan.

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

FILESTREAM_ON { partition_scheme_name | bestandsgroep | "standaard" }

van toepassing op: SQL Server 2008 R2 (10.50.x) en hoger. Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILESTREAM.

Hiermee geeft u de bestandsgroep voor FILESTREAM-gegevens.

Als de tabel FILESTREAM-gegevens bevat en de tabel is gepartitioneerd, moet de FILESTREAM_ON component worden opgenomen en moet u een partitieschema van FILESTREAM-bestandsgroepen opgeven. Dit partitieschema moet dezelfde partitiefunctie en partitiekolommen gebruiken als het partitieschema voor de tabel; anders wordt er een fout gegenereerd.

Als de tabel niet is gepartitioneerd, kan de FILESTREAM-kolom niet worden gepartitioneerd. FILESTREAM-gegevens voor de tabel moeten worden opgeslagen in één bestandsgroep. Deze bestandsgroep wordt opgegeven in de FILESTREAM_ON component.

Als de tabel niet is gepartitioneerd en de FILESTREAM_ON component niet is opgegeven, wordt de FILESTREAM-bestandsgroep met de DEFAULT eigenschappenset gebruikt. Als er geen FILESTREAM-bestandsgroep is, wordt er een fout gegenereerd.

Net als bij ON en TEXTIMAGE_ONkan de waarde die is ingesteld met behulp van CREATE TABLE voor FILESTREAM_ON niet worden gewijzigd, behalve in de volgende gevallen:

  • Een CREATE INDEX instructie converteert een heap naar een geclusterde index. In dit geval kan een andere FILESTREAM-bestandsgroep, partitieschema of NULL worden opgegeven.
  • Een DROP INDEX instructie converteert een geclusterde index naar een heap. In dit geval kan een andere FILESTREAM-bestandsgroep, partitieschema of "default" worden opgegeven.

De bestandsgroep in de component FILESTREAM_ON <filegroup>, of elke FILESTREAM-bestandsgroep met de naam in het partitieschema, moet één bestand hebben gedefinieerd voor de bestandsgroep. Dit bestand moet worden gedefinieerd met behulp van een instructie CREATE DATABASE of ALTER DATABASE; anders wordt er een fout gegenereerd.

Zie Binary Large Object - Blob Datavoor gerelateerde FILESTREAM-artikelen.

[ type_schema_name. ] type_name

Hiermee geeft u het gegevenstype van de kolom en het schema waartoe deze behoort. Gebruik een van de volgende gegevenstypen voor tabellen op basis van schijven:

  • Een systeemgegevenstype
  • Een aliastype op basis van een gegevenstype van het SQL Server-systeem. Aliasgegevenstypen worden gemaakt met de CREATE TYPE instructie voordat ze kunnen worden gebruikt in een tabeldefinitie. De toewijzing NULL of NOT NULL voor een aliasgegevenstype kan tijdens de CREATE TABLE-instructie worden overschreven. De lengtespecificatie kan echter niet worden gewijzigd; de lengte voor een aliasgegevenstype kan niet worden opgegeven in een CREATE TABLE-instructie.
  • Een door de gebruiker gedefinieerde CLR-type. Door de gebruiker gedefinieerde CLR-typen worden gemaakt met de CREATE TYPE instructie voordat ze kunnen worden gebruikt in een tabeldefinitie. Als u een kolom wilt maken op het door de gebruiker gedefinieerde CLR-type, is de machtiging VERWIJZINGEN vereist voor het type.

Als type_schema_name niet is opgegeven, verwijst de SQL Server Database Engine naar type_name in de volgende volgorde:

  • Het gegevenstype van het SQL Server-systeem.
  • Het standaardschema van de huidige gebruiker in de huidige database.
  • Het dbo schema in de huidige database.

Zie Ondersteunde gegevenstypen voor In-Memory OLTP- voor een lijst met ondersteunde systeemtypen voor tabellen die zijn geoptimaliseerd voor geheugen.

  • precisie

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

  • schalen

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

  • maximum

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

TEVREDEN

Hiermee geeft u op dat elk exemplaar van het xml- gegevenstype in column_name meerdere elementen op het hoogste niveau kan bevatten. INHOUD is alleen van toepassing op het xml- gegevenstype en kan alleen worden opgegeven als xml_schema_collection ook is opgegeven. Als dit niet is opgegeven, is INHOUD het standaardgedrag.

DOCUMENT

Hiermee geeft u op dat elk exemplaar van het XML- gegevenstype in column_name slechts één element op het hoogste niveau kan bevatten. DOCUMENT is alleen van toepassing op het xml- gegevenstype en kan alleen worden opgegeven als xml_schema_collection ook is opgegeven.

xml_schema_collection

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

VERSTEK

Hiermee geeft u de opgegeven waarde voor de kolom op wanneer een waarde niet expliciet wordt opgegeven tijdens een invoeging. STANDAARDdefinities kunnen worden toegepast op kolommen, met uitzondering van kolommen die zijn gedefinieerd als tijdstempel, of op kolommen met de eigenschap IDENTITY. Als een standaardwaarde is opgegeven voor een door de gebruiker gedefinieerde kolom, moet het type een impliciete conversie van constant_expression naar het door de gebruiker gedefinieerde type ondersteunen. STANDAARDdefinities worden verwijderd wanneer de tabel wordt verwijderd. Alleen een constante waarde, zoals een tekenreeks; een scalaire functie (een systeem, door de gebruiker gedefinieerde of CLR-functie); of NULL kan als standaardwaarde worden gebruikt. Om compatibiliteit met eerdere versies van SQL Server te behouden, kan een beperkingsnaam worden toegewezen aan een STANDAARD.

  • constant_expression

    Een constante, NULL of een systeemfunctie die wordt gebruikt als de standaardwaarde voor de kolom.

  • memory_optimized_constant_expression

    Een constante, NULL of een systeemfunctie die wordt ondersteund als de standaardwaarde voor de kolom. Moet worden ondersteund in systeemeigen gecompileerde opgeslagen procedures. Zie Ondersteunde functies voor systeemeigen gecompileerde T-SQL-modulesvoor meer informatie over ingebouwde functies in systeemeigen gecompileerde opgeslagen procedures.

IDENTITEIT

Geeft aan dat de nieuwe kolom een identiteitskolom is. Wanneer er een nieuwe rij aan de tabel wordt toegevoegd, biedt de database-engine een unieke, incrementele waarde voor de kolom. Identiteitskolommen worden doorgaans gebruikt met primaire sleutelbeperkingen om te fungeren als de unieke rij-id voor de tabel. De eigenschap IDENTITY kan worden toegewezen aan kleineint, smallint, int, bigint, decimal(p, 0)of numerieke kolommen(p, 0). Er kan slechts één identiteitskolom per tabel worden gemaakt. Afhankelijke standaardwaarden en STANDAARDbeperkingen kunnen niet worden gebruikt met een identiteitskolom. Zowel het zaad als de verhoging of geen van beide moeten worden opgegeven. Als geen van beide is opgegeven, is de standaardwaarde (1,1).

  • zaad

    De waarde die wordt gebruikt voor de eerste rij die in de tabel is geladen.

  • incrementele

    De incrementele waarde die is toegevoegd aan de identiteitswaarde van de vorige rij die is geladen.

NIET VOOR REPLICATIE

In de CREATE TABLE-instructie kan de NOT FOR REPLICATION-component worden opgegeven voor de eigenschap IDENTITY, BEPERKINGEN VOOR REFERERENDE SLEUTELS en CHECK-beperkingen. Als deze component is opgegeven voor de eigenschap IDENTITY, worden waarden niet verhoogd in identiteitskolommen wanneer replicatieagenten invoegingen uitvoeren. Als deze component is opgegeven voor een beperking, wordt de beperking niet afgedwongen wanneer replicatieagenten invoeg-, update- of verwijderbewerkingen uitvoeren.

ALTIJD GEGENEREERD ALS { RIJ | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ VERBORGEN ] [ NIET NULL ]

is van toepassing op: SQL Server 2016 (13.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u een kolom op die door het systeem wordt gebruikt om automatisch informatie over rijversies in de tabel en de bijbehorende geschiedenistabel vast te leggen (als de tabel een systeemversie heeft en een geschiedenistabel heeft). Gebruik dit argument met de parameter WITH SYSTEM_VERSIONING = ON om tabellen met systeemversies te maken: tijdelijke tabellen of grootboektabellen. Zie bijwerkbare grootboektabellen en tijdelijke tabellenvoor meer informatie.

Parameter Vereist gegevenstype Vereiste null-waarde Beschrijving
ROEIEN datetime2 START: NOT NULL
EINDE: NOT NULL
De begintijd waarvoor een rijversie geldig is (START) of de eindtijd waarvoor een rijversie geldig is (END). Gebruik dit argument met het argument PERIOD FOR SYSTEM_TIME om een tijdelijke tabel te maken.
TRANSACTION_ID bigint START: NOT NULL
EINDE: NULL
van toepassing op: SQL Server 2022 (16.x) en hoger en Azure SQL Database.

De id van de transactie die een rijversie maakt (START) of ongeldig maakt (END). Als de tabel een grootboektabel is, verwijst de id naar een rij in de weergave sys.database_ledger_transactions
SEQUENCE_NUMBER bigint START: NOT NULL
EINDE: NULL
van toepassing op: SQL Server 2022 (16.x) en hoger en Azure SQL Database.

Het volgnummer van een bewerking die een rijversie maakt (START) of verwijdert (END). Deze waarde is uniek binnen de transactie.

Als u probeert een kolom op te geven die niet voldoet aan het bovenstaande gegevenstype of de vereisten voor null-functionaliteit, genereert het systeem een fout. Als u niet expliciet null-functionaliteit opgeeft, definieert het systeem de kolom als NULL of NOT NULL volgens de bovenstaande vereisten.

U kunt een of beide puntkolommen markeren met HIDDEN vlag om deze kolommen impliciet te verbergen, zodat SELECT * FROM <table> geen waarde retourneert voor die kolommen. 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. Als u het kenmerk HIDDEN voor een bestaande periodekolom wilt wijzigen, moet PERIOD worden verwijderd en opnieuw worden gemaakt met een andere verborgen vlag.

INDEX index_name [ GECLUSTERD | NIET-GECLUSTERD ] ( column_name [ ASC | DESC ] [ ,... n ] )

van toepassing op: SQL Server 2014 (12.x) en hoger en Azure SQL Database.

Hiermee geeft u een index voor de tabel te maken. Dit kan een geclusterde index of een niet-geclusterde index zijn. De index bevat de vermelde kolommen en sorteert de gegevens in oplopende of aflopende volgorde.

INDEX index_name CLUSTERED COLUMNSTORE

van toepassing op: SQL Server 2014 (12.x) en hoger en Azure SQL Database.

Hiermee geeft u de hele tabel op in kolomindeling met een geclusterde columnstore-index. Dit omvat altijd alle kolommen in de tabel. De gegevens worden niet gesorteerd in alfabetische of numerieke volgorde, omdat de rijen zijn ingedeeld om columnstore-compressievoordelen te verkrijgen.

U kunt een order opgeven voor de gegevens in een geclusterde columnstore-index vanaf SQL Server 2022 (16.x), in Azure SQL Database, in Azure SQL Managed Instance met de Always-up-to-date update policyen in Azure Synapse Analytics. Zie Prestaties afstemmen met geordende columnstore-indexenvoor meer informatie.

INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )

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

Hiermee geeft u een niet-geclusterde columnstore-index voor de tabel te maken. De onderliggende tabel kan een rijopslag-heap of geclusterde index zijn, of kan een geclusterde columnstore-index zijn. In alle gevallen slaat het maken van een niet-geclusterde columnstore-index in een tabel een tweede kopie van de gegevens voor de kolommen in de index op.

De niet-geclusterde columnstore-index wordt opgeslagen en beheerd als een geclusterde columnstore-index. Dit wordt een niet-geclusterde columnstore-index genoemd, omdat de kolommen kunnen worden beperkt en deze bestaan als een secundaire index in een tabel.

U kunt een order opgeven voor de gegevens in een niet-geclusterde columnstore-index in Azure SQL Database en in Azure SQL Managed Instance met het Always-up-to-date update policy. Zie Prestaties afstemmen met geordende columnstore-indexenvoor meer informatie.

ON partition_scheme_name ( column_name )

Hiermee geeft u het partitieschema op waarmee de bestandsgroepen worden gedefinieerd waarop de partities van een gepartitioneerde index worden toegewezen. Het partitieschema moet bestaan in de database door PARTITIESCHEMA maken of ALTER PARTITION SCHEMEuit te voeren. column_name geeft de kolom op waarmee een gepartitioneerde index wordt gepartitioneerd. Deze kolom moet overeenkomen met het gegevenstype, de lengte en de precisie van het argument van de partitiefunctie die partition_scheme_name gebruikt. column_name is niet beperkt tot de kolommen in de indexdefinitie. Elke kolom in de basistabel kan worden opgegeven, behalve wanneer u een UNIEKE index partitioneert, column_name moet worden gekozen uit de kolommen die worden gebruikt als de unieke sleutel. Met deze beperking kan de database-engine alleen de uniekheid van sleutelwaarden binnen één partitie verifiëren.

Notitie

Wanneer u een niet-unieke, geclusterde index partitioneert, voegt de database-engine standaard de partitioneringskolom toe aan de lijst met geclusterde indexsleutels, als deze nog niet is opgegeven. Bij het partitioneren van een niet-unieke, niet-geclusterde index voegt de database-engine de partitioneringskolom toe als een niet-sleutelkolom (opgenomen) van de index, als deze nog niet is opgegeven.

Als partition_scheme_name of bestandsgroep niet is opgegeven en de tabel is gepartitioneerd, wordt de index in hetzelfde partitieschema geplaatst met dezelfde partitiekolom als de onderliggende tabel.

Notitie

U kunt geen partitioneringsschema opgeven voor een XML-index. Als de basistabel is gepartitioneerd, gebruikt de XML-index hetzelfde partitieschema als de tabel.

Voor meer informatie over partitioneringsindexen Gepartitioneerde tabellen en indexen.

OP filegroup_name

Hiermee maakt u de opgegeven index voor de opgegeven bestandsgroep. Als er geen locatie is opgegeven en de tabel of weergave niet is gepartitioneerd, gebruikt de index dezelfde bestandsgroep als de onderliggende tabel of weergave. De bestandsgroep moet al bestaan.

AAN "standaard"

Hiermee maakt u de opgegeven index voor de standaardbestandsgroep.

Notitie

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

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

van toepassing op: SQL Server 2008 R2 (10.50.x) en hoger.

Hiermee geeft u de plaatsing van FILESTREAM-gegevens voor de tabel op wanneer een geclusterde index wordt gemaakt. Met de component FILESTREAM_ON kunnen FILESTREAM-gegevens worden verplaatst naar een andere FILESTREAM-bestandsgroep of partitieschema.

filestream_filegroup_name is de naam van een FILESTREAM-bestandsgroep. De bestandsgroep moet één bestand hebben gedefinieerd voor de bestandsgroep met behulp van een instructie CREATE DATABASE of ALTER DATABASE; anders wordt er een fout gegenereerd.

Als de tabel is gepartitioneerd, moet de component FILESTREAM_ON worden opgenomen en moet u een partitieschema opgeven van FILESTREAM-bestandsgroepen die dezelfde partitiefunctie en partitiekolommen gebruiken als het partitieschema voor de tabel. Anders wordt er een fout gegenereerd.

Als de tabel niet is gepartitioneerd, kan de FILESTREAM-kolom niet worden gepartitioneerd. FILESTREAM-gegevens voor de tabel moeten worden opgeslagen in één bestandsgroep die is opgegeven in de FILESTREAM_ON-component.

FILESTREAM_ON NULL kan worden opgegeven in een CREATE INDEX instructie als er een geclusterde index wordt gemaakt en de tabel geen FILESTREAM-kolom bevat.

Zie FILESTREAMvoor meer informatie.

ROWGUIDCOL

Geeft aan dat de nieuwe kolom een rij-GUID-kolom is. Slechts één uniqueidentifier kolom per tabel kan worden aangewezen als de kolom ROWGUIDCOL. Door de eigenschap ROWGUIDCOL toe te passen, kan naar de kolom worden verwezen met behulp van $ROWGUID. De eigenschap ROWGUIDCOL kan alleen worden toegewezen aan een kolom uniqueidentifier. Door de gebruiker gedefinieerde gegevenstypekolommen kunnen niet worden aangewezen met ROWGUIDCOL.

De eigenschap ROWGUIDCOL dwingt geen uniekheid af van de waarden die zijn opgeslagen in de kolom. ROWGUIDCOL genereert ook niet automatisch waarden voor nieuwe rijen die in de tabel zijn ingevoegd. Als u unieke waarden voor elke kolom wilt genereren, gebruikt u de functie NEWID of functie NEWSEQUENTIALID in INSERT instructies of gebruikt u deze functies als de standaardwaarde voor de kolom.

VERSLEUTELD MET

Hiermee geeft u het versleutelen van kolommen met behulp van de functie Always Encrypted.

  • COLUMN_ENCRYPTION_KEY = key_name

    Hiermee geeft u de kolomversleutelingssleutel op. Zie CREATE COLUMN ENCRYPTION KEYvoor meer informatie.

  • ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED }

    deterministische versleuteling maakt gebruik van een methode die altijd dezelfde versleutelde waarde genereert voor een bepaalde tekst zonder opmaak. Met behulp van deterministische versleuteling kunt u zoeken met behulp van gelijkheidsvergelijking, groepering en samenvoegen van tabellen met behulp van gelijkheidsdeelnames op basis van versleutelde waarden, maar kan niet-gemachtigde gebruikers ook toestaan informatie over versleutelde waarden te raden door patronen in de versleutelde kolom te onderzoeken. Het samenvoegen van twee tabellen op kolommen die deterministisch zijn versleuteld, is alleen mogelijk als beide kolommen zijn versleuteld met dezelfde kolomversleutelingssleutel. Deterministische versleuteling moet een kolomsortering met een binaire2-sorteervolgorde voor tekenkolommen gebruiken.

    willekeurige versleuteling een methode gebruikt waarmee gegevens op een minder voorspelbare manier worden versleuteld. Gerandomiseerde versleuteling is veiliger, maar voorkomt berekeningen en indexering op versleutelde kolommen, tenzij uw SQL Server-exemplaar Always Encrypted ondersteunt met beveiligde enclaves. Zie Always Encrypted met beveiligde enclaves voor meer informatie.

    Als u Always Encrypted gebruikt (zonder beveiligde enclaves), gebruikt u deterministische versleuteling voor kolommen die worden doorzocht met parameters of groeperingsparameters, bijvoorbeeld een overheids-id-nummer. Gebruik gerandomiseerde versleuteling voor gegevens zoals een creditcardnummer, dat niet is gegroepeerd met andere records of wordt gebruikt om tabellen samen te voegen en waarnaar niet wordt gezocht omdat u andere kolommen (zoals een transactienummer) gebruikt om de rij te vinden die de versleutelde kolom van belang bevat.

    Als u Always Encrypted gebruikt met beveiligde enclaves, is willekeurige versleuteling een aanbevolen versleutelingstype.

    Kolommen moeten van een in aanmerking komend gegevenstype zijn.

  • ALGORITME

    Van toepassing op: SQL Server 2016 (13.x) en hoger.

    Moet 'AEAD_AES_256_CBC_HMAC_SHA_256'zijn.

    Zie Always Encryptedvoor meer informatie over functiebeperkingen.

SCHAARS

Geeft aan dat de kolom een sparse-kolom is. De opslag van sparsekolommen is geoptimaliseerd voor null-waarden. Sparse-kolommen kunnen niet worden aangewezen als NOT NULL. Zie Sparse-kolommen gebruikenvoor aanvullende beperkingen en meer informatie over sparsekolommen.

GEMASKEERD MET (FUNCTION = 'mask_function' )

Van toepassing op: SQL Server 2016 (13.x) en hoger.

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

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

Hiervoor is ALTER ANY MASK machtiging vereist.

Zie Dynamische gegevensmaskeringvoor functieparameters.

FILESTREAM

van toepassing op: SQL Server 2008 R2 (10.50.x) en hoger.

Alleen geldig voor varbinary(max) kolommen. Hiermee geeft u FILESTREAM-opslag op voor de varbinary(max) BLOB-gegevens.

De tabel moet ook een kolom hebben van de uniqueidentifier gegevenstype met het kenmerk ROWGUIDCOL. Deze kolom mag geen null-waarden toestaan en moet een beperking VOOR UNIEKE of PRIMAIRE SLEUTEL met één kolom hebben. De GUID-waarde voor de kolom moet worden opgegeven door een toepassing bij het invoegen van gegevens of door een STANDAARDbeperking die gebruikmaakt van de functie NEWID ().

De kolom ROWGUIDCOL kan niet worden verwijderd en de gerelateerde beperkingen kunnen niet worden gewijzigd terwijl er een FILESTREAM-kolom is gedefinieerd voor de tabel. De kolom ROWGUIDCOL kan alleen worden verwijderd nadat de laatste FILESTREAM-kolom is verwijderd.

Wanneer het filestream-opslagkenmerk is opgegeven voor een kolom, worden alle waarden voor die kolom opgeslagen in een FILESTREAM-gegevenscontainer op het bestandssysteem.

COLLATION_NAME

Hiermee geeft u de sortering voor de kolom. De sorteringsnaam kan een Windows-sorteringsnaam of een SQL-sorteringsnaam zijn. collation_name is alleen van toepassing op kolommen van het teken, varchar, tekst, nchar, nvarcharen ntext gegevenstypen. Als deze niet is opgegeven, wordt de kolom toegewezen aan de sortering van het door de gebruiker gedefinieerde gegevenstype, als de kolom van een door de gebruiker gedefinieerd gegevenstype is of de standaardsortering van de database.

Zie Windows-sorteringsnaam en SQL-sorteringsnaamvoor meer informatie over de namen van Windows- en SQL-sortering.

Zie COLLATEvoor meer informatie.

BEPERKING

Een optioneel trefwoord dat het begin aangeeft van de definitie van een PRIMAIRE SLEUTEL, NIET NULL, UNIEK, REFERERENDE SLEUTEL of CHECK-beperking.

  • constraint_name

    De naam van een beperking. Namen van beperkingen moeten uniek zijn binnen het schema waartoe de tabel behoort.

  • NULL | NIET NULL

    Bepaal of null-waarden zijn toegestaan in de kolom. NULL is niet strikt een beperking, maar kan net als NIET NULL worden opgegeven. NOT NULL kan alleen worden opgegeven voor berekende kolommen als PERSISTENTED ook is opgegeven.

  • PRIMAIRE SLEUTEL

    Een beperking waarmee entiteitsintegriteit wordt afgedwongen voor een opgegeven kolom of kolommen via een unieke index. Er kan slechts één PRIMAIRE SLEUTELbeperking per tabel worden gemaakt.

  • UNIEK

    Een beperking die entiteitsintegriteit biedt voor een opgegeven kolom of kolommen via een unieke index. Een tabel kan meerdere UNIEKE beperkingen hebben.

  • GECLUSTERD | NIET-GECLUSTERD

    Geeft aan dat een geclusterde of niet-geclusterde index wordt gemaakt voor de beperking PRIMARY KEY of UNIQUE. PRIMAIRE-SLEUTELbeperkingen zijn standaard ingesteld op GECLUSTERD en UNIEKE beperkingen zijn standaard ingesteld op NIET-GECLUSTERD.

    In een CREATE TABLE-instructie kan CLUSTERED slechts voor één beperking worden opgegeven. Als CLUSTERED is opgegeven voor een UNIEKE beperking en er ook een BEPERKING PRIMAIRE SLEUTEL is opgegeven, wordt de PRIMAIRE SLEUTEL standaard ingesteld op NIET-GECLUSTERD.

  • VERWIJZINGEN NAAR REFERERENDE SLEUTELS

    Een beperking die referentiële integriteit biedt voor de gegevens in de kolom of kolommen. BEPERKINGEN VOOR REFERERENDE SLEUTELS vereisen dat elke waarde in de kolom bestaat in de bijbehorende kolom of kolommen waarnaar wordt verwezen in de tabel waarnaar wordt verwezen. BEPERKINGEN VAN REFERERENDE SLEUTELS kunnen alleen verwijzen naar kolommen die PRIMAIRE SLEUTEL of UNIEKE beperkingen zijn in de tabel waarnaar wordt verwezen of kolommen waarnaar wordt verwezen in een UNIEKE INDEX in de tabel waarnaar wordt verwezen. Refererende sleutels voor berekende kolommen moeten ook worden gemarkeerd als PERSISTENTED.

  • [ [ schema_name. ] referenced_table_name ]

    De naam van de tabel waarnaar wordt verwezen door de beperking REFERERENDE SLEUTEL en het schema waartoe deze behoort.

  • ( ref_column [ ,... n ] )

    Een kolom of lijst met kolommen uit de tabel waarnaar wordt verwezen door de beperking REFERERENDE SLEUTEL.

  • BIJ VERWIJDEREN { GEEN ACTIE | CASCADE | SET NULL | STANDAARD INSTELLEN }

    Hiermee geeft u op welke actie er gebeurt met rijen in de tabel die zijn gemaakt, als deze rijen een referentiële relatie hebben en de rij waarnaar wordt verwezen uit de bovenliggende tabel wordt verwijderd. De standaardwaarde is GEEN ACTIE.

  • GEEN ACTIE

    De database-engine genereert een fout en de verwijderactie op de rij in de bovenliggende tabel wordt teruggedraaid.

  • CASCADE

    Overeenkomende rijen worden verwijderd uit de verwijzende tabel als deze rij uit de bovenliggende tabel wordt verwijderd.

  • SET NULL

    Alle waarden waaruit de refererende sleutel bestaat, worden ingesteld op NULL als de bijbehorende rij in de bovenliggende tabel wordt verwijderd. Als u deze beperking wilt uitvoeren, moeten de kolommen met refererende sleutels null kunnen worden uitgevoerd.

  • STANDAARD INSTELLEN

    Alle waarden waaruit de refererende sleutel bestaat, worden ingesteld op de standaardwaarden wanneer de bijbehorende rij in de bovenliggende tabel wordt verwijderd. Om deze beperking uit te voeren, moeten alle kolommen met refererende sleutels standaarddefinities hebben. Als een kolom nullbaar is en er geen expliciete standaardwaarde is ingesteld, wordt NULL de impliciete standaardwaarde van de kolom.

    Geef geen CASCADE op als de tabel wordt opgenomen in een samenvoegpublicatie waarin logische records worden gebruikt. Zie Groepswijzigingen in gerelateerde rijen met logische recordsvoor meer informatie over logische records.

    ON DELETE CASCADE kan niet worden gedefinieerd als er al een INSTEAD OF trigger in de tabel bestaat ON DELETE.

    In de AdventureWorks2022-database heeft de ProductVendor tabel bijvoorbeeld een referentiële relatie met de Vendor tabel. De ProductVendor.BusinessEntityID refererende sleutel verwijst naar de Vendor.BusinessEntityID primaire sleutel.

    Als een DELETE instructie wordt uitgevoerd op een rij in de Vendor tabel en er een ON DELETE CASCADE actie wordt opgegeven voor ProductVendor.BusinessEntityID, controleert de database-engine op een of meer afhankelijke rijen in de ProductVendor tabel. Indien aanwezig, worden de afhankelijke rijen in de ProductVendor tabel verwijderd en ook de rij waarnaar wordt verwezen in de Vendor tabel.

    Als NO ACTION is opgegeven, genereert de database-engine daarentegen een fout en wordt de verwijderactie teruggedraaid op de Vendor rij als er ten minste één rij in de ProductVendor tabel waarnaar wordt verwezen.

  • BIJWERKEN { GEEN ACTIE | CASCADE | SET NULL | STANDAARD INSTELLEN }

    Hiermee geeft u op welke actie er gebeurt met rijen in de tabel die zijn gewijzigd wanneer deze rijen een referentiële relatie hebben en de rij waarnaar wordt verwezen, wordt bijgewerkt in de bovenliggende tabel. De standaardwaarde is GEEN ACTIE.

  • GEEN ACTIE

    De database-engine genereert een fout en de updateactie op de rij in de bovenliggende tabel wordt teruggedraaid.

  • CASCADE

    Overeenkomende rijen worden bijgewerkt in de verwijzende tabel wanneer die rij wordt bijgewerkt in de bovenliggende tabel.

  • SET NULL

    Alle waarden waaruit de refererende sleutel bestaat, worden ingesteld op NULL wanneer de bijbehorende rij in de bovenliggende tabel wordt bijgewerkt. Als u deze beperking wilt uitvoeren, moeten de kolommen met refererende sleutels null kunnen worden uitgevoerd.

  • STANDAARD INSTELLEN

    Alle waarden waaruit de refererende sleutel bestaat, worden ingesteld op de standaardwaarden wanneer de bijbehorende rij in de bovenliggende tabel wordt bijgewerkt. Om deze beperking uit te voeren, moeten alle kolommen met refererende sleutels standaarddefinities hebben. Als een kolom nullbaar is en er geen expliciete standaardwaarde is ingesteld, wordt NULL de impliciete standaardwaarde van de kolom.

    Geef geen CASCADE op als de tabel wordt opgenomen in een samenvoegpublicatie waarin logische records worden gebruikt. Zie Groepswijzigingen in gerelateerde rijen met logische recordsvoor meer informatie over logische records.

    ON UPDATE CASCADE, SET NULLof SET DEFAULT kunnen niet worden gedefinieerd als er al een INSTEAD OF trigger ON UPDATE bestaat in de tabel die wordt gewijzigd.

    In de AdventureWorks2022-database heeft de ProductVendor tabel bijvoorbeeld een referentiële relatie met de Vendor tabel: ProductVendor.BusinessEntity refererende sleutel verwijst naar de Vendor.BusinessEntityID primaire sleutel.

    Als een UPDATE-instructie wordt uitgevoerd op een rij in de Vendor tabel en er een ON UPDATE CASCADE-actie wordt opgegeven voor ProductVendor.BusinessEntityID, controleert de database-engine op een of meer afhankelijke rijen in de ProductVendor tabel. Indien aanwezig, worden de afhankelijke rijen in de ProductVendor tabel bijgewerkt en ook de rij waarnaar wordt verwezen in de Vendor tabel.

    Als er echter geen actie is opgegeven, genereert de database-engine een fout en wordt de updateactie teruggedraaid op de Vendor rij als er ten minste één rij in de ProductVendor tabel waarnaar wordt verwezen.

  • CHEQUE

    Een beperking waarmee domeinintegriteit wordt afgedwongen door de mogelijke waarden te beperken die kunnen worden ingevoerd in een kolom of kolommen. CHECK-beperkingen voor berekende kolommen moeten ook worden gemarkeerd als PERSISTENTED.

  • logical_expression

    Een logische expressie die WAAR of ONWAAR retourneert. Aliasgegevenstypen kunnen geen deel uitmaken van de expressie.

  • column_name

    Een kolom of lijst met kolommen, tussen haakjes, die worden gebruikt in tabelbeperkingen om de kolommen aan te geven die in de definitie van de beperking worden gebruikt.

  • [ ASC | DESC ]

    Hiermee geeft u de volgorde op waarin de kolom of kolommen die deelnemen aan tabelbeperkingen worden gesorteerd. De standaardwaarde is ASC.

  • partition_scheme_name

    De naam van het partitieschema waarmee de bestandsgroepen worden gedefinieerd waarop de partities van een gepartitioneerde tabel worden toegewezen. Het partitieschema moet bestaan in de database.

  • [ partition_column_name. ]

    Hiermee geeft u de kolom op waarmee een gepartitioneerde tabel wordt gepartitioneerd. De kolom moet overeenkomen met de kolom die is opgegeven in de partitiefunctie die partition_scheme_name gebruikt in termen van gegevenstype, lengte en precisie. Een berekende kolom die deelneemt aan een partitiefunctie, moet expliciet worden gemarkeerd als PERSISTENTED.

    Belangrijk

    We raden u aan NOT NULL op te geven in de partitioneringskolom van gepartitioneerde tabellen, en ook niet-gepartitioneerde tabellen die bronnen of doelen van ALTER TABLE zijn... SWITCH-bewerkingen. Dit zorgt ervoor dat alle CHECK-beperkingen voor het partitioneren van kolommen niet hoeven te controleren op null-waarden.

  • FILLFACTOR = fillfactor

    Hiermee geeft u op hoe vol de database-engine elke indexpagina moet maken die wordt gebruikt voor het opslaan van de indexgegevens. Door de gebruiker opgegeven fillfactor waarden kunnen tussen 1 en 100 zijn. Als er geen waarde is opgegeven, is de standaardwaarde 0. Vulfactorwaarden 0 en 100 zijn in alle opzichten hetzelfde.

    Belangrijk

    Documenteren MET FILLFACTOR = fillfactor als de enige indexoptie die van toepassing is op PRIMAIRE SLEUTEL of UNIEKE beperkingen wordt gehandhaafd voor achterwaartse compatibiliteit, maar wordt niet op deze manier gedocumenteerd in toekomstige releases.

COLUMN_SET_NAME XML-COLUMN_SET VOOR ALL_SPARSE_COLUMNS

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. Zie Kolomsets gebruikenvoor meer informatie over kolomsets.

PERIODE VOOR SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )

van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

Hiermee geeft u de namen op van de kolommen die door het systeem worden gebruikt om de periode vast te leggen waarvoor een record geldig is. Gebruik dit argument met de argumenten GENERATED ALWAYS AS ROW { START | END } en WITH SYSTEM_VERSIONING = ON om een tijdelijke tabel te maken. Zie Tijdelijke tabellenvoor meer informatie.

COMPRESSION_DELAY

van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

Voor een geoptimaliseerd geheugen geeft vertraging het minimum aantal minuten aan dat een rij in de tabel moet blijven, ongewijzigd, voordat deze in aanmerking komt voor compressie in de columnstore-index. SQL Server selecteert specifieke rijen die moeten worden gecomprimeerd op basis van de laatste updatetijd. Als rijen bijvoorbeeld vaak worden gewijzigd gedurende een periode van twee uur, kunt u COMPRESSION_DELAY = 120 Minutes instellen om ervoor te zorgen dat updates worden voltooid voordat SQL Server de rij comprimeert.

Voor een tabel op basis van een schijf geeft vertraging het minimum aantal minuten aan dat een deltarijgroep met de status GESLOTEN in de deltarijgroep moet blijven staan voordat SQL Server deze kan comprimeren in de gecomprimeerde rijgroep. Omdat tabellen op basis van schijven geen invoeg- en updatetijden voor afzonderlijke rijen bijhouden, past SQL Server de vertraging toe op deltarijgroepen met de status GESLOTEN.

De standaardwaarde is 0 minuten.

Zie Aan de slag met Columnstore voor realtime operationele analyses voor aanbevelingen voor het gebruik van COMPRESSION_DELAY

<table_option> ::=

Hiermee geeft u een of meer tabelopties.

DATA_COMPRESSION

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

  • GEEN

    Tabel- of opgegeven partities worden niet gecomprimeerd.

  • ROEIEN

    Tabel- of opgegeven partities worden gecomprimeerd met behulp van rijcompressie.

  • BLADZIJDE

    Tabel- of opgegeven partities worden gecomprimeerd met behulp van paginacompressie.

  • COLUMNSTORE

    van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

    Is alleen van toepassing op columnstore-indexen, inclusief niet-geclusterde columnstore- en geclusterde columnstore-indexen. COLUMNSTORE geeft aan om te comprimeren met de meest presterende columnstore-compressie. Dit is de typische keuze.

  • COLUMNSTORE_ARCHIVE

    van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

    Is alleen van toepassing op columnstore-indexen, inclusief niet-geclusterde columnstore- en geclusterde columnstore-indexen. COLUMNSTORE_ARCHIVE comprimeert de tabel of partitie verder naar een kleiner formaat. Dit kan worden gebruikt voor archivering, of voor andere situaties die een kleinere opslagruimte vereisen en meer tijd voor opslag en ophalen kunnen veroorloven.

Zie Gegevenscompressievoor meer informatie.

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:

  • OP

    Kolommen met het xml- gegevenstype worden gecomprimeerd.

  • AF

    Kolommen met het xml- gegevenstype worden niet gecomprimeerd.

ON PARTITIONS ( { <partition_number_expression> | [ ,... n ] )

Hiermee geeft u de partities waarop de DATA_COMPRESSION of XML_COMPRESSION instellingen van toepassing zijn. Als de tabel niet is gepartitioneerd, genereert het argument ON PARTITIONS een fout. Als de ON PARTITIONS component niet is opgegeven, is de optie DATA_COMPRESSION van toepassing op alle partities van een gepartitioneerde tabel.

partition_number_expression kunt u op de volgende manieren opgeven:

  • Geef het partitienummer van een partitie op, bijvoorbeeld: ON PARTITIONS (2)
  • Geef de partitienummers op voor verschillende afzonderlijke partities, gescheiden door komma's, bijvoorbeeld: ON PARTITIONS (1, 5)
  • Geef zowel bereiken als afzonderlijke partities op, bijvoorbeeld: ON PARTITIONS (2, 4, 6 TO 8)

<range> kan worden opgegeven als partitienummers gescheiden door het woord AAN, bijvoorbeeld: ON PARTITIONS (6 TO 8).

Als u verschillende typen gegevenscompressie voor verschillende partities wilt instellen, geeft u de optie DATA_COMPRESSION meerdere keren op, bijvoorbeeld:

WITH
(
    DATA_COMPRESSION = NONE ON PARTITIONS (1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

U kunt ook de optie XML_COMPRESSION meerdere keren opgeven, bijvoorbeeld:

WITH
(
    XML_COMPRESSION = OFF ON PARTITIONS (1),
    XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
    XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

<index_option> ::=

Hiermee geeft u een of meer indexopties. Zie CREATE INDEXvoor een volledige beschrijving van deze opties.

PAD_INDEX = { ON | UIT }

Wanneer AAN, wordt het percentage vrije ruimte dat is opgegeven door FILLFACTOR toegepast op de pagina's op het tussenliggende niveau van de index. Wanneer UIT of een FILLFACTOR-waarde niet is opgegeven, worden de pagina's met tussenliggende niveaus gevuld tot bijna capaciteit, waardoor er voldoende ruimte is voor ten minste één rij met de maximale grootte van de index, rekening houdend met de set sleutels op de tussenliggende pagina's. De standaardwaarde is UITGESCHAKELD.

FILLFACTOR = fillfactor

Hiermee geeft u een percentage op dat aangeeft hoe vol de database-engine het bladniveau van elke indexpagina moet maken tijdens het maken of wijzigen van de index. fillfactor moet een geheel getal tussen 1 en 100 zijn. De standaardwaarde is 0. Vulfactorwaarden 0 en 100 zijn in alle opzichten hetzelfde.

IGNORE_DUP_KEY = { ON | UIT }

Hiermee geeft u het foutbericht op wanneer een invoegbewerking probeert dubbele sleutelwaarden in een unieke index in te voegen. De optie IGNORE_DUP_KEY is alleen van toepassing op het invoegen van bewerkingen nadat de index is gemaakt of opnieuw is opgebouwd. De optie heeft geen effect bij het uitvoeren van CREATE INDEX, ALTER INDEXof UPDATE. De standaardwaarde is UITGESCHAKELD.

  • OP

    Er wordt een waarschuwingsbericht weergegeven wanneer dubbele sleutelwaarden worden ingevoegd in een unieke index. Alleen de rijen die de uniekheidsbeperking schenden, mislukken.

  • AF

    Er treedt een foutbericht op wanneer dubbele sleutelwaarden worden ingevoegd in een unieke index. De hele INSERT-bewerking wordt teruggedraaid.

IGNORE_DUP_KEY kan niet worden ingesteld op AAN voor indexen die zijn gemaakt in een weergave, niet-unieke indexen, XML-indexen, ruimtelijke indexen en gefilterde indexen.

Als u IGNORE_DUP_KEYwilt weergeven, gebruikt u sys.indexes.

In achterwaarts compatibele syntaxis is WITH IGNORE_DUP_KEY gelijk aan WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { AAN | UIT }

Wanneer AAN worden verouderde indexstatistieken niet automatisch opnieuw berekend. Wanneer uit, worden automatische updates van statistieken ingeschakeld. De standaardwaarde is UITGESCHAKELD.

ALLOW_ROW_LOCKS = { AAN | UIT }

Wanneer AAN, worden rijvergrendelingen toegestaan wanneer u toegang hebt tot de index. De database-engine bepaalt wanneer rijvergrendelingen worden gebruikt. Wanneer UIT, worden rijvergrendelingen niet gebruikt. De standaardwaarde is AAN.

ALLOW_PAGE_LOCKS = { AAN | UIT }

Wanneer AAN, worden paginavergrendelingen toegestaan wanneer u toegang hebt tot de index. De database-engine bepaalt wanneer paginavergrendelingen worden gebruikt. Wanneer UIT, worden paginavergrendelingen niet gebruikt. De standaardwaarde is AAN.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | UIT }

van toepassing op: SQL Server 2019 (15.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u op of het al dan niet moet worden geoptimaliseerd voor conflicten met het invoegen van laatste pagina's. De standaardwaarde is UITGESCHAKELD. Zie de sectie Sequentiële sleutels van de pagina CREATE INDEX voor meer informatie.

FILETABLE_DIRECTORY = directory_name

Van toepassing op: SQL Server 2012 (11.x) en hoger.

Hiermee geeft u de naam van de windows-compatibele FileTable-map. Deze naam moet uniek zijn voor alle bestandstabelmapnamen in de database. De vergelijking van uniekheid is niet hoofdlettergevoelig, ongeacht sorteringsinstellingen. Als deze waarde niet is opgegeven, wordt de naam van de FileTable gebruikt.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

Van toepassing op: SQL Server 2012 (11.x) en hoger. Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILETABLE.

Hiermee geeft u de naam op van de sortering die moet worden toegepast op de kolom Name in de filetable. De sortering moet hoofdlettergevoelig zijn om te voldoen aan de semantiek van het Windows-besturingssysteembestand. Als deze waarde niet is opgegeven, wordt de standaardsortering van de database gebruikt. Als de standaardsortering van de database hoofdlettergevoelig is, wordt er een fout gegenereerd en mislukt de bewerking CREATE TABLE.

  • collation_name

    De naam van een hoofdlettergevoelige sortering.

  • database_default

    Hiermee geeft u op dat de standaardsortering voor de database moet worden gebruikt. Deze sortering moet hoofdlettergevoelig zijn.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

Van toepassing op: SQL Server 2012 (11.x) en hoger. Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILETABLE.

Hiermee geeft u de naam die moet worden gebruikt voor de primaire sleutelbeperking die automatisch wordt gemaakt in de FileTable. Als deze waarde niet is opgegeven, genereert het systeem een naam voor de beperking.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

Van toepassing op: SQL Server 2012 (11.x) en hoger. Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILETABLE.

Hiermee geeft u de naam die moet worden gebruikt voor de unieke beperking die automatisch wordt gemaakt op de stream_id kolom in de FileTable. Als deze waarde niet is opgegeven, genereert het systeem een naam voor de beperking.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

Van toepassing op: SQL Server 2012 (11.x) en hoger. Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILETABLE.

Hiermee geeft u de naam die moet worden gebruikt voor de unieke beperking die automatisch wordt gemaakt op de parent_path_locator en naam kolommen in de FileTable. Als deze waarde niet is opgegeven, genereert het systeem een naam voor de beperking.

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

is van toepassing op: SQL Server 2016 (13.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

Hiermee kunt u systeemversiebeheer van de tabel inschakelen als aan de vereisten voor het gegevenstype, de beperking voor null-functionaliteit en de primaire-sleutelbeperking wordt voldaan. Het systeem registreert de geschiedenis van elke record in de systeemversietabel in een afzonderlijke geschiedenistabel. Als het argument HISTORY_TABLE niet wordt gebruikt, wordt de naam van deze geschiedenistabel MSSQL_TemporalHistoryFor<primary_table_object_id>. Als de naam van een geschiedenistabel wordt opgegeven tijdens het maken van de geschiedenistabel, moet u de schema- en tabelnaam opgeven.

Als de geschiedenistabel niet bestaat, genereert het systeem een nieuwe geschiedenistabel die overeenkomt met het schema van de huidige tabel in dezelfde bestandsgroep als de huidige tabel, waardoor er een koppeling tussen de twee tabellen wordt gemaakt en het systeem de geschiedenis van elke record in de huidige tabel in de geschiedenistabel kan vastleggen. De geschiedenistabel wordt standaard PAGE gecomprimeerd.

Als het argument HISTORY_TABLE wordt gebruikt om een koppeling naar een bestaande geschiedenistabel te maken en te gebruiken, wordt de koppeling gemaakt tussen de huidige tabel en de opgegeven tabel. Als de huidige tabel is gepartitioneerd, wordt de geschiedenistabel gemaakt in de standaardbestandsgroep, omdat de partitioneringsconfiguratie niet automatisch wordt gerepliceerd van de huidige tabel naar de geschiedenistabel. 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 gegevensconsistentiecontrole is de standaardinstelling.

Gebruik dit argument met de argumenten PERIOD FOR SYSTEM_TIME en GENERATED ALWAYS AS ROW { START | END } om systeemversiebeheer in te schakelen voor een tabel. Zie Tijdelijke tabellenvoor meer informatie. Gebruik dit argument met het argument WITH LEDGER = ON om een tabel met een updatable grootboek te maken. Het gebruik van bestaande geschiedenistabellen met grootboektabellen is niet toegestaan.

REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ] | UIT ( MIGRATION_STATE = ONDERBROKEN ) }

Van toepassing op: SQL Server 2016 (13.x) en hoger.

Hiermee maakt u de nieuwe tabel waarvoor Stretch Database is ingeschakeld of uitgeschakeld. Zie Stretch Databasevoor meer informatie.

Belangrijk

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 voor een tabel inschakelt door ONop te geven, kunt u desgewenst 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.

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

machtigingen. Voor het inschakelen van Stretch voor een database of tabel zijn db_owner machtigingen vereist. Als u Stretch voor een tabel inschakelt, zijn ook ALTER-machtigingen voor de tabel vereist.

[ FILTER_PREDICATE = { NULL | predicaat } ]

Van toepassing op: SQL Server 2016 (13.x) en hoger.

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 die u wilt migreren met behulp van een filterfunctievoor meer informatie.

Belangrijk

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 operator CROSS APPLY.

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

Wanneer u een filterpredicaat opgeeft, moet u ook MIGRATION_STATEopgeven.

MIGRATION_STATE = { UITGAAND | INKOMEND | ONDERBROKEN }

is van toepassing op: SQL Server 2016 (13.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

[ DATA_DELETION = AAN { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { ONEINDIG | getal { DAG | DAGEN | WEEK | WEKEN | MAAND | MAANDEN | YEAR | YEARS } ) } ]

Alleen van toepassing op: Azure SQL Edge

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.

    • datum
    • 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.

MEMORY_OPTIMIZED

van toepassing op: SQL Server 2014 (12.x) en hoger, Azure SQL Database en Azure SQL Managed Instance. Azure SQL Managed Instance biedt geen ondersteuning voor tabellen die zijn geoptimaliseerd voor geheugen in de laag Algemeen gebruik.

De waarde AAN geeft aan dat de tabel geoptimaliseerd is voor geheugen. Tabellen die zijn geoptimaliseerd voor geheugen maken deel uit van de In-Memory OLTP-functie, die wordt gebruikt om de prestaties van transactieverwerking te optimaliseren. Zie Quickstart 1 om aan de slag te gaan met In-Memory OLTP:In-Memory OLTP Technologies for Faster Transact-SQL Performance. Zie Memory-Optimized Tabellenvoor meer uitgebreide informatie over tabellen die zijn geoptimaliseerd voor geheugen.

De standaardwaarde UIT geeft aan dat de tabel op schijf is gebaseerd.

DUURZAAMHEID

van toepassing op: SQL Server 2014 (12.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

De waarde van SCHEMA_AND_DATA geeft aan dat de tabel duurzaam is, wat betekent dat wijzigingen op schijf blijven bestaan en het opnieuw opstarten of failover overleven. SCHEMA_AND_DATA is de standaardwaarde.

De waarde van SCHEMA_ONLY geeft aan dat de tabel niet duurzaam is. Het tabelschema blijft behouden, maar er worden geen gegevensupdates bewaard bij het opnieuw opstarten of uitvoeren van een failover van de database. DURABILITY = SCHEMA_ONLY is alleen toegestaan met MEMORY_OPTIMIZED = ON.

Waarschuwing

Wanneer een tabel met DURABILITY = SCHEMA_ONLYwordt gemaakt en READ_COMMITTED_SNAPSHOT vervolgens wordt gewijzigd met behulp van ALTER DATABASE, gaan gegevens in de tabel verloren.

BUCKET_COUNT

van toepassing op: SQL Server 2014 (12.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

Geeft het aantal buckets aan dat moet worden gemaakt in de hash-index. De maximumwaarde voor BUCKET_COUNT in hash-indexen is 1.073.741.824. Zie Indexen voor Memory-Optimized tabellenvoor meer informatie over het aantal buckets.

Bucket_count is een verplicht argument.

INDEX

van toepassing op: SQL Server 2014 (12.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

Kolom- en tabelindexen kunnen worden opgegeven als onderdeel van de instructie CREATE TABLE. Zie Het wijzigen van Memory-Optimized tabellen voor meer informatie over het toevoegen en verwijderen van indexen voor tabellen die zijn geoptimaliseerd voor geheugen

  • HEKJE

    van toepassing op: SQL Server 2014 (12.x) en hoger, Azure SQL Database en Azure SQL Managed Instance.

    Geeft aan dat er een HASH-index wordt gemaakt.

    Hash-indexen worden alleen ondersteund voor tabellen die zijn geoptimaliseerd voor geheugen.

GROOTBOEK = AAN ( <ledger_option> [ ,... n ] ) | AF

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

Notitie

Als de instructie een grootboektabel maakt, is de ENABLE LEDGER machtiging vereist.

Geeft aan of de tabel die wordt gemaakt een grootboektabel (AAN) is of niet (UIT). De standaardwaarde is UITGESCHAKELD. Als de optie APPEND_ONLY = ON is opgegeven, maakt het systeem een grootboektabel met alleen toevoeggegevens, zodat alleen nieuwe rijen kunnen worden ingevoegd. Anders maakt het systeem een updatable grootboektabel. Voor een tabel met een grootboek dat kan worden bijgewerkt, is ook het argument SYSTEM_VERSIONING = ON vereist. Een tabel met een grootboek dat kan worden bijgewerkt, moet ook een tabel met systeemversies zijn. Een tabel met een grootboek dat kan worden bijgewerkt, hoeft echter geen tijdelijke tabel te zijn (hiervoor is geen PERIOD FOR SYSTEM_TIME parameter vereist). Als de geschiedenistabel is opgegeven met LEDGER = ON en SYSTEM_VERSIONING = ON, mag deze niet verwijzen naar een bestaande tabel.

Een grootboekdatabase (een database die is gemaakt met de optie LEDGER = ON) staat alleen het maken van grootboektabellen toe. Pogingen om een tabel te maken met LEDGER = OFF veroorzaken een fout. Elke nieuwe tabel wordt standaard gemaakt als een updatable grootboektabel, zelfs als u geen LEDGER = ONopgeeft en wordt gemaakt met standaardwaarden voor alle andere parameters.

Een tabel met een grootboek dat kan worden bijgewerkt, moet vier GENERATED ALWAYS kolommen bevatten, precies één kolom die is gedefinieerd met elk van de volgende argumenten:

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS TRANSACTION_ID END
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER END

Een grootboektabel met alleen toevoeggegevens moet exact één kolom bevatten die is gedefinieerd met elk van de volgende argumenten:

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START

Als een van de vereiste gegenereerde altijd kolommen niet is gedefinieerd in de CREATE TABLE-instructie en de instructie LEDGER = ONbevat, probeert het systeem automatisch de kolom toe te voegen met behulp van een toepasselijke kolomdefinitie uit de onderstaande lijst. Als er een naamconflict is met een al gedefinieerde kolom, treedt er een fout op in het systeem.

[ledger_start_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL
[ledger_end_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL
[ledger_start_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
[ledger_end_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL

De <ledger_view_option> geeft het schema en de naam van de grootboekweergave op het systeem automatisch maakt en koppelingen naar de tabel maakt. Als de optie niet is opgegeven, genereert het systeem de naam van de grootboekweergave door _Ledger toe te voegen aan de naam van de tabel die wordt gemaakt (database_name.schema_name.table_name). Als er een weergave met de opgegeven of gegenereerde naam bestaat, wordt er een fout gegenereerd. Als de tabel een updatable grootboektabel is, wordt de grootboekweergave gemaakt als samenvoeging op de tabel en de bijbehorende geschiedenistabel.

Elke rij in de grootboekweergave vertegenwoordigt het maken of verwijderen van een rijversie in de grootboektabel. De grootboekweergave bevat alle kolommen van de grootboektabel, behalve de gegenereerde altijd hierboven vermelde kolommen. De grootboekweergave bevat ook de volgende extra kolommen:

Kolomnaam Gegevenstype Beschrijving
Opgegeven met behulp van de optie TRANSACTION_ID_COLUMN_NAME. ledger_transaction_id indien niet opgegeven. bigint De id van de transactie die een rijversie heeft gemaakt of verwijderd.
Opgegeven met behulp van de optie SEQUENCE_NUMBER_COLUMN_NAME. ledger_sequence_number indien niet opgegeven. bigint Het volgnummer van een bewerking op rijniveau binnen de transactie in de tabel.
Opgegeven met behulp van de optie OPERATION_TYPE_COLUMN_NAME. ledger_operation_type indien niet opgegeven. tinyint Bevat 1 (INSERT) of 2 (DELETE). Als u een rij in de grootboektabel invoegt, wordt er een nieuwe rij gemaakt in de grootboekweergave met 1 in deze kolom. Als u een rij uit de grootboektabel verwijdert, wordt er een nieuwe rij gemaakt in de grootboekweergave met 2 in deze kolom. Het bijwerken van een rij in de grootboektabel produceert twee nieuwe rijen in de grootboekweergave. De ene rij bevat 2 (DELETE) en de andere rij bevat 1 (INSERT) in deze kolom.
Opgegeven met behulp van de optie OPERATION_TYPE_DESC_COLUMN_NAME. ledger_operation_type_desc indien niet opgegeven. nvarchar(128) Bevat INSERT of DELETE. Zie hierboven voor meer informatie.

Transacties met het maken van grootboektabel worden vastgelegd in sys.database_ledger_transactions.

<ledger_option> ::=

Hiermee geeft u een grootboekoptie.

[ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ] ]

Hiermee geeft u de naam van de grootboekweergave en de namen van extra kolommen die het systeem toevoegt aan de grootboekweergave.

[ APPEND_ONLY = AAN | UIT ]

Hiermee geeft u op of de grootboektabel die wordt gemaakt, alleen kan worden toegevoegd of bijgewerkt. De standaardwaarde is OFF.

<ledger_view_option> ::=

Hiermee geeft u een of meer opties voor grootboekweergave. Elk van de grootboekweergaveopties geeft een naam van een kolom op, het systeem wordt toegevoegd aan de weergave, naast de kolommen die zijn gedefinieerd in de grootboektabel.

[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]

Hiermee geeft u de naam op van de kolom waarin de id van de transactie wordt opgeslagen die een rijversie heeft gemaakt of verwijderd. De standaardkolomnaam is ledger_transaction_id.

[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]

Hiermee geeft u de naam op van de kolommen waarin het volgnummer van een bewerking op rijniveau in de transactie in de tabel wordt opgeslagen. De standaardkolomnaam is ledger_sequence_number.

[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]

Hiermee geeft u de naam op van de kolommen waarin de id van het bewerkingstype wordt opgeslagen. De standaardkolomnaam is ledger_operation_type.

[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]

Hiermee geeft u de naam van de kolommen waarin de beschrijving van het bewerkingstype wordt opgeslagen. De standaardkolomnaam is ledger_operation_type_desc.

Opmerkingen

Zie Maximumcapaciteitsspecificaties voor SQL Servervoor meer informatie over het aantal toegestane tabellen, kolommen, beperkingen en indexen.

De ruimte wordt over het algemeen toegewezen aan tabellen en indexen in stappen van één mate tegelijk. Wanneer de SET MIXED_PAGE_ALLOCATION optie van ALTER DATABASE is ingesteld op TRUE, of altijd vóór SQL Server 2016 (13.x), worden er pagina's uit gemengde gebieden toegewezen totdat er voldoende pagina's zijn om een uniforme omvang te vullen. Nadat er voldoende pagina's zijn om een uniforme omvang te vullen, wordt elke keer dat de momenteel toegewezen gebieden vol zijn, een andere mate toegewezen. Voer sp_spaceuseduit voor een rapport over de hoeveelheid ruimte die door een tabel is toegewezen en gebruikt.

De database-engine dwingt geen volgorde af waarin STANDAARD, IDENTITEIT, ROWGUIDCOL of kolombeperkingen worden opgegeven in een kolomdefinitie.

Wanneer een tabel wordt gemaakt, wordt de optie AAN-ID altijd opgeslagen als AAN in de metagegevens voor de tabel, zelfs als de optie is ingesteld op UIT wanneer de tabel wordt gemaakt.

In SQL Database in Microsoft Fabric kunnen sommige tabelfuncties worden gemaakt, maar worden deze niet gespiegeld in de Fabric OneLake-. Zie Beperkingen van sql-databasespiegeling voor infrastructuurresourcesvoor meer informatie.

Tijdelijke tabellen

U kunt lokale en globale tijdelijke tabellen maken. Lokale tijdelijke tabellen zijn alleen zichtbaar in de huidige sessie en globale tijdelijke tabellen zijn zichtbaar voor alle sessies. Tijdelijke tabellen kunnen niet worden gepartitioneerd.

Lokale tijdelijke tabelnamen voorvoegsel met enkelteken (#table_name) en globale tijdelijke tabelnamen met een dubbel nummerteken (##table_name).

Transact-SQL instructies verwijzen naar de tijdelijke tabel met behulp van de waarde die is opgegeven voor table_name in de CREATE TABLE-instructie, bijvoorbeeld:

CREATE TABLE #MyTempTable
(
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Als er meer dan één tijdelijke tabel wordt gemaakt binnen één opgeslagen procedure of batch, moeten ze verschillende namen hebben.

Als u een schema_name opneemt wanneer u een tijdelijke tabel maakt of opent, wordt deze genegeerd. Alle tijdelijke tabellen worden gemaakt in het dbo schema.

Als een lokale tijdelijke tabel wordt gemaakt in een opgeslagen procedure of een SQL-module die tegelijkertijd kan worden uitgevoerd door verschillende sessies, moet de Database Engine de tabellen kunnen onderscheiden die door de verschillende sessies zijn gemaakt. De database-engine doet dit door intern een uniek achtervoegsel toe te voegen aan elke lokale tijdelijke tabelnaam. De volledige naam van een tijdelijke tabel die is opgeslagen in de sys.objects tabel in tempdb bestaat uit de tabelnaam die is opgegeven in de CREATE TABLE-instructie en het door het systeem gegenereerde unieke achtervoegsel. Als u het achtervoegsel wilt toestaan, mag table_name opgegeven voor een lokale tijdelijke naam niet langer zijn dan 116 tekens.

Tijdelijke tabellen worden automatisch verwijderd wanneer ze buiten het bereik vallen, tenzij ze expliciet eerder zijn verwijderd met behulp van DROP TABLE:

  • Een lokale tijdelijke tabel die in een opgeslagen procedure is gemaakt, wordt automatisch verwijderd wanneer de opgeslagen procedure is voltooid. Er kan naar de tabel worden verwezen door geneste opgeslagen procedures die worden uitgevoerd door de opgeslagen procedure die de tabel heeft gemaakt. Er kan niet naar de tabel worden verwezen door het proces dat de opgeslagen procedure aangeroepen heeft die de tabel heeft gemaakt.
  • Alle andere lokale tijdelijke tabellen worden automatisch aan het einde van de huidige sessie verwijderd.
  • Als de configuratie van GLOBAL_TEMPORARY_TABLE_AUTO_DROP databasebereik is ingesteld op ON- (standaard), worden globale tijdelijke tabellen automatisch verwijderd wanneer de sessie die de tabel heeft gemaakt eindigt en alle andere taken zijn gestopt met verwijzen naar deze tabellen. De koppeling tussen een taak en een tabel wordt slechts gehandhaafd voor de levensduur van één Transact-SQL-instructie. Dit betekent dat een globale tijdelijke tabel wordt verwijderd bij het voltooien van de laatste Transact-SQL instructie die actief naar de tabel verwijst toen de sessie werd gemaakt.
  • Als de configuratie van GLOBAL_TEMPORARY_TABLE_AUTO_DROP databasebereik is ingesteld op UIT, worden globale tijdelijke tabellen alleen verwijderd met behulp van DROP TABLEof wanneer het database-engineexemplaren opnieuw wordt opgestart. Zie GLOBAL_TEMPORARY_TABLE_AUTO_DROPvoor meer informatie.

Een lokale tijdelijke tabel die is gemaakt in een opgeslagen procedure of trigger, kan dezelfde naam hebben als een tijdelijke tabel die is gemaakt vóór de opgeslagen procedure of trigger wordt aangeroepen. Als een query echter verwijst naar een tijdelijke tabel en twee tijdelijke tabellen met dezelfde naam, wordt er op dat moment niet gedefinieerd op welke tabel de query wordt omgezet. Geneste opgeslagen procedures kunnen ook tijdelijke tabellen maken met dezelfde naam als een tijdelijke tabel die is gemaakt door de aanroepende opgeslagen procedure. Voor wijzigingen die moeten worden omgezet in de tabel die in de geneste procedure is gemaakt, moet de tabel echter dezelfde structuur hebben, met dezelfde kolomnamen, als de tabel die in de aanroepprocedure is gemaakt. Dit wordt weergegeven in het volgende voorbeeld.

CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t
(
    x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (2);
SELECT x AS Test2Col
FROM #t;
GO

CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t
(
    x INT PRIMARY KEY
);

INSERT INTO #t
VALUES (1);
SELECT x AS Test1Col
FROM #t;

EXECUTE Test2;
GO

CREATE TABLE #t
(
    x INT PRIMARY KEY
);

INSERT INTO #t
VALUES (99);
GO

EXECUTE Test1;
GO

Dit is de resultatenset.

(1 row(s) affected)
Test1Col
-----------
1

(1 row(s) affected)
Test2Col
-----------
2

Wanneer u lokale of globale tijdelijke tabellen maakt, ondersteunt de CREATE TABLE syntaxis beperkingen, met uitzondering van FOREIGN KEY beperkingen. Als een FOREIGN KEY beperking is opgegeven in een tijdelijke tabel, retourneert de instructie een waarschuwingsbericht waarin staat dat de beperking is overgeslagen. De tabel wordt nog steeds gemaakt zonder de FOREIGN KEY beperking. Er kan niet naar tijdelijke tabellen worden verwezen in FOREIGN KEY beperkingen.

Als een tijdelijke tabel wordt gemaakt met een benoemde beperking en de tijdelijke tabel wordt gemaakt binnen het bereik van een door de gebruiker gedefinieerde transactie, kan slechts één gebruiker tegelijk de instructie uitvoeren waarmee de tijdelijke tabel wordt gemaakt. Als een opgeslagen procedure bijvoorbeeld een tijdelijke tabel met een benoemde primaire-sleutelbeperking maakt, kan de opgeslagen procedure niet tegelijkertijd door meerdere gebruikers worden uitgevoerd.

Globale tijdelijke tabellen met databasebereik in Azure SQL Database

Globale tijdelijke tabellen in SQL Server (tabelnamen voorafgegaan door ##) worden opgeslagen in tempdb en gedeeld tussen alle gebruikerssessies in het hele SQL Server-exemplaar.

Azure SQL Database ondersteunt globale tijdelijke tabellen die ook zijn opgeslagen in tempdb, maar die binnen het bereik vallen van het databaseniveau. Dit betekent dat globale tijdelijke tabellen worden gedeeld tussen alle gebruikerssessies in dezelfde database. Gebruikerssessies van andere databases hebben geen toegang tot globale tijdelijke tabellen. Anders volgen globale tijdelijke tabellen voor Azure SQL Database dezelfde syntaxis en semantiek die SQL Server gebruikt.

Op dezelfde manier zijn globale, tijdelijke opgeslagen procedures ook gericht op het databaseniveau in Azure SQL Database.

Lokale tijdelijke tabellen (tabelnamen voorafgegaan door #) worden ook ondersteund voor Azure SQL Database en volgen dezelfde syntaxis en semantiek die SQL Server gebruikt. Zie Tijdelijke tabellenvoor meer informatie.

Machtigingen voor tijdelijke objecten

Elke gebruiker kan tijdelijke objecten maken en openen.

Gepartitioneerde tabellen

Voordat u een gepartitioneerde tabel maakt met CREATE TABLE, moet u eerst een partitiefunctie maken om op te geven hoe de tabel wordt gepartitioneerd. Er wordt een partitiefunctie gemaakt met behulp van CREATE PARTITION FUNCTION. Ten tweede moet u een partitieschema maken om de bestandsgroepen op te geven die de partities bevatten die worden aangegeven door de partitiefunctie. Er wordt een partitieschema gemaakt met behulp van PARTITIESCHEMA MAKEN. Plaatsing van PRIMAIRE SLEUTEL- of UNIEKE beperkingen voor het scheiden van bestandsgroepen kan niet worden opgegeven voor gepartitioneerde tabellen. Zie Gepartitioneerde tabellen en indexenvoor meer informatie.

BEPERKINGEN VOOR PRIMAIRE SLEUTEL

  • Een tabel kan slechts één PRIMAIRE SLEUTELbeperking bevatten.

  • De index die wordt gegenereerd door een beperking PRIMAIRE SLEUTEL kan niet ertoe leiden dat het aantal indexen in de tabel groter is dan 999 niet-geclusterde indexen en 1 geclusterde index.

  • Als CLUSTERED of NIET-GECLUSTERD niet is opgegeven voor een BEPERKING PRIMAIRE SLEUTEL, wordt GECLUSTERD gebruikt als er geen geclusterde indexen zijn opgegeven voor UNIEKE beperkingen.

  • Alle kolommen die zijn gedefinieerd in een PRIMAIRE-SLEUTELbeperking, moeten worden gedefinieerd als NOT NULL. Als er geen null-waarde is opgegeven, zijn voor alle kolommen die deelnemen aan een BEPERKING PRIMAIRE SLEUTEL de null-waarde niet ingesteld op NOT NULL.

    Notitie

    Voor tabellen die zijn geoptimaliseerd voor geheugen, is de kolom met null-sleutels toegestaan.

  • Als een primaire sleutel is gedefinieerd in een door de gebruiker gedefinieerde clr-typekolom, moet de implementatie van het type binaire volgorde ondersteunen. Zie CLR User-Defined Typenvoor meer informatie.

UNIEKE beperkingen

  • Als CLUSTERED of NIET-GECLUSTERD niet is opgegeven voor een UNIEKE beperking, wordt NONCLUSTERED standaard gebruikt.
  • Elke UNIEKE beperking genereert een index. Het aantal UNIEKE beperkingen kan niet ertoe leiden dat het aantal indexen in de tabel groter is dan 999 niet-geclusterde indexen en 1 geclusterde index.
  • Als een unieke beperking is gedefinieerd op een door de gebruiker gedefinieerde CLR-kolom, moet de implementatie van het type binaire of operatorgebaseerde volgorde ondersteunen. Zie CLR User-Defined Typenvoor meer informatie.

BEPERKINGEN VOOR REFERERENDE SLEUTELS

  • Wanneer een andere waarde dan NULL wordt ingevoerd in de kolom van een beperking REFERERENDE SLEUTEL, moet de waarde bestaan in de kolom waarnaar wordt verwezen; anders wordt een foutbericht over schending van de refererende sleutel geretourneerd.

  • BEPERKINGEN VOOR REFERERENDE SLEUTELS worden toegepast op de voorgaande kolom, tenzij bronkolommen worden opgegeven.

  • Beperkingen voor REFERERENDE SLEUTELS kunnen alleen verwijzen naar tabellen binnen dezelfde database op dezelfde server. Referentiële integriteit tussen databases moet worden geïmplementeerd via triggers. Zie CREATE TRIGGERvoor meer informatie.

  • Beperkingen voor REFERERENDE SLEUTELS kunnen verwijzen naar een andere kolom in dezelfde tabel. Dit wordt een zelfverwijzing genoemd.

  • Met de component REFERENCES van een beperking op kolomniveau REFERERENDE SLEUTEL kan slechts één verwijzingskolom worden weergegeven. Deze kolom moet hetzelfde gegevenstype hebben als de kolom waarop de beperking is gedefinieerd.

  • De COMPONENT REFERENCES van een refererende SLEUTEL-beperking op tabelniveau moet hetzelfde aantal referentiekolommen hebben als het aantal kolommen in de lijst met kolommen met beperkingen. Het gegevenstype van elke verwijzingskolom moet ook hetzelfde zijn als de bijbehorende kolom in de kolomlijst. De verwijzingskolommen moeten worden opgegeven in dezelfde volgorde die is gebruikt bij het opgeven van de kolommen van de primaire sleutel of unieke beperking in de tabel waarnaar wordt verwezen.

  • CASCADE, SET NULL of SET DEFAULT kan niet worden opgegeven als een kolom van het type tijdstempel deel uitmaakt van de refererende sleutel of de sleutel waarnaar wordt verwezen.

  • CASCADE, SET NULL, SET DEFAULT en NO ACTION kunnen worden gecombineerd voor tabellen die referentiële relaties met elkaar hebben. Als de database-engine GEEN ACTIE tegenkomt, wordt gerelateerde TRAPSGEWIJS, SET NULL en SET DEFAULT-acties gestopt en teruggedraaid. Wanneer een DELETE-instructie een combinatie veroorzaakt van TRAPSGEWIJS, SET NULL, STANDAARD INSTELLEN en GEEN ACTIEacties, worden alle acties TRAPSGEWIJS, SET NULL en STANDAARD INSTELLEN toegepast voordat de database-engine controleert op een WILLEKEURIGE ACTIE.

  • De database-engine heeft geen vooraf gedefinieerde limiet voor het aantal beperkingen voor REFERERENDE SLEUTELS dat een tabel kan bevatten die verwijzen naar andere tabellen, of het aantal beperkingen voor REFERERENDE SLEUTELS dat eigendom is van andere tabellen die verwijzen naar een specifieke tabel.

    Het werkelijke aantal beperkingen voor REFERERENDE SLEUTELS dat kan worden gebruikt, wordt echter beperkt door de hardwareconfiguratie en door het ontwerp van de database en toepassing. Het is raadzaam dat een tabel niet meer dan 253 BEPERKINGEN VOOR REFERERENDE SLEUTELS bevat en dat er niet meer dan 253 beperkingen voor REFERERENDE SLEUTELS naar worden verwezen. De effectieve limiet voor u kan meer of minder zijn, afhankelijk van de toepassing en hardware. Houd rekening met de kosten voor het afdwingen van beperkingen voor REFERERENDE SLEUTELS wanneer u uw database en toepassingen ontwerpt.

  • BEPERKINGEN VOOR REFERERENDE SLEUTELS worden niet afgedwongen voor tijdelijke tabellen.

  • Beperkingen voor REFERERENDE SLEUTELS kunnen alleen verwijzen naar kolommen in PRIMAIRE SLEUTEL of UNIEKE beperkingen in de tabel waarnaar wordt verwezen of in een UNIEKE INDEX in de tabel waarnaar wordt verwezen.

  • Als een refererende sleutel is gedefinieerd in een door de gebruiker gedefinieerde CLR-kolom, moet de implementatie van het type binaire volgorde ondersteunen. Zie CLR User-Defined Typenvoor meer informatie.

  • Kolommen die deelnemen aan een refererende-sleutelrelatie, moeten worden gedefinieerd met dezelfde lengte en schaal.

STANDAARDdefinities

  • Een kolom kan slechts één STANDAARDdefinitie hebben.

  • Een STANDAARDdefinitie kan constante waarden, functies, SQL-standaard niladic-functies of NULLbevatten. In de volgende tabel ziet u de niladic-functies en de waarden die ze retourneren voor de standaardwaarde tijdens een INSERT-instructie.

    Niladic-functie voor SQL-92 Geretourneerde waarde
    CURRENT_TIMESTAMP Huidige datum en tijd.
    CURRENT_USER De naam van de gebruiker die een invoegbewerking uitvoert.
    SESSION_USER De naam van de gebruiker die een invoegbewerking uitvoert.
    SYSTEM_USER De naam van de gebruiker die een invoegbewerking uitvoert.
    USER De naam van de gebruiker die een invoegbewerking uitvoert.
  • constant_expression in een STANDAARDdefinitie kan niet verwijzen naar een andere kolom in de tabel of naar andere tabellen, weergaven of opgeslagen procedures.

  • STANDAARDdefinities kunnen niet worden gemaakt voor kolommen met een tijdstempel gegevenstype of kolommen met een id-eigenschap.

  • STANDAARDdefinities kunnen niet worden gemaakt voor kolommen met aliasgegevenstypen als het aliasgegevenstype is gebonden aan een standaardobject.

CHECK-beperkingen

  • Een kolom kan een willekeurig aantal CHECK-beperkingen hebben en de voorwaarde kan meerdere logische expressies bevatten in combinatie met AND en OR. Meerdere CHECK-beperkingen voor een kolom worden gevalideerd in de volgorde waarin ze worden gemaakt.

  • De zoekvoorwaarde moet een Boole-expressie evalueren en kan niet verwijzen naar een andere tabel.

  • Een check-beperking op kolomniveau kan alleen verwijzen naar de beperkte kolom en een check-beperking op tabelniveau kan alleen verwijzen naar kolommen in dezelfde tabel.

    CHECK CONSTRAINTS and rules dienen dezelfde functie voor het valideren van de gegevens tijdens INSERT- en UPDATE-instructies.

  • Wanneer er een regel en een of meer CHECK-beperkingen bestaan voor een kolom of kolommen, worden alle beperkingen geëvalueerd.

  • CHECK-beperkingen kunnen niet worden gedefinieerd voor tekst, ntextof afbeelding kolommen.

Verdere informatie over beperkingen

  • Een index die is gemaakt voor een beperking, kan niet worden verwijderd met behulp van DROP INDEX; de beperking moet worden verwijderd met behulp van ALTER TABLE. Een index die is gemaakt voor en wordt gebruikt door een beperking, kan opnieuw worden opgebouwd met behulp van ALTER INDEX ... REBUILD. Zie Indexen opnieuw ordenen en herbouwenvoor meer informatie.
  • Namen van beperkingen moeten voldoen aan de regels voor id's, behalve dat de naam niet kan beginnen met een nummerteken (#). Als constraint_name niet wordt opgegeven, wordt er een door het systeem gegenereerde naam toegewezen aan de beperking. De naam van de beperking wordt weergegeven in een foutbericht over schendingen van beperkingen.
  • Wanneer een beperking wordt geschonden in een INSERT, UPDATEof DELETE instructie, wordt de instructie beëindigd. Wanneer SET XACT_ABORT echter is ingesteld op UIT, wordt de transactie, als de instructie deel uitmaakt van een expliciete transactie, nog steeds verwerkt. Wanneer SET XACT_ABORT is ingesteld op AAN, wordt de hele transactie teruggedraaid. U kunt ook de ROLLBACK TRANSACTION-instructie met de transactiedefinitie gebruiken door de @@ERROR systeemfunctie te controleren.
  • Wanneer ALLOW_ROW_LOCKS = ON en ALLOW_PAGE_LOCK = ON, vergrendelingen op rij-, pagina- en tabelniveau zijn toegestaan wanneer u de index opent. De database-engine kiest de juiste vergrendeling en kan de vergrendeling van een rij- of paginavergrendeling escaleren naar een tabelvergrendeling. Wanneer ALLOW_ROW_LOCKS = OFF en ALLOW_PAGE_LOCK = OFF, is alleen een vergrendeling op tabelniveau toegestaan wanneer u de index opent.
  • Als een tabel REFERERENDE SLEUTEL of CHECK-BEPERKINGEN en triggers heeft, worden de voorwaarden voor beperkingen geëvalueerd voordat de trigger wordt uitgevoerd.

Gebruik sp_help of sp_helpconstraintvoor een rapport over een tabel en de bijbehorende kolommen. Als u de naam van een tabel wilt wijzigen, gebruikt u sp_rename. Gebruik sys.dm_sql_referenced_entities en sys.dm_sql_referencing_entitiesvoor een rapport over de weergaven en opgeslagen procedures die afhankelijk zijn van een tabel.

Regels voor null-beschikbaarheid binnen een tabeldefinitie

De null-waarde van een kolom bepaalt of die kolom een null-waarde (NULL) kan toestaan als de gegevens in die kolom. NULL niet nul of leeg is: NULL betekent dat er geen vermelding is gemaakt of dat er een expliciete NULL is opgegeven en dat de waarde doorgaans onbekend of niet van toepassing is.

Wanneer u CREATE TABLE of ALTER TABLE gebruikt om een tabel te maken of te wijzigen, beïnvloeden database- en sessie-instellingen en overschrijft u mogelijk de null-waarde van het gegevenstype dat wordt gebruikt in een kolomdefinitie. U wordt aangeraden altijd expliciet een kolom te definiëren als NULL of NOT NULL voor niet-gecomputeerde kolommen of, als u een door de gebruiker gedefinieerd gegevenstype gebruikt, zodat de kolom de standaard null-waarde van het gegevenstype kan gebruiken. Sparse-kolommen moeten altijd NULL toestaan.

Wanneer de kolom null-waarde niet expliciet is opgegeven, volgt kolom-nullbaarheid de regels die worden weergegeven in de volgende tabel.

Kolomgegevenstype Regel
Aliasgegevenstype De database-engine maakt gebruik van de null-waarde die wordt opgegeven bij het maken van het gegevenstype. Gebruik sp_helpom de standaard null-waarde van het gegevenstype te bepalen.
Door de gebruiker gedefinieerde CLR-type Null-waarde wordt bepaald volgens de kolomdefinitie.
Door het systeem opgegeven gegevenstype Als het door het systeem geleverde gegevenstype slechts één optie heeft, heeft dit voorrang. tijdstempel gegevenstypen moeten NIET NULL zijn. Wanneer sessie-instellingen zijn ingesteld OP met behulp van SET:
ANSI_NULL_DFLT_ON = ON, wordt NULL toegewezen.
ANSI_NULL_DFLT_OFF = ON, wordt NOT NULL toegewezen.

Wanneer database-instellingen zijn geconfigureerd met behulp van ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = ON, wordt NULL toegewezen.
ANSI_NULL_DEFAULT_OFF = ON, wordt NOT NULL toegewezen.

Als u de database-instelling voor ANSI_NULL_DEFAULTwilt weergeven, gebruikt u de sys.databases catalogusweergave

Wanneer geen van de ANSI_NULL_DFLT-opties is ingesteld voor de sessie en de database is ingesteld op de standaardwaarde (ANSI_NULL_DEFAULT IS UITGESCHAKELD), wordt de standaardwaarde NOT NULL toegewezen.

Als de kolom een berekende kolom is, wordt de null-waarde altijd automatisch bepaald door de database-engine. Als u de null-waarde van dit type kolom wilt achterhalen, gebruikt u de COLUMNPROPERTY functie met de eigenschap AllowsNull.

Notitie

Het ODBC-stuurprogramma van SQL Server en het SQL Server OLE DB-stuurprogramma hebben beide standaard ANSI_NULL_DFLT_ON ingesteld op AAN. ODBC- en OLE DB-gebruikers kunnen dit configureren in ODBC-gegevensbronnen of met verbindingskenmerken of eigenschappen die zijn ingesteld door de toepassing.

Gegevenscompressie

Systeemtabellen kunnen niet worden ingeschakeld voor compressie. Wanneer u een tabel maakt, wordt gegevenscompressie ingesteld op NONE, tenzij anders is opgegeven. Als u een lijst met partities of een partitie opgeeft die buiten het bereik valt, wordt er een fout gegenereerd. Zie Gegevenscompressievoor 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 sp_estimate_data_compression_savings opgeslagen procedure.

Machtigingen

Vereist CREATE TABLE machtiging in de database en ALTER machtiging voor het schema waarin de tabel wordt gemaakt.

Als kolommen in de CREATE TABLE-instructie zijn gedefinieerd als een door de gebruiker gedefinieerd type, is REFERENCES machtiging voor het door de gebruiker gedefinieerde type vereist.

Als kolommen in de CREATE TABLE-instructie zijn gedefinieerd als een door de gebruiker gedefinieerd type CLR, is het eigendom van het type of REFERENCES machtiging hiervoor vereist.

Als aan kolommen in de instructie CREATE TABLE een XML-schemaverzameling is gekoppeld, is het eigendom van de XML-schemaverzameling of REFERENCES machtiging hiervoor vereist.

Elke gebruiker kan tijdelijke tabellen maken in tempdb.

Als de instructie een grootboektabel maakt, is ENABLE LEDGER machtiging vereist.

Voorbeelden

Een. Een PRIMAIRE SLEUTEL-beperking maken voor een kolom

In het volgende voorbeeld ziet u de kolomdefinitie voor een BEPERKING PRIMAIRE SLEUTEL met een geclusterde index in de kolom EmployeeID van de Employee tabel. Omdat er geen beperkingsnaam is opgegeven, levert het systeem de naam van de beperking.

CREATE TABLE dbo.Employee
(
    EmployeeID INT PRIMARY KEY CLUSTERED
);

B. BEPERKINGEN VOOR REFERERENDE SLEUTELS gebruiken

Er wordt een BEPERKING VOOR REFERERENDE SLEUTEL gebruikt om te verwijzen naar een andere tabel. Refererende sleutels kunnen sleutels met één kolom of meerdere kolommen zijn. In dit volgende voorbeeld ziet u een beperking met één kolom REFERERENDE SLEUTEL in de SalesOrderHeader tabel die verwijst naar de SalesPerson tabel. Alleen de COMPONENT REFERENCES is vereist voor een beperking met één kolom REFERERENDE SLEUTEL.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

U kunt ook expliciet de component FOREIGN KEY gebruiken en het kolomkenmerk opnieuw opgeven. De kolomnaam hoeft niet hetzelfde te zijn in beide tabellen.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Sleutelbeperkingen met meerdere kolommen worden gemaakt als tabelbeperkingen. In de AdventureWorks2022-database bevat de SpecialOfferProduct tabel een primaire sleutel met meerdere kolommen. In het volgende voorbeeld ziet u hoe u naar deze sleutel uit een andere tabel verwijst; een expliciete beperkingsnaam is optioneel.

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
    FOREIGN KEY (ProductID, SpecialOfferID)
    REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)

C. UNIEKE beperkingen gebruiken

UNIEKE beperkingen worden gebruikt om uniekheid af te dwingen voor niet-primaire sleutelkolommen. In het volgende voorbeeld wordt een beperking afgedwongen die de Name kolom van de Product tabel uniek moet zijn.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. STANDAARDdefinities gebruiken

Standaardwaarden leveren een waarde (met de INSERT- en UPDATE-instructies) wanneer er geen waarde wordt opgegeven. De AdventureWorks2022-database kan bijvoorbeeld een opzoektabel bevatten met de verschillende taken die werknemers kunnen invullen in het bedrijf. Onder een kolom waarin elke taak wordt beschreven, kan een tekenreeksstandaard een beschrijving opgeven wanneer een werkelijke beschrijving niet expliciet wordt ingevoerd.

DEFAULT 'New Position - title not formalized yet'

Naast constanten kunnen STANDAARDdefinities functies bevatten. Gebruik het volgende voorbeeld om de huidige datum voor een item op te halen.

DEFAULT (GETDATE())

Een niladic-functiescan kan ook de gegevensintegriteit verbeteren. Gebruik de niladic-functie voor USER om de gebruiker bij te houden die een rij heeft ingevoegd. Plaats de niladic-functies niet tussen haakjes.

DEFAULT USER

E. CHECK-beperkingen gebruiken

In het volgende voorbeeld ziet u een beperking voor waarden die zijn ingevoerd in de kolom CreditRating van de Vendor tabel. De beperking is niet benoemd.

CHECK (CreditRating >= 1 and CreditRating <= 5)

In dit voorbeeld ziet u een benoemde beperking met een patroonbeperking voor de tekengegevens die zijn ingevoerd in een kolom van een tabel.

CONSTRAINT CK_emp_id CHECK (
    emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
    OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
)

In dit voorbeeld wordt aangegeven dat de waarden in een specifieke lijst moeten staan of een opgegeven patroon moeten volgen.

CHECK (
    emp_id IN ('1389', '0736', '0877', '1622', '1756')
    OR emp_id LIKE '99[0-9][0-9]'
)

F. De volledige tabeldefinitie weergeven

In het volgende voorbeeld ziet u de volledige tabeldefinities met alle beperkingsdefinities voor tabel PurchaseOrderDetail gemaakt in de AdventureWorks2022-database. Als u het voorbeeld wilt uitvoeren, wordt het tabelschema gewijzigd in dbo.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID INT NOT NULL FOREIGN KEY REFERENCES Purchasing.PurchaseOrderHeader (PurchaseOrderID),
    LineNumber SMALLINT NOT NULL,
    ProductID INT NULL FOREIGN KEY REFERENCES Production.Product (ProductID),
    UnitPrice MONEY NULL,
    OrderQty SMALLINT NULL,
    ReceivedQty FLOAT NULL,
    RejectedQty FLOAT NULL,
    DueDate DATETIME NULL,
    rowguid UNIQUEIDENTIFIER CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()) ROWGUIDCOL NOT NULL,
    ModifiedDate DATETIME CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()) NOT NULL,
    LineTotal AS ((UnitPrice * OrderQty)),
    StockedQty AS ((ReceivedQty - RejectedQty)),
    CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber) WITH (IGNORE_DUP_KEY = OFF)
) ON [PRIMARY];

G. Een tabel maken met een XML-kolom die is getypt in een XML-schemaverzameling

In het volgende voorbeeld wordt een tabel gemaakt met een xml kolom die is getypt in de XML-schemaverzameling HRResumeSchemaCollection. Het DOCUMENT trefwoord geeft aan dat elk exemplaar van het xml gegevenstype in column_name slechts één element op het hoogste niveau kan bevatten.

CREATE TABLE HumanResources.EmployeeResumes
(
    LName NVARCHAR (25),
    FName NVARCHAR (25),
    Resume XML(DOCUMENT HumanResources.HRResumeSchemaCollection)
);

H. Een gepartitioneerde tabel maken

In het volgende voorbeeld wordt een partitiefunctie gemaakt om een tabel of index te partitioneren in vier partities. Vervolgens maakt het voorbeeld een partitieschema waarmee de bestandsgroepen worden opgegeven waarin elk van de vier partities moet worden opgeslagen. Ten slotte maakt het voorbeeld een tabel die gebruikmaakt van het partitieschema. In dit voorbeeld wordt ervan uitgegaan dat de bestandsgroepen al bestaan in de database.

CREATE PARTITION FUNCTION myRangePF1(INT)
    AS RANGE LEFT
    FOR VALUES (1, 100, 1000);
GO

CREATE PARTITION SCHEME myRangePS1
    AS PARTITION myRangePF1
    TO (test1fg, test2fg, test3fg, test4fg);
GO

CREATE TABLE PartitionTable
(
    col1 INT,
    col2 CHAR (10)
) ON myRangePS1 (col1);
GO

Op basis van de waarden van kolom col1 van PartitionTableworden de partities op de volgende manieren toegewezen.

Bestandsgroep test1fg test2fg test3fg test4fg
Partition 1 2 3 4
waarden col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1,000 col1 > 1000

Ik. Het gegevenstype UNIQUEIDENTIFIER in een kolom gebruiken

In het volgende voorbeeld wordt een tabel gemaakt met een uniqueidentifier kolom. In het voorbeeld wordt een PRIMAIRE SLEUTEL-beperking gebruikt om de tabel te beveiligen tegen gebruikers die dubbele waarden invoegen en wordt de functie NEWSEQUENTIALID() gebruikt in de DEFAULT beperking om waarden voor nieuwe rijen op te geven. De eigenschap ROWGUIDCOL wordt toegepast op de kolom uniqueidentifier, zodat er naar kan worden verwezen met behulp van het trefwoord $ROWGUID.

CREATE TABLE dbo.Globally_Unique_Data
(
    GUID UNIQUEIDENTIFIER CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name VARCHAR (60) CONSTRAINT Guid_PK PRIMARY KEY (GUID)
);

J. Een expressie gebruiken voor een berekende kolom

In het volgende voorbeeld ziet u het gebruik van een expressie ((low + high)/2) voor het berekenen van de berekende myavg kolom.

CREATE TABLE dbo.mytable
(
    low INT,
    high INT,
    myavg AS (low + high) / 2
);

K. Een berekende kolom maken op basis van een door de gebruiker gedefinieerde kolom

In het volgende voorbeeld wordt een tabel gemaakt met één kolom die is gedefinieerd als door de gebruiker gedefinieerd type utf8string, ervan uitgaande dat de assembly van het type en het type zelf al zijn gemaakt in de huidige database. Een tweede kolom wordt gedefinieerd op basis van utf8stringen gebruikt methode ToString() van type(klasse)utf8string om een waarde voor de kolom te berekenen.

CREATE TABLE UDTypeTable
(
    u UTF8STRING,
    ustr AS u.ToString() PERSISTED
);

L. De functie USER_NAME gebruiken voor een berekende kolom

In het volgende voorbeeld wordt de functie USER_NAME() in de kolom myuser_name gebruikt.

CREATE TABLE dbo.mylogintable
(
    date_in DATETIME,
    user_id INT,
    myuser_name AS USER_NAME()
);

M. Een tabel maken met een FILESTREAM-kolom

In het volgende voorbeeld wordt een tabel gemaakt met een FILESTREAM kolom Photo. Als een tabel een of meer FILESTREAM kolommen bevat, moet de tabel één ROWGUIDCOL kolom hebben.

CREATE TABLE dbo.EmployeePhoto
(
    EmployeeId INT NOT NULL PRIMARY KEY,
    Photo VARBINARY (MAX) FILESTREAM NULL,
    MyRowGuidColumn UNIQUEIDENTIFIER DEFAULT NEWID() ROWGUIDCOL NOT NULL UNIQUE
);

N. Een tabel maken die rijcompressie gebruikt

In het volgende voorbeeld wordt een tabel gemaakt die rijcompressie gebruikt.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 NVARCHAR (200)
)
WITH (DATA_COMPRESSION = ROW);

Zie Gegevenscompressievoor meer voorbeelden van gegevenscompressie.

O. Een tabel maken die gebruikmaakt van XML-compressie

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

In het volgende voorbeeld wordt een tabel gemaakt waarin XML-compressie wordt gebruikt.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 XML
)
WITH (XML_COMPRESSION = ON);

P. Een tabel maken met geparseerd kolommen en een kolomset

In de volgende voorbeelden ziet u hoe u een tabel maakt die een geparseerd kolom bevat en een tabel met twee parseringskolommen en een kolomset. In de voorbeelden wordt de basissyntaxis gebruikt. Zie Sparse-kolommen en Kolomsets gebruikenvoor complexere voorbeelden.

In dit voorbeeld wordt een tabel gemaakt met een sparse-kolom.

CREATE TABLE dbo.T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR (50) SPARSE NULL
);

In dit voorbeeld wordt een tabel gemaakt met twee parseringskolommen en een kolomset met de naam CSet.

CREATE TABLE T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR (50) SPARSE NULL,
    c3 INT SPARSE NULL,
    CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
);

Q. Een tijdelijke tabel op basis van een systeemversie van een schijf maken

van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

In de volgende voorbeelden ziet u hoe u een tijdelijke tabel maakt die is gekoppeld aan een nieuwe geschiedenistabel en hoe u een tijdelijke tabel maakt die is gekoppeld aan een bestaande geschiedenistabel. De tijdelijke tabel moet een primaire sleutel hebben die is gedefinieerd om de tabel in te schakelen voor systeemversiebeheer. Zie Systeemversiebeheer in Voorbeeldenvoor voorbeelden voor voorbeelden in een bestaande tabel voor voorbeelden. Zie Tijdelijke tabellenvoor use cases.

In dit voorbeeld wordt een nieuwe tijdelijke tabel gemaakt die is gekoppeld aan een nieuwe geschiedenistabel.

CREATE TABLE Department
(
    DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);

In dit voorbeeld wordt een nieuwe tijdelijke tabel gemaakt die is gekoppeld aan een bestaande geschiedenistabel.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR (10) NOT NULL,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));

R. Een door het systeem geoptimaliseerde tijdelijke tabel maken

van toepassing op: SQL Server 2016 (13.x) en hoger en Azure SQL Database.

In het volgende voorbeeld ziet u hoe u een door het systeem geoptimaliseerde tijdelijke tabel maakt die is gekoppeld aan een nieuwe tabel met schijfgeschiedenis.

In dit voorbeeld wordt een nieuwe tijdelijke tabel gemaakt die is gekoppeld aan een nieuwe geschiedenistabel.

CREATE SCHEMA History;
GO

CREATE TABLE dbo.Department
(
    DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY NONCLUSTERED,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA, SYSTEM_VERSIONING = ON (HISTORY_TABLE=History.DepartmentHistory));

In dit voorbeeld wordt een nieuwe tijdelijke tabel gemaakt die is gekoppeld aan een bestaande geschiedenistabel.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR (10) NOT NULL,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR (50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR (10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));

S. Een tabel met versleutelde kolommen maken

In het volgende voorbeeld wordt een tabel met twee versleutelde kolommen gemaakt. Zie Always Encryptedvoor meer informatie.

CREATE TABLE Customers
(
    CustName NVARCHAR (60)  ENCRYPTED WITH (
       COLUMN_ENCRYPTION_KEY = MyCEK,
       ENCRYPTION_TYPE = RANDOMIZED,
       ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    ),
    SSN VARCHAR (11) COLLATE Latin1_General_BIN2  ENCRYPTED WITH (
       COLUMN_ENCRYPTION_KEY = MyCEK,
       ENCRYPTION_TYPE = DETERMINISTIC,
       ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    ),
    Age INT NULL
);

T. Een inline gefilterde index maken

Hiermee maakt u een tabel met een inline gefilterde index.

CREATE TABLE t1
(
    c1 INT,
    INDEX IX1 (c1) WHERE c1 > 0
);

U. Een inline-index maken

Hieronder ziet u hoe u NIET GECLUSTERD inline gebruikt voor tabellen op basis van schijven:

CREATE TABLE t1
(
    c1 INT,
    INDEX ix_1 NONCLUSTERED (c1)
);

CREATE TABLE t2
(
    c1 INT,
    c2 INT INDEX ix_1 NONCLUSTERED
);

CREATE TABLE t3
(
    c1 INT,
    c2 INT,
    INDEX ix_1 NONCLUSTERED (c1, c2)
);

V. Een tijdelijke tabel maken met een anonieme primaire sleutel met een samengestelde primaire sleutel

Hiermee maakt u een tabel met een anonieme primaire sleutel met een samengestelde primaire sleutel. Dit is handig om runtimeconflicten te voorkomen waarbij twee tijdelijke tabellen met sessiebereik, elk in een afzonderlijke sessie, dezelfde naam gebruiken voor een beperking.

CREATE TABLE #tmp
(
    c1 INT,
    c2 INT,
    PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO

Als u de beperking expliciet een naam geeft, genereert de tweede sessie een fout zoals:

Msg 2714, Level 16, State 5, Line 1
There is already an object named 'PK_#tmp' in the database.
Msg 1750, Level 16, State 1, Line 1
Could not create constraint or index. See previous errors.

Het probleem ontstaat door het feit dat de naam van de tijdelijke tabel uniek is, dat de namen van beperkingen niet zijn.

W. Globale tijdelijke tabellen gebruiken in Azure SQL Database

Sessie A maakt een globale tijdelijke tabel ##test in Azure SQL Database testdb1 en voegt één rij toe

CREATE TABLE ##test
(
    a INT,
    b INT
);

INSERT INTO ##test
VALUES (1, 1);

-- Obtain object ID for temp table ##test
SELECT OBJECT_ID('tempdb.dbo.##test') AS 'Object ID';

Dit is de resultatenset.

1253579504

De algemene tijdelijke tabelnaam voor een bepaalde object-id 1253579504 verkrijgen in tempdb (2)

SELECT name
FROM tempdb.sys.objects
WHERE object_id = 1253579504;

Dit is de resultatenset.

##test

Sessie B maakt verbinding met Azure SQL Database testdb1 en heeft toegang tot tabel ##test gemaakt door sessie A

SELECT *
FROM ##test;

Dit is de resultatenset.

1, 1

Sessie C maakt verbinding met een andere database in Azure SQL Database testdb2 en wil toegang krijgen tot ##test gemaakt in testdb1. Deze selectie mislukt vanwege het databasebereik voor de globale tijdelijke tabellen

SELECT *
FROM ##test;

Hiermee wordt de volgende fout gegenereerd:

Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

Adresseringssysteemobject in Azure SQL Database tempdb van de huidige gebruikersdatabase testdb1

SELECT *
FROM tempdb.sys.objects;

SELECT *
FROM tempdb.sys.columns;

SELECT *
FROM tempdb.sys.database_files;

X. Bewaarbeleid voor gegevens inschakelen in een tabel

In het volgende voorbeeld wordt een tabel gemaakt met gegevensretentie ingeschakeld en een bewaarperiode van één week. Dit voorbeeld is alleen van toepassing op Azure SQL Edge-.

CREATE TABLE [dbo].[data_retention_table]
(
    [dbdatetime2] DATETIME2 (7),
    [product_code] INT,
    [value] CHAR (10)
)
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ) );

Y. Een updatable grootboektabel maken

In het volgende voorbeeld wordt een updatable grootboektabel gemaakt die geen tijdelijke tabel is met een anonieme geschiedenistabel (het systeem genereert de naam van de geschiedenistabel) en de gegenereerde grootboekweergavenaam. Omdat de namen van de vereiste gegenereerde altijd kolommen en de extra kolommen in de grootboekweergave niet worden opgegeven, hebben de kolommen de standaardnamen.

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary MONEY NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

In het volgende voorbeeld wordt een tabel gemaakt die zowel een tijdelijke tabel als een updatable grootboektabel is, met een anonieme geschiedenistabel (met een naam die door het systeem wordt gegenereerd), de gegenereerde grootboekweergavenaam en de standaardnamen van de gegenereerde altijd kolommen en de extra grootboekweergavekolommen.

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary MONEY NOT NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

In het volgende voorbeeld wordt een tabel gemaakt die zowel een tijdelijke tabel als een updatable grootboektabel is met de expliciet benoemde geschiedenistabel, de door de gebruiker opgegeven naam van de grootboekweergave en de door de gebruiker opgegeven namen van gegenereerde altijd kolommen en extra kolommen in de grootboekweergave.

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary MONEY NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    EndTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL,
    EndSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[HR].[EmployeesHistory]), LEDGER = ON (LEDGER_VIEW=[HR].[EmployeesLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription)));
GO

In het volgende voorbeeld wordt een grootboektabel gemaakt met de gegenereerde namen van de grootboekweergave en de kolommen in de grootboekweergave.

CREATE SCHEMA [AccessControl];
GO

CREATE TABLE [AccessControl].[KeyCardEvents]
(
    EmployeeID INT NOT NULL,
    AccessOperationDescription NVARCHAR (MAX) NOT NULL,
    [Timestamp] DATETIME2 NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
)
WITH (LEDGER = ON (LEDGER_VIEW=[AccessControl].[KeyCardEventsLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription),APPEND_ONLY= ON));
GO

In het volgende voorbeeld wordt een grootboekdatabase gemaakt in Azure SQL Database en een tabel met een updatable grootboek met behulp van de standaardinstellingen. Voor het maken van een updatable grootboektabel in een grootboekdatabase is het gebruik van WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);niet vereist.

CREATE DATABASE MyLedgerDB
    (EDITION = 'GeneralPurpose')
    WITH LEDGER = ON;
GO

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary MONEY NOT NULL
);
GO