Dela via


SKAPA TABELL (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Skapar en ny tabell i databasen.

Not

Referens till Warehouse i Microsoft Fabric finns i CREATE TABLE (Fabric Data Warehouse). Referens till Azure Synapse Analytics and Analytics Platform System (PDW) finns i CREATE TABLE (Azure Synapse Analytics).

Transact-SQL syntaxkonventioner

Syntaxalternativ

Vanlig syntax

Enkel CREATE TABLE-syntax (vanlig om den inte använder alternativ):

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

Fullständig syntax

Diskbaserad CREATE TABLE-syntax:

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>

Syntax för minnesoptimerade tabeller

Minnesoptimerad CREATE TABLE-syntax:

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

}

Argument

database_name

Namnet på databasen där tabellen skapas. database_name måste ange namnet på en befintlig databas. Om det inte anges database_name standardvärdet för den aktuella databasen. Inloggningen för den aktuella anslutningen måste vara associerad med ett befintligt användar-ID i databasen som anges av database_nameoch att användar-ID måste ha behörigheten SKAPA TABELL.

schema_name

Namnet på schemat som den nya tabellen tillhör.

table_name

Namnet på den nya tabellen. Tabellnamn måste följa reglerna för identifierare. table_name kan innehålla högst 128 tecken, förutom lokala temporära tabellnamn (namn med ett enda taltecken (#)) som inte får överstiga 116 tecken.

AS FileTable

gäller för: SQL Server 2012 (11.x) och senare.

Skapar den nya tabellen som en FileTable. Du anger inte kolumner eftersom en FileTable har ett fast schema. Mer information finns i FileTables.

column_name AS-computed_column_expression

Ett uttryck som definierar värdet för en beräknad kolumn. En beräknad kolumn är en virtuell kolumn som inte lagras fysiskt i tabellen, såvida inte kolumnen har markerats SOM PERSISTED. Kolumnen beräknas från ett uttryck som använder andra kolumner i samma tabell. En beräknad kolumn kan till exempel ha definitionen: cost AS price * qty. Uttrycket kan vara ett icke-inberäknat kolumnnamn, konstant, funktion, variabel och valfri kombination av dessa som är anslutna av en eller flera operatorer. Uttrycket kan inte vara en underfråga eller innehålla aliasdatatyper.

Beräknade kolumner kan användas i utvalda listor, WHERE-satser, ORDER BY-satser eller andra platser där reguljära uttryck kan användas, med följande undantag:

  • Beräknade kolumner måste markeras SOM PERSISTED för att delta i villkoret FOREIGN KEY eller CHECK.

  • En beräknad kolumn kan användas som en nyckelkolumn i ett index eller som en del av en primärnyckel eller unik begränsning, om det beräknade kolumnvärdet definieras av ett deterministiskt uttryck och datatypen för resultatet tillåts i indexkolumner.

    Om tabellen till exempel har heltalskolumner a och bkan den beräknade kolumnen a + b indexeras, men den beräknade kolumnen a + DATEPART(dd, GETDATE()) kan inte indexeras eftersom värdet kan ändras i efterföljande anrop.

  • En beräknad kolumn kan inte vara målet för en INSERT- eller UPDATE-instruktion.

Not

Varje rad i en tabell kan ha olika värden för kolumner som ingår i en beräknad kolumn. Därför kanske den beräknade kolumnen inte har samma värde för varje rad.

Baserat på de uttryck som används bestäms nullabiliteten för beräknade kolumner automatiskt av databasmotorn. Resultatet av de flesta uttryck anses vara nullbart även om det bara finns icke-inullbara kolumner, eftersom möjliga underflöden eller spill också ger NULL-resultat. Använd funktionen COLUMNPROPERTY med egenskapen AllowsNull för att undersöka nullbarheten för alla beräknade kolumner i en tabell. Ett uttryck som är null kan omvandlas till ett icke-inullbart uttryck genom att ange ISNULL med konstanten check_expression, där konstanten är ett icke-nollvärde som ersätts med null-resultat. BEHÖRIGHETEN REFERENSER för typen krävs för beräknade kolumner baserat på clr-användardefinierade typuttryck (Common Language Runtime).

FRAMHÄRDADE

Anger att SQL Server Database Engine fysiskt lagrar de beräknade värdena i tabellen och uppdaterar värdena när andra kolumner som den beräknade kolumnen är beroende av uppdateras. Genom att markera en beräknad kolumn som PERSISTED kan du skapa ett index på en beräknad kolumn som är deterministisk, men inte exakt. Mer information finns i Index på beräknade kolumner. Alla beräknade kolumner som används som partitioneringskolumner i en partitionerad tabell måste uttryckligen markeras PERSISTED. computed_column_expression måste vara deterministisk när PERSISTED anges.

PÅ { partition_scheme | filgrupp | "standard" }

Anger partitionsschemat eller filgruppen som tabellen lagras i. Om partition_scheme anges ska tabellen vara en partitionerad tabell vars partitioner lagras i en uppsättning med en eller flera filgrupper som anges i partition_scheme. Om filgrupp anges lagras tabellen i den namngivna filgruppen. Filgruppen måste finnas i databasen. Om "default" har angetts, eller om ON inte har angetts alls, lagras tabellen i standardfilgruppen. Lagringsmekanismen för en tabell som anges i CREATE TABLE kan inte ändras senare.

PÅ { partition_scheme | filgrupp | "default" } kan också anges i en PRIMÄRNYCKEL eller UNIK-begränsning. Dessa begränsningar skapar index. Om filgrupp anges lagras indexet i den namngivna filgruppen. Om "default" anges, eller om ON inte har angetts alls, lagras indexet i samma filgrupp som tabellen. Om begränsningen PRIMÄRNYCKEL eller UNIK skapar ett grupperat index lagras datasidorna för tabellen i samma filgrupp som indexet. Om CLUSTERED anges eller om villkoret på annat sätt skapar ett klustrat index och en partition_scheme anges som skiljer sig från partition_scheme eller filgrupp tabelldefinitionen, eller vice versa, kommer endast begränsningsdefinitionen att respekteras och den andra ignoreras.

Not

I det här sammanhanget är standard inte ett nyckelord. Det är en identifierare för standardfilgruppen och måste avgränsas, som i ON "default" eller ON [default]. Om "default" anges måste alternativet QUOTED_IDENTIFIER vara PÅ för den aktuella sessionen. Det här är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.

När du har skapat en partitionerad tabell bör du överväga att ange alternativet LOCK_ESCALATION för tabellen till AUTO. Detta kan förbättra samtidigheten genom att aktivera lås för att eskalera till partitionsnivå (HoBT) i stället för tabellen. Mer information finns i ALTER TABLE.

TEXTIMAGE_ON { filgrupp | "standard" }

Anger att text, ntext, bild, xml, varchar(max), nvarchar(max), varbinary(max)och CLR-användardefinierade typkolumner (inklusive geometri och geografi) lagras i den angivna filgruppen.

TEXTIMAGE_ON tillåts inte om det inte finns några kolumner med stora värden i tabellen. TEXTIMAGE_ON kan inte anges om partition_scheme har angetts. Om "default" anges, eller om TEXTIMAGE_ON inte har angetts alls, lagras kolumnerna med stora värden i standardfilgruppen. Lagringen av kolumndata med stora värden som anges i CREATE TABLE kan inte ändras senare.

Not

varchar(max), nvarchar(max), varbinary(max), xml och stora UDT-värden lagras direkt på dataraden, upp till en gräns på 8 000 byte och så länge värdet får plats i posten. Om värdet inte får plats i posten lagras en pekare på rad och resten lagras på rad i LOB-lagringsutrymmet. 0 är standardvärdet, vilket anger att alla värden lagras direkt på dataraden.

TEXTIMAGE_ON ändrar bara platsen för "LOB-lagringsutrymmet" påverkar det inte när data lagras på rad. Använd alternativ för stora värdetyper från rad i sp_tableoption för att lagra hela LOB-värdet från raden.

I det här sammanhanget är standard inte ett nyckelord. Det är en identifierare för standardfilgruppen och måste avgränsas, som i TEXTIMAGE_ON "default" eller TEXTIMAGE_ON [default]. Om "default" anges måste alternativet QUOTED_IDENTIFIER vara PÅ för den aktuella sessionen. Det här är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | filgrupp | "standard" }

gäller för: SQL Server 2008 R2 (10.50.x) och senare. Azure SQL Database och Azure SQL Managed Instance stöder inte FILESTREAM.

Anger filgruppen för FILESTREAM-data.

Om tabellen innehåller FILESTREAM-data och tabellen partitioneras måste FILESTREAM_ON-satsen inkluderas och måste ange ett partitionsschema med FILESTREAM-filgrupper. Det här partitionsschemat måste använda samma partitionsfunktion och partitionskolumner som partitionsschemat för tabellen. annars utlöses ett fel.

Om tabellen inte är partitionerad kan kolumnen FILESTREAM inte partitioneras. FILESTREAM-data för tabellen måste lagras i en enda filgrupp. Den här filgruppen anges i FILESTREAM_ON-satsen.

Om tabellen inte är partitionerad och FILESTREAM_ON-satsen inte har angetts används filgruppen FILESTREAM som har DEFAULT egenskapsuppsättning. Om det inte finns någon FILESTREAM-filgrupp utlöses ett fel.

Precis som med ON och TEXTIMAGE_ONkan värdet som anges med hjälp av CREATE TABLE för FILESTREAM_ON inte ändras, förutom i följande fall:

  • En CREATE INDEX--instruktion konverterar en heap till ett grupperat index. I det här fallet kan en annan FILESTREAM-filgrupp, partitionsschema eller NULL anges.
  • En DROP INDEX--instruktion konverterar ett klustrat index till en heap. I det här fallet kan en annan FILESTREAM-filgrupp, partitionsschema eller "default" anges.

Filgruppen i FILESTREAM_ON <filegroup>-satsen, eller varje FILESTREAM-filgrupp som namnges i partitionsschemat, måste ha en fil definierad för filgruppen. Den här filen måste definieras med hjälp av en CREATE DATABASE eller ALTER DATABASE-instruktionen. annars utlöses ett fel.

Relaterade FILESTREAM-artiklar finns i Binary Large Object – Blob Data.

[ type_schema_name. ] type_name

Anger datatypen för kolumnen och det schema som den tillhör. För diskbaserade tabeller använder du någon av följande datatyper:

  • En systemdatatyp
  • En aliastyp som baseras på en SQL Server-systemdatatyp. Aliasdatatyper skapas med instruktionen CREATE TYPE innan de kan användas i en tabelldefinition. NULL- eller NOT NULL-tilldelningen för en aliasdatatyp kan åsidosättas under CREATE TABLE-instruktionen. Det går dock inte att ändra längdspecifikationen. Längden för en aliasdatatyp kan inte anges i en CREATE TABLE-instruktion.
  • En CLR-användardefinierad typ. CLR-användardefinierade typer skapas med CREATE TYPE-instruktionen innan de kan användas i en tabelldefinition. Om du vill skapa en kolumn med användardefinierad CLR-typ krävs behörigheten REFERENSER för typen.

Om type_schema_name inte anges refererar SQL Server Database Engine till type_name i följande ordning:

  • SQL Server-systemdatatypen.
  • Standardschemat för den aktuella användaren i den aktuella databasen.
  • Det dbo schemat i den aktuella databasen.

För minnesoptimerade tabeller, se Datatyper som stöds för In-Memory OLTP- för en lista över systemtyper som stöds.

  • precision

    Precisionen för den angivna datatypen. Mer information om giltiga precisionsvärden finns i Precision, Skala och Längd.

  • skala

    Skalan för den angivna datatypen. Mer information om giltiga skalningsvärden finns i Precision, Skala och Längd.

  • max

    Gäller endast för varchar, nvarcharoch varbinära datatyper för lagring av 2^31 byte tecken och binära data och 2^30 byte Unicode-data.

INNEHÅLL

Anger att varje instans av XML datatyp i column_name kan innehålla flera element på den översta nivån. INNEHÅLL gäller endast för XML- datatyp och kan endast anges om xml_schema_collection också anges. Om det inte anges är CONTENT standardbeteendet.

DOKUMENT

Anger att varje instans av XML datatyp i column_name endast får innehålla ett element på den översta nivån. DOCUMENT gäller endast för XML- datatyp och kan endast anges om xml_schema_collection också anges.

xml_schema_collection

Gäller endast för XML- datatyp för att associera en XML-schemasamling med typen . Innan du skriver en xml- kolumn i ett schema måste schemat först skapas i databasen med hjälp av CREATE XML SCHEMA COLLECTION.

STANDARD

Anger det värde som anges för kolumnen när ett värde inte uttryckligen anges under en infogning. Standarddefinitioner kan tillämpas på alla kolumner förutom de som definieras som tidsstämpel, eller de med egenskapen IDENTITY. Om ett standardvärde anges för en användardefinierad typkolumn bör typen ha stöd för en implicit konvertering från constant_expression till den användardefinierade typen. STANDARDdefinitioner tas bort när tabellen tas bort. Endast ett konstant värde, till exempel en teckensträng; en skalär funktion (antingen ett system, en användardefinierad funktion eller en CLR-funktion); eller NULL kan användas som standard. För att upprätthålla kompatibilitet med tidigare versioner av SQL Server kan ett villkorsnamn tilldelas till en DEFAULT.

  • constant_expression

    En konstant, NULL eller en systemfunktion som används som standardvärde för kolumnen.

  • memory_optimized_constant_expression

    En konstant, NULL eller en systemfunktion som stöds i används som standardvärde för kolumnen. Måste stödjas i inbyggda kompilerade lagrade procedurer. Mer information om inbyggda funktioner i inbyggda kompilerade lagrade procedurer finns i funktioner som stöds för internt kompilerade T-SQL-moduler.

IDENTITET

Anger att den nya kolumnen är en identitetskolumn. När en ny rad läggs till i tabellen ger databasmotorn ett unikt, inkrementellt värde för kolumnen. Identitetskolumner används vanligtvis med primary key-begränsningar för att fungera som den unika radidentifieraren för tabellen. Egenskapen IDENTITY kan tilldelas till tinyint, smallint, int, bigint, decimal(p, 0)eller numeriska(p, 0) kolumner. Endast en identitetskolumn kan skapas per tabell. Bundna standardvärden och STANDARDvillkor kan inte användas med en identitetskolumn. Både fröet och inkrementet eller inget av dem måste anges. Om inget av dem anges är standardvärdet (1,1).

  • frö

    Det värde som används för den första raden som läses in i tabellen.

  • öka

    Det inkrementella värdet som lades till i identitetsvärdet för föregående rad som lästes in.

INTE FÖR REPLIKERING

I CREATE TABLE-instruktionen kan NOT FOR REPLICATION-satsen anges för begränsningarna IDENTITY,FOREIGN KEY och CHECK. Om den här satsen anges för egenskapen IDENTITY ökas inte värdena i identitetskolumner när replikeringsagenter utför infogningar. Om den här satsen anges för en begränsning tillämpas inte villkoret när replikeringsagenter utför åtgärder för att infoga, uppdatera eller ta bort.

GENERERAS ALLTID SOM { RAD | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] [ NOT NULL ]

gäller för: SQL Server 2016 (13.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Anger en kolumn som används av systemet för att automatiskt registrera information om radversioner i tabellen och dess historiktabell (om tabellen är systemversionerad och har en historiktabell). Använd det här argumentet med parametern WITH SYSTEM_VERSIONING = ON för att skapa systemversionstabeller: temporala tabeller eller transaktionsregistertabeller. Mer information finns i uppdateringsbara transaktionsregistertabeller och temporala tabeller.

Parameter Nödvändig datatyp Obligatorisk nullabilitet Beskrivning
RAD datetime2 START: NOT NULL
SLUT: NOT NULL
Antingen starttiden för vilken en radversion är giltig (START) eller den sluttid för vilken en radversion är giltig (END). Använd det här argumentet med argumentet PERIOD FOR SYSTEM_TIME för att skapa en temporal tabell.
TRANSACTION_ID bigint START: NOT NULL
SLUT: NULL
gäller för: SQL Server 2022 (16.x) och senare samt Azure SQL Database.

ID:t för den transaktion som skapar (START) eller ogiltigförklarar (END) en radversion. Om tabellen är en transaktionsregistertabell refererar ID:t till en rad i vyn sys.database_ledger_transactions
SEQUENCE_NUMBER bigint START: NOT NULL
SLUT: NULL
gäller för: SQL Server 2022 (16.x) och senare samt Azure SQL Database.

Sekvensnumret för en åtgärd som skapar (START) eller tar bort (END) en radversion. Det här värdet är unikt i transaktionen.

Om du försöker ange en kolumn som inte uppfyller ovanstående datatyp eller krav på nullabilitet utlöser systemet ett fel. Om du inte uttryckligen anger nullability definierar systemet kolumnen som NULL eller NOT NULL enligt ovanstående krav.

Du kan markera en eller båda periodkolumnerna med HIDDEN flagga för att implicit dölja dessa kolumner så att SELECT * FROM <table> inte returnerar något värde för dessa kolumner. Periodkolumner är som standard inte dolda. För att kunna användas måste dolda kolumner uttryckligen inkluderas i alla frågor som direkt refererar till den temporala tabellen. Om du vill ändra attributet HIDDEN för en befintlig periodkolumn måste PERIOD tas bort och återskapas med en annan dold flagga.

INDEX index_name [ KLUSTRAD | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )

gäller för: SQL Server 2014 (12.x) och senare samt Azure SQL Database.

Anger att du vill skapa ett index i tabellen. Detta kan vara ett klustrat index eller ett icke-grupperat index. Indexet innehåller de kolumner som visas och sorterar data i antingen stigande eller fallande ordning.

INDEX INDEX_NAME KLUSTRAD COLUMNSTORE

gäller för: SQL Server 2014 (12.x) och senare samt Azure SQL Database.

Anger att hela tabellen ska lagras i kolumnformat med ett grupperat columnstore-index. Detta inkluderar alltid alla kolumner i tabellen. Data sorteras inte i alfabetisk eller numerisk ordning eftersom raderna ordnas för att få komprimeringsfördelar för kolumnlagring.

Du kan ange en ordning för data i ett grupperat columnstore-index som börjar med SQL Server 2022 (16.x), i Azure SQL Database, i Azure SQL Managed Instance med Princip för uppdateringup-to-datumoch i Azure Synapse Analytics. Mer information finns i Prestandajustering med ordnade columnstore-index.

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

gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.

Anger att du vill skapa ett icke-illustrerat kolumnlagringsindex i tabellen. Den underliggande tabellen kan vara en radlagrings heap eller klustrat index, eller så kan det vara ett grupperat kolumnlagringsindex. När du skapar ett icke-grupperat kolumnlagringsindex i en tabell lagras i alla fall en andra kopia av data för kolumnerna i indexet.

Det icke-grupperade kolumnlagringsindexet lagras och hanteras som ett grupperat kolumnlagringsindex. Det kallas för ett icke-grupperat kolumnlagringsindex eftersom kolumnerna kan begränsas och finns som ett sekundärt index i en tabell.

Du kan ange en order för data i ett icke-grupperat kolumnlagringsindex i Azure SQL Database och i Azure SQL Managed Instance med uppdateringsprincipen Always-up-to-date. Mer information finns i Prestandajustering med ordnade columnstore-index.

partition_scheme_name ( column_name )

Anger partitionsschemat som definierar de filgrupper som partitionerna i ett partitionerat index ska mappas till. Partitionsschemat måste finnas i databasen genom att antingen köra CREATE PARTITION SCHEME eller ALTER PARTITION SCHEME. column_name anger den kolumn som ett partitionerat index ska partitioneras mot. Den här kolumnen måste matcha datatypen, längden och precisionen för argumentet för partitionsfunktionen som partition_scheme_name använder. column_name är inte begränsat till kolumnerna i indexdefinitionen. Alla kolumner i bastabellen kan anges, förutom när du partitionerar ett UNIKT index, column_name måste väljas bland dem som används som unik nyckel. Med den här begränsningen kan databasmotorn endast verifiera att nyckelvärdena är unika inom en enda partition.

Not

När du partitionerar ett icke-unikt grupperat index lägger databasmotorn som standard till partitioneringskolumnen i listan över klustrade indexnycklar, om den inte redan har angetts. När du partitionerar ett icke-unikt, icke-grupperat index lägger databasmotorn till partitioneringskolumnen som en icke-nyckelkolumn (ingår) i indexet, om den inte redan har angetts.

Om partition_scheme_name eller filgrupp inte anges och tabellen partitioneras placeras indexet i samma partitionsschema med samma partitioneringskolumn som den underliggande tabellen.

Not

Du kan inte ange ett partitioneringsschema för ett XML-index. Om bastabellen är partitionerad använder XML-indexet samma partitionsschema som tabellen.

Mer information om partitionering av index finns partitionerade tabeller och index.

filegroup_name

Skapar det angivna indexet för den angivna filgruppen. Om ingen plats har angetts och tabellen eller vyn inte är partitionerad använder indexet samma filgrupp som den underliggande tabellen eller vyn. Filgruppen måste redan finnas.

PÅ "standard"

Skapar det angivna indexet för standardfilgruppen.

Not

I det här sammanhanget är standard inte ett nyckelord. Det är en identifierare för standardfilgruppen och måste avgränsas, som i ON "default" eller ON [default]. Om "default" anges måste alternativet QUOTED_IDENTIFIER vara PÅ för den aktuella sessionen. Det här är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.

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

gäller för: SQL Server 2008 R2 (10.50.x) och senare.

Anger placeringen av FILESTREAM-data för tabellen när ett klustrat index skapas. Med FILESTREAM_ON-satsen kan FILESTREAM-data flyttas till ett annat FILESTREAM-filgrupps- eller partitionsschema.

filestream_filegroup_name är namnet på en FILESTREAM-filgrupp. Filgruppen måste ha en fil definierad för filgruppen med hjälp av en CREATE DATABASE eller ALTER DATABASE-instruktion. annars utlöses ett fel.

Om tabellen är partitionerad måste FILESTREAM_ON-satsen ingå och ange ett partitionsschema med FILESTREAM-filgrupper som använder samma partitionsfunktion och partitionskolumner som partitionsschemat för tabellen. Annars utlöses ett fel.

Om tabellen inte är partitionerad kan kolumnen FILESTREAM inte partitioneras. FILESTREAM-data för tabellen måste lagras i en enda filgrupp som anges i FILESTREAM_ON-satsen.

FILESTREAM_ON NULL kan anges i en CREATE INDEX-instruktion om ett klustrat index skapas och tabellen inte innehåller någon FILESTREAM-kolumn.

Mer information finns i FILESTREAM-.

ROWGUIDCOL

Anger att den nya kolumnen är en GUID-radkolumn. Endast en unikidentifierare kolumn per tabell kan betecknas som KOLUMNEN ROWGUIDCOL. Om du använder egenskapen ROWGUIDCOL kan kolumnen refereras med $ROWGUID. Egenskapen ROWGUIDCOL kan endast tilldelas till en unikidentifierare kolumn. Användardefinierade datatypskolumner kan inte anges med ROWGUIDCOL.

Egenskapen ROWGUIDCOL framtvingar inte unikhet för de värden som lagras i kolumnen. ROWGUIDCOL genererar inte heller automatiskt värden för nya rader som infogas i tabellen. Om du vill generera unika värden för varje kolumn använder du antingen NEWID- eller FUNKTIONEN NEWSEQUENTIALIDINSERT--instruktioner eller använder dessa funktioner som standard för kolumnen.

KRYPTERAD MED

Anger kryptering av kolumner med hjälp av funktionen Always Encrypted.

  • COLUMN_ENCRYPTION_KEY = key_name

    Anger kolumnkrypteringsnyckeln. Mer information finns i CREATE COLUMN ENCRYPTION KEY.

  • ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMISERAD }

    Deterministisk kryptering använder en metod som alltid genererar samma krypterade värde för ett visst oformaterat textvärde. Med deterministisk kryptering kan du söka med likhetsjämförelse, gruppering och koppling av tabeller med hjälp av likhetskopplingar baserat på krypterade värden, men kan också tillåta obehöriga användare att gissa information om krypterade värden genom att undersöka mönster i den krypterade kolumnen. Det går bara att koppla två tabeller till kolumner som krypterats deterministiskt om båda kolumnerna krypteras med samma kolumnkrypteringsnyckel. Deterministisk kryptering måste använda en kolumnsortering med en binär2-sorteringsordning för teckenkolumner.

    Randomiserad kryptering använder en metod som krypterar data på ett mindre förutsägbart sätt. Randomiserad kryptering är säkrare, men förhindrar alla beräkningar och indexering på krypterade kolumner, såvida inte SQL Server-instansen stöder Always Encrypted med säkra enklaver. Mer information finns i Always Encrypted med säkra enklaver.

    Om du använder Always Encrypted (utan säkra enklaver) använder du deterministisk kryptering för kolumner som söks med parametrar eller grupperingsparametrar, till exempel ett myndighets-ID-nummer. Använd randomiserad kryptering för data som kreditkortsnummer, som inte är grupperade med andra poster eller används för att koppla tabeller, och som inte söks efter eftersom du använder andra kolumner (till exempel ett transaktionsnummer) för att hitta raden som innehåller den krypterade kolumnen av intresse.

    Om du använder Always Encrypted med säkra enklaver är randomiserad kryptering en rekommenderad krypteringstyp.

    Kolumner måste ha en kvalificerande datatyp.

  • ALGORITM

    gäller för: SQL Server 2016 (13.x) och senare.

    Måste vara 'AEAD_AES_256_CBC_HMAC_SHA_256'.

    Mer information, inklusive funktionsbegränsningar, finns i Always Encrypted.

GLES

Anger att kolumnen är en gles kolumn. Lagringen av glesa kolumner är optimerad för null-värden. Det går inte att ange glesa kolumner som INTE NULL. Ytterligare begränsningar och mer information om glesa kolumner finns i Använda glesa kolumner.

MASKERAD MED ( FUNCTION = 'mask_function' )

gäller för: SQL Server 2016 (13.x) och senare.

Anger en dynamisk datamask. mask_function är namnet på maskeringsfunktionen med lämpliga parametrar. Fyra funktioner är tillgängliga:

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

Kräver ALTER ANY MASK behörighet.

För funktionsparametrar, se Dynamisk datamaskering.

FILESTREAM

gäller för: SQL Server 2008 R2 (10.50.x) och senare.

Gäller endast för varbinary(max) kolumner. Anger FILESTREAM-lagring för varbinary(max) BLOB-data.

Tabellen måste också ha en kolumn med unikidentifierare datatyp som har attributet ROWGUIDCOL. Den här kolumnen får inte tillåta null-värden och måste ha villkoret UNIK eller PRIMÄRNYCKEL för en kolumn. GUID-värdet för kolumnen måste anges antingen av ett program när data infogas eller av en STANDARD-begränsning som använder funktionen NEWID ().

Det går inte att ta bort ROWGUIDCOL-kolumnen och de relaterade begränsningarna kan inte ändras när det finns en FILESTREAM-kolumn som definierats för tabellen. Kolumnen ROWGUIDCOL kan bara tas bort när den sista FILESTREAM-kolumnen har tagits bort.

När filestream-lagringsattributet har angetts för en kolumn lagras alla värden för kolumnen i en FILESTREAM-datacontainer i filsystemet.

SORTERA COLLATION_NAME

Anger sortering för kolumnen. Sorteringsnamnet kan vara antingen ett Windows-sorteringsnamn eller ett SQL-sorteringsnamn. collation_name gäller endast för kolumner i char, varchar, text, nchar, nvarcharoch ntext datatyper. Om den inte anges tilldelas kolumnen antingen sortering av den användardefinierade datatypen, om kolumnen är av en användardefinierad datatyp eller standardsortering av databasen.

Mer information om Windows- och SQL-sorteringsnamn finns i Windows-sorteringsnamn och SQL-sorteringsnamn.

Mer information finns i COLLATE.

TVÅNG

Ett valfritt nyckelord som anger början av definitionen av en PRIMÄRNYCKEL, INTE NULL, UNIK, SEKUNDÄRNYCKEL eller CHECK-begränsning.

  • constraint_name

    Namnet på en begränsning. Villkorsnamn måste vara unika i det schema som tabellen tillhör.

  • NULL | INTE NULL

    Avgör om null-värden tillåts i kolumnen. NULL är inte strikt en begränsning, men kan anges precis som INTE NULL. INTE NULL kan endast anges för beräknade kolumner om PERSISTED också har angetts.

  • PRIMÄRNYCKEL

    En begränsning som framtvingar entitetsintegritet för en angiven kolumn eller kolumner via ett unikt index. Endast en primärnyckelbegränsning kan skapas per tabell.

  • UNIK

    En begränsning som ger entitetsintegritet för en angiven kolumn eller kolumner via ett unikt index. En tabell kan ha flera UNIKA begränsningar.

  • KLUSTRAD | NONCLUSTERED

    Anger att ett grupperat index eller ett icke-grupperat index skapas för begränsningen PRIMÄRNYCKEL eller UNIK. Primärnyckelbegränsningarna är som standard klustrade och UNIKA begränsningar som standard för NONCLUSTERED.

    I en CREATE TABLE-instruktion kan CLUSTERED endast anges för en begränsning. Om CLUSTERED har angetts för en UNIK begränsning och en PRIMARY KEY-begränsning också anges, är primärnyckeln standardinställningen NONCLUSTERED.

  • REFERENSER FÖR SEKUNDÄRNYCKEL

    En begränsning som ger referensintegritet för data i kolumnen eller kolumnerna. Begränsningar för SEKUNDÄRNYCKEL kräver att varje värde i kolumnen finns i motsvarande refererade kolumn eller kolumner i den refererade tabellen. Begränsningar för SEKUNDÄRNYCKEL kan endast referera till kolumner som är PRIMÄRNYCKEL eller UNIKA begränsningar i den refererade tabellen eller kolumnerna som refereras i ett UNIKT INDEX i den refererade tabellen. Sekundärnycklar på beräknade kolumner måste också markeras SOM PERSISTED.

  • [ [ schema_name. ] referenced_table_name ]

    Namnet på tabellen som refereras till av villkoret FOREIGN KEY och det schema som den tillhör.

  • ( ref_column [ ,... n ] )

    En kolumn, eller en lista med kolumner, från tabellen som refereras till av villkoret FOREIGN KEY.

  • VID BORTTAGNING { INGEN ÅTGÄRD | CASCADE | ANGE NULL | ANGE STANDARD }

    Anger vilken åtgärd som händer med rader i den skapade tabellen, om dessa rader har en referensrelation och den refererade raden tas bort från den överordnade tabellen. Standardvärdet är INGEN ÅTGÄRD.

  • INGEN ÅTGÄRD

    Databasmotorn genererar ett fel och borttagningsåtgärden på raden i den överordnade tabellen återställs.

  • KASKAD

    Motsvarande rader tas bort från referenstabellen om den raden tas bort från den överordnade tabellen.

  • ANGE NULL

    Alla värden som utgör sekundärnyckeln anges till NULL om motsvarande rad i den överordnade tabellen tas bort. För att den här begränsningen ska kunna köras måste sekundärnyckelkolumnerna vara nullbara.

  • ANGE STANDARD

    Alla värden som utgör sekundärnyckeln anges till deras standardvärden när motsvarande rad i den överordnade tabellen tas bort. För att den här begränsningen ska kunna köras måste alla sekundärnyckelkolumner ha standarddefinitioner. Om en kolumn är nullbar och det inte finns någon explicit standardvärdeuppsättning blir NULL kolumnens implicita standardvärde.

    Ange inte CASCADE om tabellen ska ingå i en sammanslagningspublikation som använder logiska poster. Mer information om logiska poster finns i Gruppändringar till relaterade rader med logiska poster.

    ON DELETE CASCADE kan inte definieras om det redan finns en INSTEAD OF utlösare ON DELETE i tabellen.

    I AdventureWorks2022-databasen har till exempel tabellen ProductVendor en referensrelation till tabellen Vendor. Den ProductVendor.BusinessEntityID sekundärnyckeln refererar till den Vendor.BusinessEntityID primära nyckeln.

    Om en DELETE-instruktion körs på en rad i tabellen Vendor och en ON DELETE CASCADE-åtgärd har angetts för ProductVendor.BusinessEntityIDsöker databasmotorn efter en eller flera beroende rader i tabellen ProductVendor. Om det finns några tas de beroende raderna i tabellen ProductVendor bort och även raden som refereras i tabellen Vendor.

    Om NO ACTION anges genererar databasmotorn ett fel och återställer borttagningsåtgärden på den Vendor raden om det finns minst en rad i tabellen ProductVendor som refererar till den.

  • VID UPPDATERING { INGEN ÅTGÄRD | CASCADE | ANGE NULL | ANGE STANDARD }

    Anger vilken åtgärd som händer med rader i tabellen som ändras när dessa rader har en referensrelation och den refererade raden uppdateras i den överordnade tabellen. Standardvärdet är INGEN ÅTGÄRD.

  • INGEN ÅTGÄRD

    Databasmotorn genererar ett fel och uppdateringsåtgärden på raden i den överordnade tabellen återställs.

  • KASKAD

    Motsvarande rader uppdateras i referenstabellen när den raden uppdateras i den överordnade tabellen.

  • ANGE NULL

    Alla värden som utgör sekundärnyckeln anges till NULL när motsvarande rad i den överordnade tabellen uppdateras. För att den här begränsningen ska kunna köras måste sekundärnyckelkolumnerna vara nullbara.

  • ANGE STANDARD

    Alla värden som utgör sekundärnyckeln anges till deras standardvärden när motsvarande rad i den överordnade tabellen uppdateras. För att den här begränsningen ska kunna köras måste alla sekundärnyckelkolumner ha standarddefinitioner. Om en kolumn är nullbar och det inte finns någon explicit standardvärdeuppsättning blir NULL kolumnens implicita standardvärde.

    Ange inte CASCADE om tabellen ska ingå i en sammanslagningspublikation som använder logiska poster. Mer information om logiska poster finns i Gruppändringar till relaterade rader med logiska poster.

    ON UPDATE CASCADE, SET NULLeller SET DEFAULT kan inte definieras om det redan finns en INSTEAD OF utlösare ON UPDATE i tabellen som ändras.

    I AdventureWorks2022-databasen har till exempel tabellen ProductVendor en referensrelation med tabellen Vendor: ProductVendor.BusinessEntity sekundärnyckel refererar till den Vendor.BusinessEntityID primära nyckeln.

    Om en UPDATE-instruktion körs på en rad i tabellen Vendor och en PÅ UPDATE CASCADE-åtgärd har angetts för ProductVendor.BusinessEntityIDsöker databasmotorn efter en eller flera beroende rader i tabellen ProductVendor. Om det finns några uppdateras de beroende raderna i tabellen ProductVendor och även raden som refereras till i tabellen Vendor.

    Om ingen åtgärd anges genererar databasmotorn ett fel och återställer uppdateringsåtgärden på Vendor raden om det finns minst en rad i tabellen ProductVendor som refererar till den.

  • CHECK

    En begränsning som framtvingar domänintegritet genom att begränsa de möjliga värden som kan anges i en kolumn eller kolumner. CHECK-begränsningar för beräknade kolumner måste också markeras SOM PERSISTED.

  • logical_expression

    Ett logiskt uttryck som returnerar TRUE eller FALSE. Aliasdatatyper kan inte ingå i uttrycket.

  • column_name

    En kolumn eller lista med kolumner, inom parenteser, som används i tabellbegränsningar för att ange de kolumner som används i villkorsdefinitionen.

  • [ ASC | DESC ]

    Anger i vilken ordning kolumnen eller kolumnerna som ingår i tabellbegränsningarna sorteras. Standardvärdet är ASC.

  • partition_scheme_name

    Namnet på partitionsschemat som definierar de filgrupper som partitionerna i en partitionerad tabell ska mappas till. Partitionsschemat måste finnas i databasen.

  • [ partition_column_name. ]

    Anger den kolumn som en partitionerad tabell ska partitioneras mot. Kolumnen måste matcha den som anges i partitionsfunktionen som partition_scheme_name använder när det gäller datatyp, längd och precision. En beräknad kolumn som deltar i en partitionsfunktion måste uttryckligen markeras SOM PERSISTED.

    Viktig

    Vi rekommenderar att du anger NOT NULL i partitioneringskolumnen för partitionerade tabeller och även icke-partitionerade tabeller som är källor eller mål för ALTER TABLE... SWITCH-åtgärder. Om du gör detta ser du till att alla CHECK-begränsningar för partitioneringskolumner inte behöver söka efter null-värden.

  • MED FILLFACTOR = fillfactor

    Anger hur fullständig databasmotorn ska göra varje indexsida som används för att lagra indexdata. Användardefinierade fillfactor- värden kan vara mellan 1 och 100. Om ett värde inte har angetts är standardvärdet 0. Fyllningsfaktorvärdena 0 och 100 är desamma i alla avseenden.

    Viktig

    Dokumentering MED FILLFACTOR = fillfactor som det enda indexalternativet som gäller för PRIMÄRNYCKEL eller UNIKA begränsningar bibehålls för bakåtkompatibilitet, men kommer inte att dokumenteras på detta sätt i framtida versioner.

column_set_name XML-COLUMN_SET FÖR ALL_SPARSE_COLUMNS

Namnet på kolumnuppsättningen. En kolumnuppsättning är en otypad XML-representation som kombinerar alla glesa kolumner i en tabell till strukturerade utdata. Mer information om kolumnuppsättningar finns i Använda kolumnuppsättningar.

PERIOD FÖR SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )

gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

Anger namnen på de kolumner som systemet ska använda för att registrera den period för vilken en post är giltig. Använd det här argumentet med argumenten GENERATED ALWAYS AS ROW { START | END } och WITH SYSTEM_VERSIONING = ON för att skapa en temporal tabell. Mer information finns i temporala tabeller.

COMPRESSION_DELAY

gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

För en minnesoptimerad anger fördröjningen det minsta antalet minuter som en rad måste finnas kvar i tabellen, oförändrad, innan den är berättigad till komprimering till kolumnlagringsindexet. SQL Server väljer specifika rader som ska komprimeras enligt deras senaste uppdateringstid. Om rader till exempel ändras ofta under en tvåtimmarsperiod kan du ange COMPRESSION_DELAY = 120 Minutes för att säkerställa att uppdateringarna slutförs innan SQL Server komprimerar raden.

För en diskbaserad tabell anger fördröjningen det minsta antalet minuter som en deltaradgrupp i tillståndet CLOSED måste finnas kvar i deltaradgruppen innan SQL Server kan komprimera den till den komprimerade radgruppen. Eftersom diskbaserade tabeller inte spårar infognings- och uppdateringstider på enskilda rader tillämpar SQL Server fördröjningen på deltaradgrupper i tillståndet STÄNGD.

Standardvärdet är 0 minuter.

Rekommendationer om när du ska använda COMPRESSION_DELAYfinns i Komma igång med Columnstore för driftanalys i realtid

<table_option> ::=

Anger ett eller flera tabellalternativ.

DATA_COMPRESSION

Anger datakomprimeringsalternativet för den angivna tabellen, partitionsnumret eller partitionsintervallet. Alternativen är följande:

  • INGEN

    Tabell eller angivna partitioner komprimeras inte.

  • RAD

    Tabell eller angivna partitioner komprimeras med hjälp av radkomprimering.

  • SIDA

    Tabell eller angivna partitioner komprimeras med hjälp av sidkomprimering.

  • COLUMNSTORE

    gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

    Gäller endast för columnstore-index, inklusive både icke-grupperade kolumnarkiv och grupperade kolumnlagringsindex. COLUMNSTORE anger att komprimera med den mest högpresterande kolumnlagringskomprimering. Detta är det typiska valet.

  • COLUMNSTORE_ARCHIVE

    gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

    Gäller endast för columnstore-index, inklusive både icke-grupperade kolumnarkiv och grupperade kolumnlagringsindex. COLUMNSTORE_ARCHIVE komprimerar tabellen eller partitionen ytterligare till en mindre storlek. Detta kan användas för arkivering, eller för andra situationer som kräver en mindre lagringsstorlek och har råd med mer tid för lagring och hämtning.

Mer information finns i datakomprimering.

XML_COMPRESSION

gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.

Anger XML-komprimeringsalternativet för alla xml- datatypskolumner i tabellen. Alternativen är följande:

  • Kolumner som använder XML- datatyp komprimeras.

  • BORT

    Kolumner som använder XML- datatyp komprimeras inte.

PÅ PARTITIONER ( { <partition_number_expression> | [ ,... n ] )

Anger de partitioner som inställningarna för DATA_COMPRESSION eller XML_COMPRESSION gäller för. Om tabellen inte är partitionerad genererar argumentet ON PARTITIONS ett fel. Om ON PARTITIONS-satsen inte tillhandahålls gäller alternativet DATA_COMPRESSION för alla partitioner i en partitionerad tabell.

partition_number_expression kan anges på följande sätt:

  • Ange partitionsnumret för en partition, till exempel: ON PARTITIONS (2)
  • Ange partitionsnumren för flera enskilda partitioner avgränsade med kommatecken, till exempel: ON PARTITIONS (1, 5)
  • Ange både intervall och enskilda partitioner, till exempel: ON PARTITIONS (2, 4, 6 TO 8)

<range> kan anges som partitionsnummer avgränsade med ordet TO, till exempel: ON PARTITIONS (6 TO 8).

Om du vill ange olika typer av datakomprimering för olika partitioner anger du alternativet DATA_COMPRESSION mer än en gång, till exempel:

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

Du kan också ange alternativet XML_COMPRESSION mer än en gång, till exempel:

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> ::=

Anger ett eller flera indexalternativ. En fullständig beskrivning av de här alternativen finns i CREATE INDEX.

PAD_INDEX = { ON | AV }

När den är på tillämpas procentandelen ledigt utrymme som anges av FILLFACTOR på indexets sidor på mellannivå. När OFF eller ett FILLFACTOR-värde inte har angetts fylls sidorna på mellannivå till nära kapacitet och lämnar tillräckligt med utrymme för minst en rad av den maximala storlek som indexet kan ha, med tanke på uppsättningen nycklar på mellanliggande sidor. Standardvärdet är AV.

FILLFACTOR = fillfactor

Anger en procentandel som anger hur full databasmotorn ska göra lövnivån för varje indexsida när index skapas eller ändras. fillfactor måste vara ett heltalsvärde från 1 till 100. Standardvärdet är 0. Fyllningsfaktorvärdena 0 och 100 är desamma i alla avseenden.

IGNORE_DUP_KEY = { ON | AV }

Anger felsvaret när en infogningsåtgärd försöker infoga dubblettnyckelvärden i ett unikt index. Alternativet IGNORE_DUP_KEY gäller endast för infogningsåtgärder när indexet har skapats eller återskapats. Alternativet har ingen effekt när du kör CREATE INDEX, ALTER INDEXeller UPDATE. Standardvärdet är AV.

  • Ett varningsmeddelande visas när dubbletter av nyckelvärden infogas i ett unikt index. Endast de rader som bryter mot unikhetsbegränsningen misslyckas.

  • BORT

    Ett felmeddelande visas när dubbletter av nyckelvärden infogas i ett unikt index. Hela INSERT-åtgärden återställs.

IGNORE_DUP_KEY kan inte anges till PÅ för index som skapats i en vy, icke-unika index, XML-index, rumsliga index och filtrerade index.

Om du vill visa IGNORE_DUP_KEYanvänder du sys.indexes.

I bakåtkompatibel syntax motsvarar WITH IGNORE_DUP_KEYWITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | AV }

När den är på omberäknas inte inaktuell indexstatistik automatiskt. När av aktiveras automatisk statistikuppdatering. Standardvärdet är AV.

ALLOW_ROW_LOCKS = { ON | AV }

När du är PÅ tillåts radlås när du kommer åt indexet. Databasmotorn avgör när radlås används. När av används inte radlås. Standardvärdet är PÅ.

ALLOW_PAGE_LOCKS = { ON | AV }

När du är PÅ tillåts sidlås när du kommer åt indexet. Databasmotorn avgör när sidlås används. När du är AV används inte sidlås. Standardvärdet är PÅ.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | AV }

gäller för: SQL Server 2019 (15.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Anger om du vill optimera för att infoga konkurrens på sista sidan eller inte. Standardvärdet är AV. Mer information finns i avsnittet sekventiella nycklar på sidan SKAPA INDEX.

FILETABLE_DIRECTORY = directory_name

gäller för: SQL Server 2012 (11.x) och senare.

Anger det Windows-kompatibla filtabellkatalognamnet. Det här namnet bör vara unikt bland alla Filtabellkatalognamn i databasen. Unikhetsjämförelse är skiftlägeskänslig, oavsett sorteringsinställningar. Om det här värdet inte anges används namnet på FileTable.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

gäller för: SQL Server 2012 (11.x) och senare. Azure SQL Database och Azure SQL Managed Instance stöder inte FILETABLE.

Anger namnet på sorteringen som ska tillämpas på kolumnen Name i FileTable. Sorteringen måste vara skiftlägeskänslig för att följa Windows-operativsystemets filnamngivningssemantik. Om det här värdet inte anges används databasens standardsortering. Om databasens standardsortering är skiftlägeskänslig utlöses ett fel och åtgärden CREATE TABLE misslyckas.

  • collation_name

    Namnet på en skiftlägeskänslig sortering.

  • database_default

    Anger att standardsortering för databasen ska användas. Den här sorteringen måste vara skiftlägeskänslig.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

gäller för: SQL Server 2012 (11.x) och senare. Azure SQL Database och Azure SQL Managed Instance stöder inte FILETABLE.

Anger namnet som ska användas för den primära nyckelbegränsning som skapas automatiskt på FileTable. Om det här värdet inte anges genererar systemet ett namn för villkoret.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

gäller för: SQL Server 2012 (11.x) och senare. Azure SQL Database och Azure SQL Managed Instance stöder inte FILETABLE.

Anger namnet som ska användas för den unika begränsning som skapas automatiskt i kolumnen stream_id i FileTable. Om det här värdet inte anges genererar systemet ett namn för villkoret.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

gäller för: SQL Server 2012 (11.x) och senare. Azure SQL Database och Azure SQL Managed Instance stöder inte FILETABLE.

Anger namnet som ska användas för den unika begränsning som skapas automatiskt på parent_path_locator och namn kolumner i FileTable. Om det här värdet inte anges genererar systemet ett namn för villkoret.

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

gäller för: SQL Server 2016 (13.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Möjliggör systemversion av tabellen om kraven på datatyp, nullbarhet och primärnyckelvillkor uppfylls. Systemet registrerar historiken för varje post i den systemversionsbaserade tabellen i en separat historiktabell. Om argumentet HISTORY_TABLE inte används blir namnet på den här historiktabellen MSSQL_TemporalHistoryFor<primary_table_object_id>. Om namnet på en historiktabell anges när historiktabellen skapas måste du ange schemat och tabellnamnet.

Om historiktabellen inte finns genererar systemet en ny historiktabell som matchar schemat för den aktuella tabellen i samma filgrupp som den aktuella tabellen, vilket skapar en länk mellan de två tabellerna och gör det möjligt för systemet att registrera historiken för varje post i den aktuella tabellen i historiktabellen. Som standard komprimeras historiktabellen PAGE.

Om argumentet HISTORY_TABLE används för att skapa en länk till och använda en befintlig historiktabell skapas länken mellan den aktuella tabellen och den angivna tabellen. Om den aktuella tabellen partitioneras skapas historiktabellen i standardfilgruppen eftersom partitioneringskonfigurationen inte replikeras automatiskt från den aktuella tabellen till historiktabellen. När du skapar en länk till en befintlig historiktabell kan du välja att utföra en datakonsekvenskontroll. Den här datakonsekvenskontrollen säkerställer att befintliga poster inte överlappar varandra. Standardinställningen är att utföra datakonsekvenskontrollen.

Använd det här argumentet med argumenten PERIOD FOR SYSTEM_TIME och GENERATED ALWAYS AS ROW { START | END } för att aktivera systemversionshantering i en tabell. Mer information finns i temporala tabeller. Använd det här argumentet med argumentet WITH LEDGER = ON för att skapa en uppdaterad transaktionsregistertabell. Det är inte tillåtet att använda befintliga historiktabeller med transaktionsregistertabeller.

REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ) ] | OFF ( MIGRATION_STATE = PAUSED ) }

gäller för: SQL Server 2016 (13.x) och senare.

Skapar den nya tabellen med Stretch Database aktiverat eller inaktiverat. Mer information finns i Stretch Database.

Viktig

Stretch Database är inaktuell i SQL Server 2022 (16.x) och Azure SQL Database. Den här funktionen tas bort i en framtida version av databasmotorn. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

Aktivera Stretch Database för en tabell

När du aktiverar Stretch för en tabell genom att ange ONkan du ange MIGRATION_STATE = OUTBOUND att börja migrera data omedelbart eller MIGRATION_STATE = PAUSED att skjuta upp datamigreringen. Standardvärdet är MIGRATION_STATE = OUTBOUND. Mer information om hur du aktiverar Stretch för en tabell finns i Aktivera Stretch Database för en tabell.

Förutsättningar. Innan du aktiverar Stretch för en tabell måste du aktivera Stretch på servern och i databasen. Mer information finns i Aktivera Stretch Database för en databas.

behörigheter. Aktivering av Stretch för en databas eller en tabell kräver db_owner behörigheter. Att aktivera Stretch för en tabell kräver också ALTER-behörigheter i tabellen.

[ FILTER_PREDICATE = { NULL | predikat } ]

gäller för: SQL Server 2016 (13.x) och senare.

Du kan också ange ett filterpredikat för att välja rader som ska migreras från en tabell som innehåller både historiska och aktuella data. Predikatet måste anropa en deterministisk infogad tabellvärdesfunktion. Mer information finns i Aktivera Stretch Database för en tabell och Välj rader att migrera med hjälp av en filterfunktion.

Viktig

Om du anger ett filterpredikat som fungerar dåligt presterar även datamigreringen dåligt. Stretch Database tillämpar filterpredikatet på tabellen med hjälp av CROSS APPLY-operatorn.

Om du inte anger ett filterpredikat migreras hela tabellen.

När du anger ett filterpredikat måste du också ange MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INKOMMANDE | PAUSAD }

gäller för: SQL Server 2016 (13.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | VECKA | VECKOR | MÅNAD | MÅNADER | ÅR | YEARS } ) } ]

gäller endast för: Azure SQL Edge

Aktiverar kvarhållningsprincipbaserad rensning av gamla eller föråldrade data från tabeller i en databas. Mer information finns i Aktivera och inaktivera datakvarhållning. Följande parametrar måste anges för att datakvarhållning ska aktiveras.

  • FILTER_COLUMN = { column_name }

    Anger den kolumn som ska användas för att avgöra om raderna i tabellen är föråldrade eller inte. Följande datatyper tillåts för filterkolumnen.

    • datum
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | tal {DAY | DAYS | VECKA | VECKOR | MÅNAD | MÅNADER | ÅR | ÅR }}

    Anger kvarhållningsperiodprincipen för tabellen. Kvarhållningsperioden anges som en kombination av ett positivt heltalsvärde och datumdelsenheten.

MEMORY_OPTIMIZED

gäller för: SQL Server 2014 (12.x) och senare, Azure SQL Database och Azure SQL Managed Instance. Azure SQL Managed Instance stöder inte minnesoptimerade tabeller på nivån Generell användning.

Värdet PÅ anger att tabellen är minnesoptimerad. Minnesoptimerade tabeller är en del av funktionen In-Memory OLTP, som används för att optimera prestanda för transaktionsbearbetning. Kom igång med In-Memory OLTP i Snabbstart 1: In-Memory OLTP-tekniker för snabbare Transact-SQL prestanda. Mer detaljerad information om minnesoptimerade tabeller finns i Memory-Optimized Tabeller.

Standardvärdet OFF anger att tabellen är diskbaserad.

HÅLLBARHET

gäller för: SQL Server 2014 (12.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Värdet för SCHEMA_AND_DATA anger att tabellen är beständig, vilket innebär att ändringar sparas på disken och överlever omstart eller redundans. SCHEMA_AND_DATA är standardvärdet.

Värdet för SCHEMA_ONLY anger att tabellen inte är beständig. Tabellschemat är sparat men alla datauppdateringar sparas inte när databasen startas om eller redundansväxlar. DURABILITY = SCHEMA_ONLY tillåts endast med MEMORY_OPTIMIZED = ON.

Varning

När en tabell skapas med DURABILITY = SCHEMA_ONLYoch READ_COMMITTED_SNAPSHOT sedan ändras med hjälp av ALTER DATABASEgår data i tabellen förlorade.

BUCKET_COUNT

gäller för: SQL Server 2014 (12.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Anger antalet bucketar som ska skapas i hash-indexet. Det maximala värdet för BUCKET_COUNT i hash-index är 1 073 741 824. Mer information om antalet bucketar finns i Index för Memory-Optimized Tables.

Bucket_count är ett obligatoriskt argument.

INDEX

gäller för: SQL Server 2014 (12.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

Kolumn- och tabellindex kan anges som en del av CREATE TABLE-instruktionen. Mer information om hur du lägger till och tar bort index i minnesoptimerade tabeller finns i Altering Memory-Optimized Tables

  • HASCH

    gäller för: SQL Server 2014 (12.x) och senare, Azure SQL Database och Azure SQL Managed Instance.

    Anger att ett HASH-index skapas.

    Hash-index stöds endast i minnesoptimerade tabeller.

LEDGER = ON ( <ledger_option> [ ,... n ] ) | BORT

gäller för: SQL Server 2022 (16.x), Azure SQL Database och Azure SQL Managed Instance.

Not

Om instruktionen skapar en transaktionsregistertabell krävs ENABLE LEDGER behörighet.

Anger om tabellen som skapas är en transaktionsregistertabell (ON) eller inte (OFF). Standardvärdet är AV. Om alternativet APPEND_ONLY = ON anges skapar systemet en tabell med endast tilläggsregister som endast tillåter infogning av nya rader. Annars skapar systemet en uppdateringsbar transaktionsregistertabell. En uppdateringsbar transaktionsregistertabell kräver också argumentet SYSTEM_VERSIONING = ON. En uppdateringsbar transaktionsregistertabell måste också vara en systemversionstabell. En uppdateringsbar transaktionsregistertabell behöver dock inte vara en temporal tabell (den kräver inte parametern PERIOD FOR SYSTEM_TIME). Om historiktabellen anges med LEDGER = ON och SYSTEM_VERSIONING = ONfår den inte referera till en befintlig tabell.

En transaktionsregisterdatabas (en databas som skapats med alternativet LEDGER = ON) tillåter endast skapandet av transaktionsregistertabeller. Försök att skapa en tabell med LEDGER = OFF genererar ett fel. Varje ny tabell skapas som standard som en uppdateringsbar transaktionsregistertabell, även om du inte anger LEDGER = ONoch skapas med standardvärden för alla andra parametrar.

En uppdaterad transaktionsregistertabell måste innehålla fyra GENERATED ALWAYS kolumner, exakt en kolumn som definierats med vart och ett av följande argument:

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

En transaktionsregistertabell med endast tillägg måste innehålla exakt en kolumn som definierats med vart och ett av följande argument:

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

Om någon av de obligatoriska genererade alltid kolumnerna inte definieras i CREATE TABLE-instruktionen och -instruktionen innehåller LEDGER = ONförsöker systemet automatiskt lägga till kolumnen med hjälp av en tillämplig kolumndefinition från listan nedan. Om det finns en namnkonflikt med en redan definierad kolumn uppstår ett fel i systemet.

[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

<ledger_view_option> anger schemat och namnet på transaktionsregistervy systemet automatiskt skapar och länkar till tabellen. Om alternativet inte anges genererar systemet namnet på transaktionsregistrets vy genom att lägga till _Ledger till namnet på tabellen som skapas (database_name.schema_name.table_name). Om det finns en vy med det angivna eller genererade namnet skapar systemet ett fel. Om tabellen är en uppdaterad transaktionsregistertabell skapas transaktionsregistervyn som en union i tabellen och dess historiktabell.

Varje rad i transaktionsregistervyn representerar antingen skapandet eller borttagningen av en radversion i transaktionsregistertabellen. Transaktionsregistervyn innehåller alla kolumner i transaktionsregistertabellen, förutom de genererade alltid kolumnerna som anges ovan. Transaktionsregistervyn innehåller också följande ytterligare kolumner:

Kolumnnamn Datatyp Beskrivning
Anges med hjälp av alternativet TRANSACTION_ID_COLUMN_NAME. ledger_transaction_id om det inte anges. bigint ID för den transaktion som skapade eller tog bort en radversion.
Anges med hjälp av alternativet SEQUENCE_NUMBER_COLUMN_NAME. ledger_sequence_number om det inte anges. bigint Sekvensnumret för en radnivååtgärd i transaktionen i tabellen.
Anges med hjälp av alternativet OPERATION_TYPE_COLUMN_NAME. ledger_operation_type om det inte anges. tinyint Innehåller 1 (INSERT) eller 2 (DELETE). Om du infogar en rad i transaktionsregistertabellen skapas en ny rad i transaktionsregistervyn som innehåller 1 i den här kolumnen. Om du tar bort en rad från transaktionsregistertabellen skapas en ny rad i transaktionsregistervyn som innehåller 2 i den här kolumnen. Om du uppdaterar en rad i transaktionsregistertabellen skapas två nya rader i transaktionsregistervyn. En rad innehåller 2 (DELETE) och den andra raden innehåller 1 (INSERT) i den här kolumnen.
Anges med hjälp av alternativet OPERATION_TYPE_DESC_COLUMN_NAME. ledger_operation_type_desc om det inte anges. nvarchar(128) Innehåller INSERT eller DELETE. Mer information finns i ovan.

Transaktioner som inkluderar att skapa en transaktionsregistertabell registreras i sys.database_ledger_transactions.

<ledger_option> ::=

Anger ett transaktionsalternativ.

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

Anger namnet på transaktionsregistervyn och namnen på ytterligare kolumner som systemet lägger till i transaktionsregistervyn.

[ APPEND_ONLY = ON | AV ]

Anger om transaktionsregistertabellen som skapas är endast tilläggs- eller uppdateringsbar. Standardvärdet är OFF.

<ledger_view_option> ::=

Anger ett eller flera alternativ för transaktionsregistervyn. Var och en av transaktionsregistrets vyalternativ anger ett namn på en kolumn, systemet kommer att lägga till i vyn, förutom de kolumner som definierats i transaktionsregistret.

[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]

Anger namnet på kolumnen som lagrar ID:t för transaktionen som skapade eller tog bort en radversion. Standardkolumnnamnet är ledger_transaction_id.

[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]

Anger namnet på kolumnerna som lagrar sekvensnumret för en radnivååtgärd i transaktionen i tabellen. Standardkolumnnamnet är ledger_sequence_number.

[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]

Anger namnet på kolumnerna som lagrar åtgärdstyps-ID:t. Standardkolumnnamnet är ledger_operation_type.

[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]

Anger namnet på de kolumner som lagrar beskrivningen av åtgärdstypen. Standardkolumnnamnet är ledger_operation_type_desc.

Anmärkningar

Information om antalet tillåtna tabeller, kolumner, begränsningar och index finns i Maximum Capacity Specifications for SQL Server.

Utrymme allokeras vanligtvis till tabeller och index i steg om en omfattning i taget. När SET MIXED_PAGE_ALLOCATION alternativet för ALTER DATABASE är inställt på TRUE, eller alltid före SQL Server 2016 (13.x), när en tabell eller ett index skapas, allokeras sidor från blandade omfattningar tills det har tillräckligt med sidor för att fylla en enhetlig omfattning. När det finns tillräckligt med sidor för att fylla en enhetlig omfattning allokeras en annan omfattning varje gång de för närvarande allokerade utrymmena blir fulla. För en rapport om mängden utrymme som allokeras och används av en tabell kör du sp_spaceused.

Databasmotorn framtvingar inte någon ordning där begränsningarna DEFAULT, IDENTITY, ROWGUIDCOL eller column anges i en kolumndefinition.

När en tabell skapas lagras alternativet QUOTED IDENTIFIER alltid som PÅ i metadata för tabellen, även om alternativet är inställt på AV när tabellen skapas.

I SQL-databasen i Microsoft Fabric kan vissa tabellfunktioner skapas men kommer inte att speglas i Fabric OneLake-. Mer information finns i begränsningar för sql-databasspegling av infrastrukturresurser.

Temporära tabeller

Du kan skapa lokala och globala temporära tabeller. Lokala temporära tabeller visas endast i den aktuella sessionen och globala temporära tabeller är synliga för alla sessioner. Temporära tabeller kan inte partitioneras.

Prefix för lokala temporära tabellnamn med enkelnummertecken (#table_name) och prefix för globala temporära tabellnamn med ett dubbelnummertecken (##table_name).

Transact-SQL-instruktioner refererar till den tillfälliga tabellen med hjälp av värdet som anges för table_name i CREATE TABLE-instruktionen, till exempel:

CREATE TABLE #MyTempTable
(
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Om fler än en tillfällig tabell skapas i en enda lagrad procedur eller batch måste de ha olika namn.

Om du inkluderar en schema_name när du skapar eller kommer åt en tillfällig tabell ignoreras den. Alla temporära tabeller skapas i schemat dbo.

Om en lokal tillfällig tabell skapas i en lagrad procedur eller en SQL-modul som kan köras samtidigt av flera sessioner, måste databasmotorn kunna särskilja de tabeller som skapats av de olika sessionerna. Databasmotorn gör detta genom att internt lägga till ett unikt suffix till varje lokalt tillfälligt tabellnamn. Det fullständiga namnet på en temporär tabell som lagras i tabellen sys.objects i tempdb består av det tabellnamn som anges i CREATE TABLE-instruktionen och det systemgenererade unika suffixet. Om du vill tillåta suffixet får table_name som anges för ett lokalt tillfälligt namn inte överstiga 116 tecken.

Temporära tabeller tas bort automatiskt när de hamnar utanför omfånget, såvida de inte uttryckligen tas bort tidigare med hjälp av DROP TABLE:

  • En lokal tillfällig tabell som skapats i en lagrad procedur tas bort automatiskt när den lagrade proceduren är klar. Tabellen kan refereras till av alla kapslade lagrade procedurer som körs av den lagrade proceduren som skapade tabellen. Tabellen kan inte refereras till av den process som kallade den lagrade proceduren som skapade tabellen.
  • Alla andra lokala temporära tabeller tas bort automatiskt i slutet av den aktuella sessionen.
  • Om den GLOBAL_TEMPORARY_TABLE_AUTO_DROP databasomfattande konfigurationen är inställd på ON (standard) tas globala temporära tabeller automatiskt bort när sessionen som skapade tabellen avslutas och alla andra aktiviteter har slutat referera till dem. Associationen mellan en uppgift och en tabell underhålls endast under en enda Transact-SQL-instruktion. Det innebär att en global tillfällig tabell tas bort när den senaste Transact-SQL-instruktionen som aktivt refererade till tabellen när den skapande sessionen avslutades.
  • Om den GLOBAL_TEMPORARY_TABLE_AUTO_DROP databasomfattande konfigurationen är inställd på OFF, tas endast globala temporära tabeller bort med DROP TABLEeller när databasmotorinstansen startas om. Mer information finns i GLOBAL_TEMPORARY_TABLE_AUTO_DROP.

En lokal tillfällig tabell som skapats inom en lagrad procedur eller utlösare kan ha samma namn som en tillfällig tabell som skapades innan den lagrade proceduren eller utlösaren anropas. Men om en fråga refererar till en tillfällig tabell och två temporära tabeller med samma namn finns vid den tidpunkten definieras inte vilken tabell frågan matchas mot. Kapslade lagrade procedurer kan också skapa temporära tabeller med samma namn som en tillfällig tabell som skapades av den anropande lagrade proceduren. För ändringar som ska matchas i tabellen som skapades i den kapslade proceduren måste tabellen dock ha samma struktur, med samma kolumnnamn, som tabellen som skapades i anropsproceduren. Detta visas i följande exempel.

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

Här är resultatuppsättningen.

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

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

När du skapar lokala eller globala temporära tabeller stöder CREATE TABLE-syntaxen villkorsdefinitioner förutom FOREIGN KEY begränsningar. Om en FOREIGN KEY villkor anges i en tillfällig tabell returnerar instruktionen ett varningsmeddelande som anger att begränsningen hoppades över. Tabellen skapas fortfarande utan villkoret FOREIGN KEY. Det går inte att referera till temporära tabeller i FOREIGN KEY begränsningar.

Om en tillfällig tabell skapas med ett namngivet villkor och den tillfälliga tabellen skapas inom omfånget för en användardefinierad transaktion kan endast en användare i taget köra instruktionen som skapar temp-tabellen. Om en lagrad procedur till exempel skapar en tillfällig tabell med en namngiven primärnyckelbegränsning kan den lagrade proceduren inte köras samtidigt av flera användare.

Databasomfattande globala temporära tabeller i Azure SQL Database

Globala temporära tabeller i SQL Server (tabellnamn som är prefix med ##) lagras i tempdb och delas mellan alla användarsessioner i hela SQL Server-instansen.

Azure SQL Database stöder globala temporära tabeller som också lagras i tempdb men som är begränsade till databasnivån. Det innebär att globala temporära tabeller delas mellan alla användarsessioner i samma databas. Användarsessioner från andra databaser kan inte komma åt globala temporära tabeller. Annars följer globala temporära tabeller för Azure SQL Database samma syntax och semantik som SQL Server använder.

På samma sätt begränsas även globala tillfälliga lagrade procedurer till databasnivån i Azure SQL Database.

Lokala temporära tabeller (tabellnamn som är prefix med #) stöds också för Azure SQL Database och följer samma syntax och semantik som SQL Server använder. Mer information finns i temporära tabeller.

Behörigheter för temporära objekt

Alla användare kan skapa och komma åt temporära objekt.

Partitionerade tabeller

Innan du skapar en partitionerad tabell med hjälp av CREATE TABLE måste du först skapa en partitionsfunktion för att ange hur tabellen ska partitioneras. En partitionsfunktion skapas med hjälp av CREATE PARTITION FUNCTION. För det andra måste du skapa ett partitionsschema för att ange de filgrupper som ska innehålla de partitioner som anges av partitionsfunktionen. Ett partitionsschema skapas med hjälp av CREATE PARTITION SCHEME. Det går inte att ange placering av PRIMÄRNYCKEL eller UNIKA begränsningar för separata filgrupper för partitionerade tabeller. Mer information finns i partitionerade tabeller och index.

BEGRÄNSNINGAR FÖR PRIMÄRNYCKEL

  • En tabell kan bara innehålla en primärnyckelbegränsning.

  • Indexet som genereras av en PRIMARY KEY-begränsning kan inte orsaka att antalet index i tabellen överskrider 999 icke-grupperade index och 1 klustrat index.

  • Om CLUSTERED eller NONCLUSTERED inte har angetts för en primary key-begränsning används CLUSTERED om det inte finns några klustrade index angivna för UNIKA begränsningar.

  • Alla kolumner som definierats inom en PRIMARY KEY-begränsning måste definieras som INTE NULL. Om nullability inte har angetts har alla kolumner som deltar i en PRIMARY KEY-begränsning deras nullabilitet inställd på NOT NULL.

    Not

    För minnesoptimerade tabeller tillåts den nullbara nyckelkolumnen.

  • Om en primärnyckel definieras i en CLR-användardefinierad typkolumn måste implementeringen av typen ha stöd för binär ordning. Mer information finns i CLR User-Defined Types.

UNIKA begränsningar

  • Om CLUSTERED eller NONCLUSTERED inte har angetts för en UNIK begränsning används NONCLUSTERED som standard.
  • Varje UNIK begränsning genererar ett index. Antalet UNIKA begränsningar kan inte leda till att antalet index i tabellen överskrider 999 icke-grupperade index och 1 grupperat index.
  • Om en unik begränsning definieras i en CLR-användardefinierad typkolumn måste implementeringen av typen ha stöd för binär eller operatorbaserad ordning. Mer information finns i CLR User-Defined Types.

BEGRÄNSNINGAR FÖR SEKUNDÄRNYCKEL

  • När ett annat värde än NULL anges i kolumnen för en FOREIGN KEY-begränsning måste värdet finnas i den refererade kolumnen. annars returneras ett felmeddelande om brott mot sekundärnyckeln.

  • BEGRÄNSNINGAR FÖR SEKUNDÄRNYCKEL tillämpas på föregående kolumn, såvida inte källkolumner har angetts.

  • Begränsningar för SEKUNDÄRNYCKEL kan endast referera till tabeller i samma databas på samma server. Referensintegritet mellan databaser måste implementeras via utlösare. Mer information finns i CREATE TRIGGER.

  • Begränsningar för SEKUNDÄRNYCKEL kan referera till en annan kolumn i samma tabell. Detta kallas självreferens.

  • REFERENCE-satsen för en foreign key-begränsning på kolumnnivå kan bara visa en referenskolumn. Den här kolumnen måste ha samma datatyp som den kolumn där villkoret definieras.

  • REFERENCE-satsen för en foreign key-begränsning på tabellnivå måste ha samma antal referenskolumner som antalet kolumner i begränsningskolumnlistan. Datatypen för varje referenskolumn måste också vara samma som motsvarande kolumn i kolumnlistan. Referenskolumnerna måste anges i samma ordning som användes när kolumnerna i primärnyckeln eller den unika begränsningen i den refererade tabellen angavs.

  • CASCADE, SET NULL eller SET DEFAULT kan inte anges om en kolumn av typen tidsstämpel är en del av antingen sekundärnyckeln eller den refererade nyckeln.

  • CASCADE, SET NULL, SET DEFAULT och NO ACTION kan kombineras i tabeller som har referensrelationer med varandra. Om databasmotorn inte stöter på någon åtgärd stoppas och återställs relaterade åtgärder för CASCADE, SET NULL och SET DEFAULT. När en DELETE-instruktion orsakar en kombination av åtgärderna CASCADE, SET NULL, SET DEFAULT och NO ACTION tillämpas alla åtgärderna CASCADE, SET NULL och SET DEFAULT innan databasmotorn söker efter någon ÅTGÄRD.

  • Databasmotorn har ingen fördefinierad gräns för antalet begränsningar för SEKUNDÄRNYCKEL som en tabell kan innehålla som refererar till andra tabeller eller antalet begränsningar för SEKUNDÄRNYCKEL som ägs av andra tabeller som refererar till en specifik tabell.

    Det faktiska antalet begränsningar för SEKUNDÄRNYCKEL som kan användas begränsas dock av maskinvarukonfigurationen och av utformningen av databasen och programmet. Vi rekommenderar att en tabell inte innehåller fler än 253 begränsningar för SEKUNDÄRNYCKEL och att den inte refereras till av fler än 253 begränsningar för SEKUNDÄRNYCKEL. Den effektiva gränsen för dig kan vara mer eller mindre beroende på program och maskinvara. Överväg kostnaden för att framtvinga begränsningar för FOREIGN KEY när du utformar din databas och dina program.

  • Begränsningar för SEKUNDÄRNYCKEL tillämpas inte på temporära tabeller.

  • Begränsningar för SEKUNDÄRNYCKEL kan endast referera till kolumner i PRIMÄRNYCKEL eller UNIKA begränsningar i den refererade tabellen eller i ett UNIKT INDEX i den refererade tabellen.

  • Om en sekundärnyckel definieras i en CLR-användardefinierad typkolumn måste implementeringen av typen ha stöd för binär ordning. Mer information finns i CLR User-Defined Types.

  • Kolumner som deltar i en sekundärnyckelrelation måste definieras med samma längd och skala.

STANDARDdefinitioner

  • En kolumn kan bara ha en STANDARDdefinition.

  • En STANDARDdefinition kan innehålla konstanta värden, funktioner, SQL Standard niladic-funktioner eller NULL. I följande tabell visas de niladiska funktionerna och de värden som returneras för standardvärdet under en INSERT-instruktion.

    SQL-92 niladic-funktion Returnerat värde
    CURRENT_TIMESTAMP Aktuellt datum och tid.
    CURRENT_USER Namnet på användaren som utför en infogning.
    SESSION_USER Namnet på användaren som utför en infogning.
    SYSTEM_USER Namnet på användaren som utför en infogning.
    USER Namnet på användaren som utför en infogning.
  • constant_expression i en STANDARDdefinition kan inte referera till en annan kolumn i tabellen eller till andra tabeller, vyer eller lagrade procedurer.

  • Standarddefinitioner kan inte skapas på kolumner med en tidsstämpel datatyp eller kolumner med en identitetsegenskap.

  • STANDARDdefinitioner kan inte skapas för kolumner med aliasdatatyper om aliasdatatypen är bunden till ett standardobjekt.

CHECK-begränsningar

  • En kolumn kan ha valfritt antal CHECK-begränsningar, och villkoret kan innehålla flera logiska uttryck i kombination med AND och OR. Flera CHECK-begränsningar för en kolumn verifieras i den ordning de skapas.

  • Sökvillkoret måste utvärderas till ett booleskt uttryck och kan inte referera till en annan tabell.

  • En CHECK-begränsning på kolumnnivå kan endast referera till den begränsade kolumnen, och en kontrollbegränsning på tabellnivå kan endast referera till kolumner i samma tabell.

    CHECK CONSTRAINTS and rules serve the same function of validating the data during INSERT and UPDATE statements .CHECK CONSTRAINTS and rules serve the same function of validating the data during INSERT and UPDATE statements.

  • När det finns en regel och en eller flera CHECK-begränsningar för en kolumn eller kolumner utvärderas alla begränsningar.

  • CHECK-begränsningar kan inte definieras för text, ntexteller bild kolumner.

Ytterligare villkorsinformation

  • Det går inte att ta bort ett index som skapats för en begränsning med hjälp av DROP INDEX. villkoret måste tas bort med hjälp av ALTER TABLE. Ett index som skapats för och används av en begränsning kan återskapas med hjälp av ALTER INDEX ... REBUILD. Mer information finns i Omorganisera och återskapa index.
  • Villkorsnamn måste följa reglerna för identifierare, förutom att namnet inte kan börja med ett taltecken (#). Om constraint_name inte anges tilldelas ett systemgenererat namn villkoret. Villkorsnamnet visas i ett felmeddelande om begränsningsöverträdelser.
  • När en begränsning överträds i en INSERT- UPDATE- eller DELETE-instruktion avslutas -instruktionen. Men när SET XACT_ABORT är inställt på OFF fortsätter transaktionen att bearbetas om -instruktionen ingår i en explicit transaktion. När SET XACT_ABORT är inställt på PÅ återställs hela transaktionen. Du kan också använda ROLLBACK TRANSACTION-instruktionen med transaktionsdefinitionen genom att kontrollera @@ERROR systemfunktionen.
  • När ALLOW_ROW_LOCKS = ON och ALLOW_PAGE_LOCK = ONtillåts rad-, sid- och tabellnivålås när du kommer åt indexet. Databasmotorn väljer lämpligt lås och kan eskalera låset från ett rad- eller sidlås till ett tabelllås. När ALLOW_ROW_LOCKS = OFF och ALLOW_PAGE_LOCK = OFFtillåts endast ett lås på tabellnivå när du kommer åt indexet.
  • Om en tabell har BEGRÄNSNINGAR och utlösare för FRÄMMANDE NYCKEL eller CHECK utvärderas villkoret för villkoret innan utlösaren körs.

För en rapport i en tabell och dess kolumner använder du sp_help eller sp_helpconstraint. Om du vill byta namn på en tabell använder du sp_rename. För en rapport om vyer och lagrade procedurer som är beroende av en tabell använder du sys.dm_sql_referenced_entities och sys.dm_sql_referencing_entities.

Nullbarhetsregler i en tabelldefinition

Nullbarheten för en kolumn avgör om kolumnen kan tillåta ett null-värde (NULL) som data i den kolumnen. NULL är inte noll eller tomt: NULL innebär att ingen post har gjorts eller att en explicit NULL har angetts, och det innebär vanligtvis att värdet antingen är okänt eller inte tillämpligt.

När du använder CREATE TABLE eller ALTER TABLE för att skapa eller ändra en tabell påverkar databas- och sessionsinställningarna och eventuellt åsidosätter ogiltigheten för den datatyp som används i en kolumndefinition. Vi rekommenderar att du alltid uttryckligen definierar en kolumn som NULL eller NOT NULL för icke-indelade kolumner eller, om du använder en användardefinierad datatyp, att du tillåter att kolumnen använder standardvärdet nullabilitet för datatypen. Glesa kolumner måste alltid tillåta NULL.

När kolumnens nullbarhet inte uttryckligen har angetts följer kolumnens nullbarhet de regler som visas i följande tabell.

Kolumndatatyp Regel
Aliasdatatyp Databasmotorn använder den nullbarhet som anges när datatypen skapades. Om du vill fastställa standardvärdet för datatypens nullbarhet använder du sp_help.
Användardefinierad CLR-typ Nullability bestäms enligt kolumndefinitionen.
Datatyp som tillhandahålls av systemet Om datatypen som tillhandahålls av systemet bara har ett alternativ har den företräde. tidsstämpel datatyper måste vara INTE NULL. När några sessionsinställningar har angetts på med hjälp av SET:
ANSI_NULL_DFLT_ON = ONtilldelas NULL.
ANSI_NULL_DFLT_OFF = ONtilldelas INTE NULL.

När databasinställningar konfigureras med hjälp av ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = ONtilldelas NULL.
ANSI_NULL_DEFAULT_OFF = ONtilldelas INTE NULL.

Om du vill visa databasinställningen för ANSI_NULL_DEFAULTanvänder du sys.databases katalogvyn

När inget av de ANSI_NULL_DFLT alternativen har angetts för sessionen och databasen är inställd på standardvärdet (ANSI_NULL_DEFAULT är AV) tilldelas standardvärdet NOT NULL.

Om kolumnen är en beräknad kolumn bestäms dess nullbarhet alltid automatiskt av databasmotorn. Om du vill ta reda på nullbarheten för den här typen av kolumn använder du funktionen COLUMNPROPERTY med egenskapen AllowsNull.

Not

BÅDE SQL Server ODBC-drivrutinen och SQL Server OLE DB-drivrutinen har ANSI_NULL_DFLT_ON inställt på PÅ. ODBC- och OLE DB-användare kan konfigurera detta i ODBC-datakällor eller med anslutningsattribut eller egenskaper som angetts av programmet.

Datakomprimering

Systemtabeller kan inte aktiveras för komprimering. När du skapar en tabell anges datakomprimering till NONE, om inget annat anges. Om du anger en lista över partitioner eller en partition som ligger utom räckhåll genereras ett fel. Mer information om datakomprimering finns i Datakomprimering.

Om du vill utvärdera hur ändring av komprimeringstillståndet påverkar en tabell, ett index eller en partition använder du den sp_estimate_data_compression_savings lagrade proceduren.

Behörigheter

Kräver CREATE TABLE behörighet i databasen och ALTER behörighet för schemat där tabellen skapas.

Om några kolumner i CREATE TABLE-instruktionen definieras som av en användardefinierad typ krävs REFERENCES behörighet för den användardefinierade typen.

Om några kolumner i CREATE TABLE-instruktionen definieras som en CLR-användardefinierad typ krävs antingen ägarskap för typen eller REFERENCES behörighet för den.

Om några kolumner i CREATE TABLE-instruktionen har en XML-schemasamling associerad med dem krävs antingen ägarskap för XML-schemasamlingen eller REFERENCES behörighet för den.

Alla användare kan skapa tillfälliga tabeller i tempdb.

Om instruktionen skapar en transaktionsregistertabell krävs ENABLE LEDGER behörighet.

Exempel

A. Skapa en PRIMÄR NYCKEL-begränsning för en kolumn

I följande exempel visas kolumndefinitionen för en PRIMARY KEY-begränsning med ett grupperat index i kolumnen EmployeeID i tabellen Employee. Eftersom ett villkorsnamn inte har angetts tillhandahåller systemet villkorsnamnet.

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

B. Använda begränsningar för SEKUNDÄRNYCKEL

En FOREIGN KEY-begränsning används för att referera till en annan tabell. Sekundärnycklar kan vara nycklar med en kolumn eller flera kolumner. I följande exempel visas en foreign key-begränsning med en kolumn för den SalesOrderHeader tabell som refererar till den SalesPerson tabellen. Endast REFERENCES-satsen krävs för en foreign key-begränsning med en kolumn.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

Du kan också uttryckligen använda FOREIGN KEY-satsen och upprepa kolumnattributet. Kolumnnamnet behöver inte vara detsamma i båda tabellerna.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Begränsningar för flera kolumner skapas som tabellbegränsningar. I AdventureWorks2022-databasen innehåller tabellen SpecialOfferProduct en primärnyckel med flera kolumner. I följande exempel visas hur du refererar till den här nyckeln från en annan tabell. ett explicit villkorsnamn är valfritt.

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

C. Använda UNIKA begränsningar

UNIKA begränsningar används för att framtvinga unikhet för icke-primariska nyckelkolumner. I följande exempel tillämpas en begränsning som Name kolumnen i den Product tabellen måste vara unik.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. Använda STANDARDdefinitioner

Standardvärden anger ett värde (med INSERT- och UPDATE-uttrycken) när inget värde anges. Till exempel kan den AdventureWorks2022 databasen innehålla en uppslagstabell som visar de olika jobb som anställda kan fylla i företaget. Under en kolumn som beskriver varje jobb kan en teckensträngsstandard ange en beskrivning när en faktisk beskrivning inte anges explicit.

DEFAULT 'New Position - title not formalized yet'

Förutom konstanter kan STANDARD-definitioner innehålla funktioner. Använd följande exempel för att hämta aktuellt datum för en post.

DEFAULT (GETDATE())

En niladic-function-genomsökning kan också förbättra dataintegriteten. Om du vill hålla reda på användaren som infogade en rad använder du niladic-function för USER. Omslut inte niladic-functions med parenteser.

DEFAULT USER

E. Använda CHECK-begränsningar

I följande exempel visas en begränsning som gjorts för värden som anges i kolumnen CreditRating i tabellen Vendor. Villkoret är namnlöst.

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

Det här exemplet visar en namngiven begränsning med en mönsterbegränsning för teckendata som anges i en kolumn i en tabell.

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

Det här exemplet anger att värdena måste finnas i en specifik lista eller följa ett angivet mönster.

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

F. Visa den fullständiga tabelldefinitionen

I följande exempel visas de fullständiga tabelldefinitionerna med alla villkorsdefinitioner för tabell PurchaseOrderDetail som skapats i AdventureWorks2022-databasen. Om du vill köra exemplet ändras tabellschemat till 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. Skapa en tabell med en XML-kolumn som skrivits till en XML-schemasamling

I följande exempel skapas en tabell med en xml kolumn som skrivs till XML-schemasamlingen HRResumeSchemaCollection. Nyckelordet DOCUMENT anger att varje instans av xml datatypen i column_name endast kan innehålla ett element på den översta nivån.

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

H. Skapa en partitionerad tabell

I följande exempel skapas en partitionsfunktion för att partitionera en tabell eller index i fyra partitioner. Sedan skapar exemplet ett partitionsschema som anger de filgrupper där var och en av de fyra partitionerna ska lagras. Slutligen skapar exemplet en tabell som använder partitionsschemat. Det här exemplet förutsätter att filgrupperna redan finns i databasen.

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

Baserat på värdena för kolumn col1 i PartitionTabletilldelas partitionerna på följande sätt.

Filgrupp test1fg test2fg test3fg test4fg
Partition 1 2 3 4
Värden col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1,000 col1 > 1000

Jag. Använda datatypen UNIQUEIDENTIFIER i en kolumn

I följande exempel skapas en tabell med en uniqueidentifier kolumn. I exemplet används en primary key-begränsning för att skydda tabellen mot användare som infogar duplicerade värden, och den använder funktionen NEWSEQUENTIALID() i DEFAULT-villkoret för att ange värden för nya rader. Egenskapen ROWGUIDCOL tillämpas på kolumnen uniqueidentifier så att den kan refereras med nyckelordet $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. Använda ett uttryck för en beräknad kolumn

I följande exempel visas användningen av ett uttryck ((low + high)/2) för att beräkna den myavg beräknade kolumnen.

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

K. Skapa en beräknad kolumn baserat på en användardefinierad typkolumn

I följande exempel skapas en tabell med en kolumn som definierats som användardefinierad typ utf8string, förutsatt att typens sammansättning och själva typen redan har skapats i den aktuella databasen. En andra kolumn definieras baserat på utf8stringoch använder metoden ToString() av type(class)utf8string för att beräkna ett värde för kolumnen.

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

L. Använda funktionen USER_NAME för en beräknad kolumn

I följande exempel används funktionen USER_NAME() i kolumnen myuser_name.

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

M. Skapa en tabell som har en FILESTREAM-kolumn

I följande exempel skapas en tabell som har en FILESTREAM kolumn Photo. Om en tabell har en eller flera FILESTREAM kolumner måste tabellen ha en ROWGUIDCOL kolumn.

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

N. Skapa en tabell som använder radkomprimering

I följande exempel skapas en tabell som använder radkomprimering.

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

Ytterligare exempel på datakomprimering finns i Datakomprimering.

O. Skapa en tabell som använder XML-komprimering

gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.

I följande exempel skapas en tabell som använder XML-komprimering.

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

P. Skapa en tabell med glesa kolumner och en kolumnuppsättning

Följande exempel visar hur du skapar en tabell som har en gles kolumn och en tabell som har två glesa kolumner och en kolumnuppsättning. Exemplen använder den grundläggande syntaxen. Mer komplexa exempel finns i Använda glesa kolumner och Använda kolumnuppsättningar.

I det här exemplet skapas en tabell som har en gles kolumn.

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

I det här exemplet skapas en tabell med två glesa kolumner och en kolumnuppsättning med namnet 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. Skapa en systemversionsbaserad diskbaserad temporal tabell

gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

I följande exempel visas hur du skapar en temporal tabell som är länkad till en ny historiktabell och hur du skapar en temporal tabell som är länkad till en befintlig historiktabell. Den tidsmässiga tabellen måste ha en primärnyckel som definierats för att aktiveras för att tabellen ska kunna aktiveras för systemversionshantering. Exempel som visar hur du lägger till eller tar bort systemversioner i en befintlig tabell finns i Systemversioner i Exempel. För användningsfall, se temporala tabeller.

Det här exemplet skapar en ny temporal tabell som är länkad till en ny historiktabell.

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

Det här exemplet skapar en ny temporal tabell som är länkad till en befintlig historiktabell.

-- 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. Skapa en systemversionsbaserad minnesoptimerad tidstabell

gäller för: SQL Server 2016 (13.x) och senare och Azure SQL Database.

I följande exempel visas hur du skapar en systemversionsbaserad minnesoptimerad tidstabell som är länkad till en ny diskbaserad historiktabell.

Det här exemplet skapar en ny temporal tabell som är länkad till en ny historiktabell.

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

Det här exemplet skapar en ny temporal tabell som är länkad till en befintlig historiktabell.

-- 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. Skapa en tabell med krypterade kolumner

I följande exempel skapas en tabell med två krypterade kolumner. Mer information finns i Always Encrypted.

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. Skapa ett infogat filtrerat index

Skapar en tabell med ett infogat filtrerat index.

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

U. Skapa ett infogat index

Följande visar hur du använder NONCLUSTERED infogat för diskbaserade tabeller:

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. Skapa en tillfällig tabell med en anonymt namngiven sammansatt primärnyckel

Skapar en tabell med en anonymt namngiven sammansatt primärnyckel. Detta är användbart för att undvika körningskonflikter där två temporära tabeller med sessionsomfattning, var och en i en separat session, använder samma namn för en begränsning.

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

Om du uttryckligen namnger villkoret genererar den andra sessionen ett fel som:

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.

Problemet beror på att även om temp-tabellnamnet är unikt är inte villkorsnamnen det.

W. Använda globala temporära tabeller i Azure SQL Database

Session A skapar en global temporär tabell ##test i Azure SQL Database testdb1 och lägger till en rad

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

Här är resultatuppsättningen.

1253579504

Hämta ett globalt temp table-namn för ett angivet objekt-ID 1253579504 i tempdb (2)

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

Här är resultatuppsättningen.

##test

Session B ansluter till Azure SQL Database testdb1 och kan komma åt tabell ##test som skapats av session A

SELECT *
FROM ##test;

Här är resultatuppsättningen.

1, 1

Session C ansluter till en annan databas i Azure SQL Database testdb2 och vill komma åt ##test som skapats i testdb1. Det här valet misslyckas på grund av databasomfånget för de globala temp-tabellerna

SELECT *
FROM ##test;

Vilket genererar följande fel:

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

Hantera systemobjekt i Azure SQL Database tempdb från den aktuella användardatabasen testdb1

SELECT *
FROM tempdb.sys.objects;

SELECT *
FROM tempdb.sys.columns;

SELECT *
FROM tempdb.sys.database_files;

X. Aktivera datakvarhållningsprincip i en tabell

I följande exempel skapas en tabell med datakvarhållning aktiverat och en kvarhållningsperiod på en vecka. Det här exemplet gäller endast 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. Skapa en uppdaterad transaktionsregistertabell

I följande exempel skapas en uppdateringsbar transaktionsregistertabell som inte är en temporär tabell med en anonym historiktabell (systemet genererar namnet på historiktabellen) och det genererade transaktionsregistervynamnet. Eftersom namnen på de obligatoriska genererade alltid kolumnerna och de ytterligare kolumnerna i transaktionsregistervyn inte anges, kommer kolumnerna att ha standardnamnen.

CREATE SCHEMA [HR];
GO

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

I följande exempel skapas en tabell som både är en tidstabell och en uppdaterad transaktionsregistertabell, med en anonym historiktabell (med ett namn som genereras av systemet), det genererade transaktionsregistervynamnet och standardnamnen för de genererade kolumnerna alltid kolumner och de ytterligare kolumnerna för transaktionsregistervyn.

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

I följande exempel skapas en tabell som både är en temporal tabell och en uppdateringsbar transaktionsregistertabell med den uttryckligen namngivna historiktabellen, det användardefinierade namnet på transaktionsregistervyn och de användardefinierade namnen på genererade alltid kolumner och ytterligare kolumner i transaktionsregistervyn.

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

I följande exempel skapas en tabell med endast tilläggsregister med de genererade namnen på transaktionsregistervyn och kolumnerna i transaktionsregistervyn.

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

I följande exempel skapas en transaktionsregisterdatabas i Azure SQL Database och en uppdaterad transaktionsregistertabell med standardinställningarna. Att skapa en uppdaterad transaktionsregistertabell i en transaktionsregisterdatabas kräver inte att du använder WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);.

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