Sdílet prostřednictvím


CREATE TABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vytvoří novou tabulku v databázi.

Poznámka:

Odkaz na Sklad v Microsoft Fabric najdete v tématu CREATE TABLE (Fabric Data Warehouse). Pokud chcete odkazovat na Azure Synapse Analytics a Platform Platform System (PDW), navštivte create TABLE (Azure Synapse Analytics).

Transact-SQL konvence syntaxe

Možnosti syntaxe

Běžná syntaxe

Jednoduchá syntaxe CREATE TABLE (běžné, pokud nepoužíváte možnosti):

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

Úplná syntaxe

Syntaxe CREATE TABLE založená na disku:

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>

Syntaxe pro tabulky optimalizované pro paměť

Syntaxe CREATE TABLE optimalizovaná pro paměť:

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

}

Argumenty

database_name

Název databáze, ve které je tabulka vytvořena. database_name musí zadat název existující databáze. Pokud není zadáno, database_name výchozí hodnota aktuální databáze. Přihlášení k aktuálnímu připojení musí být přidružené k existujícímu ID uživatele v databázi určené database_name a toto ID uživatele musí mít oprávnění CREATE TABLE.

schema_name

Název schématu, do kterého nová tabulka patří.

table_name

Název nové tabulky. Názvy tabulek musí dodržovat pravidla pro identifikátory . table_name může být maximálně 128 znaků, s výjimkou místních dočasných názvů tabulek (názvy s předponou jedno znaménko# ()), které nesmí překročit 116 znaků.

AS FileTable

platí pro: SQL Server 2012 (11.x) a novější.

Vytvoří novou tabulku jako FileTable. Nezadáváte sloupce, protože FileTable má pevné schéma. Další informace naleznete v tématu FileTables.

column_nameCOMPUTED_COLUMN_EXPRESSION AS

Výraz, který definuje hodnotu počítaného sloupce. Počítaný sloupec je virtuální sloupec, který není fyzicky uložený v tabulce, pokud není sloupec označený JAKO TRVALÝ. Sloupec se vypočítá z výrazu, který používá jiné sloupce ve stejné tabulce. Počítaný sloupec může mít například definici: cost AS price * qty. Výrazem může být nespočítaný název sloupce, konstanta, funkce, proměnná a libovolná kombinace těchto operátorů spojených jedním nebo více operátory. Výraz nemůže být poddotaz nebo obsahovat datové typy aliasů.

Počítané sloupce se dají použít ve vybraných seznamech, klauzulích WHERE, klauzulích ORDER BY nebo jiných umístěních, ve kterých se dají regulární výrazy použít, s následujícími výjimkami:

  • Počítané sloupce musí být označené PERSISTED, aby se účastnily omezení CIZÍ KLÍČ nebo CHECK.

  • Počítaný sloupec lze použít jako klíčový sloupec v indexu nebo jako součást jakéhokoli omezení PRIMARY KEY nebo UNIQUE, pokud je vypočítaná hodnota sloupce definovaná deterministickým výrazem a datový typ výsledku je povolený ve sloupcích indexu.

    Pokud má například tabulka celočíselné sloupce a a bpočítaný sloupec a + b může být indexovaný, ale vypočítaný sloupec a + DATEPART(dd, GETDATE()) se nedá indexovat, protože hodnota se může při následných vyvolání změnit.

  • Počítaný sloupec nemůže být cílem příkazu INSERT nebo UPDATE.

Poznámka:

Každý řádek v tabulce může mít různé hodnoty pro sloupce, které jsou zapojeny do počítaného sloupce; Proto vypočítaný sloupec nemusí mít pro každý řádek stejnou hodnotu.

Na základě použitých výrazů určuje databázový stroj možnost null vypočítaných sloupců automaticky. Výsledek většiny výrazů je považován za nulový, i když jsou přítomny pouze nenulovatelné sloupce, protože možné podtečení nebo přetečení také vytváří výsledky NULL. COLUMNPROPERTY Pomocí funkce s Vlastnost AllowsNull můžete prozkoumat nullability libovolného počítaného sloupce v tabulce. Výraz, který je nullable lze převést na nenulable jeden zadáním ISNULLcheck_expression konstanty, kde konstanta je nenulová hodnota nahrazena pro jakýkoli výsledek NULL. Pro počítané sloupce založené na uživatelsky definovaných výrazech clr (Common Language Runtime) se vyžaduje oprávnění REFERENCE k typu.

SETRVAL

Určuje, že databázový stroj SQL Serveru fyzicky uloží vypočítané hodnoty v tabulce a aktualizuje hodnoty, když se aktualizují všechny další sloupce, na kterých závisí vypočítaný sloupec. Označení počítaného sloupce jako PERSISTED umožňuje vytvořit index vypočítaného sloupce, který je deterministický, ale není přesný. Další informace najdete v tématu Indexy vypočítaných sloupců. Všechny počítané sloupce, které se používají jako dělení sloupců dělené tabulky, musí být explicitně označeny PERSISTED. computed_column_expression musí být při zadání deterministický PERSISTED .

ON { partition_scheme | filegroup | "default" }

Určuje schéma oddílů nebo skupinu souborů, na které je tabulka uložena. Pokud je zadán partition_scheme , tabulka je dělenou tabulkou, jejíž oddíly jsou uloženy v sadě jedné nebo více skupin souborů zadaných v partition_scheme. Pokud je zadána skupina souborů , tabulka je uložena v pojmenované skupině souborů. Skupina souborů musí existovat v databázi. Pokud "default" je zadána nebo pokud není zapnuto vůbec, je tabulka uložena ve výchozí skupině souborů. Mechanismus úložiště tabulky, jak je uvedeno v příkazu CREATE TABLE, nelze následně změnit.

ON { partition_scheme | filegroup | "default" } lze také zadat v omezení PRIMÁRNÍ KLÍČ nebo UNIQUE. Tato omezení vytvářejí indexy. Pokud je zadána skupina souborů , index se uloží do pojmenované skupiny souborů. Pokud "default" je zadán nebo pokud není zapnuto vůbec, index se uloží ve stejné skupině souborů jako tabulka. Pokud omezení PRIMARY KEY nebo UNIQUE vytvoří clusterovaný index, datové stránky tabulky se uloží do stejné skupiny souborů jako index. Pokud CLUSTERED je zadáno nebo omezení jinak vytvoří clusterovaný index a je zadán partition_scheme , který se liší od partition_scheme nebo skupiny souborů definice tabulky, nebo naopak, bude dodržena pouze definice omezení a druhá bude ignorována.

Poznámka:

V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v ON "default" nebo ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

Po vytvoření dělené tabulky zvažte nastavení LOCK_ESCALATION možnosti tabulky na AUTO. To může zlepšit souběžnost tím, že povolí zámky, aby se místo tabulky eskalovala na úroveň oddílu (HoBT). Další informace naleznete v tématu ALTER TABLE.

TEXTIMAGE_ON { filegroup | "default" }

Označuje, že text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) a sloupce typu definované uživatelem CLR (včetně geometrie a geografie) jsou uloženy v zadané skupině souborů.

TEXTIMAGE_ON není povolená, pokud v tabulce nejsou žádné sloupce s velkými hodnotami. TEXTIMAGE_ON Nelze zadat, pokud je zadán partition_scheme . Pokud "default" je zadána nebo pokud TEXTIMAGE_ON není vůbec zadána, velké sloupce hodnot jsou uloženy ve výchozí skupině souborů. Úložiště dat sloupce s velkými hodnotami zadaných v CREATE TABLE tomto sloupci nelze následně změnit.

Poznámka:

varchar(max), nvarchar(max), varbinary(max), xml a velké hodnoty UDT se ukládají přímo v datovém řádku, až do limitu 8 000 bajtů a pokud se hodnota může přizpůsobit záznamu. Pokud se hodnota nevejde do záznamu, ukazatel se uloží v řádku a zbytek se uloží mimo řádek v prostoru úložiště LOB. 0 je výchozí hodnota, která označuje, že všechny hodnoty jsou uloženy přímo v datovém řádku.

TEXTIMAGE_ON Změní pouze umístění "prostoru úložiště LOB", nemá vliv na to, když jsou data uložena v řádku. Pokud chcete uložit celou obchodní hodnotu mimo řádek, použijte velké typy hodnot mimo řádek sp_tableoption .

V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v TEXTIMAGE_ON "default" nebo TEXTIMAGE_ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | filegroup | "default" }

Platí pro: SQL Server 2008 R2 (10.50.x) a novější. Azure SQL Database a Azure SQL Managed Instance nepodporují FILESTREAM.

Určuje skupinu souborů pro data FILESTREAM.

Pokud tabulka obsahuje data FILESTREAM a tabulka je rozdělena, musí být zahrnuta klauzule FILESTREAM_ON a musí zadat schéma oddílů filegroups FILESTREAM. Toto schéma oddílů musí používat stejnou funkci oddílu a sloupce oddílů jako schéma oddílů tabulky; v opačném případě se vyvolá chyba.

Pokud tabulka není rozdělená na oddíly, sloupec FILESTREAM nemůže být rozdělený na oddíly. Data FILESTREAM pro tabulku musí být uložena v jedné skupině souborů. Tato skupina souborů je zadána v klauzuli FILESTREAM_ON.

Pokud tabulka není rozdělená do oddílů a FILESTREAM_ON klauzule není zadaná, použije se skupina souborů FILESTREAM, která má nastavenou DEFAULT vlastnost. Pokud neexistuje žádná skupina souborů FILESTREAM, vyvolá se chyba.

Stejně jako u funkce ZAPNUTa a TEXTIMAGE_ONhodnota nastavená pomocí příkazu CREATE TABLE for FILESTREAM_ON se nedá změnit, s výjimkou následujících případů:

  • Příkaz CREATE INDEX převede haldu na clusterovaný index. V tomto případě je možné zadat jinou skupinu souborů FILESTREAM, schéma oddílů nebo hodnotu NULL.
  • Příkaz DROP INDEX převede clusterovaný index na haldu. V tomto případě je možné zadat jinou skupinu souborů FILESTREAM, schéma oddílů nebo "default" lze zadat.

Skupina souborů v FILESTREAM_ON <filegroup> klauzuli nebo každá skupina souborů FILESTREAM, která je pojmenovaná v schématu oddílů, musí mít definovaný jeden soubor pro skupinu souborů. Tento soubor musí být definován pomocí příkazu CREATE DATABASE nebo ALTER DATABASE ; v opačném případě se vyvolá chyba.

Související články FILESTREAM najdete v tématu Binární velký objekt – data objektů blob.

[ type_schema_name. ] type_name

Určuje datový typ sloupce a schéma, do kterého patří. Pro diskové tabulky použijte jeden z následujících datových typů:

  • Systémový datový typ
  • Typ aliasu založený na systémovém datovém typu SQL Serveru. Datové typy aliasů se vytvoří pomocí CREATE TYPE příkazu, než je lze použít v definici tabulky. Přiřazení NULL nebo NOT NULL pro datový typ aliasu lze během CREATE TABLE příkazu přepsat. Specifikace délky však nelze změnit; v příkazu nelze zadat délku datového typu aliasu CREATE TABLE .
  • Uživatelem definovaný typ CLR. Uživatelem definované typy CLR se vytvářejí pomocí CREATE TYPE příkazu, než je lze použít v definici tabulky. K vytvoření sloupce u uživatelem definovaného typu CLR se u typu vyžaduje oprávnění REFERENCES.

Pokud type_schema_name nezadáte, databázový stroj SQL Serveru odkazuje type_name v následujícím pořadí:

  • Systémový datový typ SYSTÉMU SQL Server.
  • Výchozí schéma aktuálního uživatele v aktuální databázi.
  • Schéma dbo v aktuální databázi.

Informace o tabulkách optimalizovaných pro paměť najdete v tématu Podporované datové typy pro In-Memory OLTP pro seznam podporovaných typů systému.

  • přesnost

    Přesnost zadaného datového typu. Další informace o platných hodnotách přesnosti naleznete v tématu Přesnost, Měřítko a Délka.

  • měřítko

    Měřítko pro zadaný datový typ. Další informace o platných hodnotách měřítka naleznete v tématu Přesnost, Měřítko a Délka.

  • maximální

    Platí pouze pro datové typy varchar, nvarchar a varbinary pro ukládání 2^31 bajtů znaků a binárních dat a 2^30 bajtů dat Unicode.

OBSAH

Určuje, že každá instance datového typu XML v column_name může obsahovat více prvků nejvyšší úrovně. CONTENT se vztahuje pouze na datový typ XML a lze jej zadat pouze v případě , že je zadán také xml_schema_collection. Pokud není zadaný, je výchozí chování CONTENT.

DOKUMENT

Určuje, že každá instance datového typu XML v column_name může obsahovat pouze jeden prvek nejvyšší úrovně. DOCUMENT se vztahuje pouze na datový typ XML a lze jej zadat pouze v případě , že je zadán také xml_schema_collection.

xml_schema_collection

Platí pouze pro datový typ XML pro přidružení kolekce schématu XML k typu. Před zadáním sloupce XML do schématu musí být schéma nejprve vytvořeno v databázi pomocí CREATE XML SCHEMA COLLECTION.

VÝCHOZÍ

Určuje hodnotu zadanou pro sloupec, pokud hodnota není explicitně zadána během vložení. Výchozí definice lze použít u všech sloupců s výjimkou těch, které jsou definovány jako časové razítko nebo definice s IDENTITY vlastností. Pokud je pro sloupec typu definované uživatelem zadaná výchozí hodnota, měl by tento typ podporovat implicitní převod z constant_expression na uživatelem definovaný typ. Při vyřazení tabulky se odeberou výchozí definice. Pouze konstantní hodnota, například řetězec znaků; skalární funkce (systém, uživatelem definovaná nebo funkce CLR); nebo NULL lze použít jako výchozí. Chcete-li zachovat kompatibilitu se staršími verzemi SQL Serveru, je možné přiřadit název omezení k výchozímu nastavení.

  • constant_expression

    Konstanta, NULL nebo systémová funkce, která se používá jako výchozí hodnota sloupce.

  • memory_optimized_constant_expression

    Konstanta, NULL nebo systémová funkce, která je podporována jako výchozí hodnota sloupce. Musí být podporován v nativně zkompilovaných uložených procedurách. Další informace o předdefinovaných funkcích v nativně zkompilovaných uložených procedurách naleznete v tématu Podporované funkce pro nativně kompilované moduly T-SQL.

IDENTITA

Označuje, že nový sloupec je sloupec identity. Když do tabulky přidáte nový řádek, databázový stroj poskytuje jedinečnou přírůstkovou hodnotu sloupce. Sloupce identity se obvykle používají s omezeními PRIMÁRNÍHO KLÍČE, které slouží jako jedinečný identifikátor řádku tabulky. Vlastnost IDENTITY lze přiřadit ke sloupcům tinyint, smallint, int, bigint, decimal(p, 0) nebo numeric(p, 0). Pro každou tabulku je možné vytvořit pouze jeden sloupec identity. Vázané výchozí hodnoty a výchozí omezení nelze použít se sloupcem identity. Musí být zadáno počáteční i přírůstkové nebo ani jedno. Pokud není zadán žádný z nich, výchozí hodnota je (1,1).

  • semeno

    Hodnota použitá pro první řádek načtený do tabulky.

  • přírůstek

    Přírůstková hodnota přidaná k hodnotě identity předchozího načteného řádku.

NE PRO REPLIKACI

CREATE TABLE V příkazu lze klauzuli NOT FOR REPLICATION zadat pro vlastnost IDENTITY, omezení cizího klíče a omezení CHECK. Pokud je pro IDENTITY vlastnost zadaná tato klauzule, hodnoty se při vkládání agentů replikace nevýkoní ve sloupcích identit. Pokud je tato klauzule zadaná pro omezení, omezení se nevynucuje, když agenti replikace provádějí operace vložení, aktualizace nebo odstranění.

VYGENEROVÁNO VŽDY JAKO { ŘÁDEK | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ SKRYTÉ ] [ NOT NULL ]

Platí pro: SQL Server 2016 (13.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Určuje sloupec používaný systémem k automatickému záznamu informací o verzích řádků v tabulce a její tabulce historie (pokud je tabulka systémová verze a obsahuje tabulku historie). Tento argument s parametrem WITH SYSTEM_VERSIONING = ON použijte k vytvoření tabulek se systémovou verzí: dočasné tabulky nebo tabulky registru. Další informace najdete v aktualizovatelných tabulkách registru a dočasných tabulkách.

Parametr Požadovaný datový typ Požadovaná nullability Popis
Řádek datetime2 ZAČÍNAT: NOT NULL
KONEC: NOT NULL
Buď počáteční čas, pro který je verze řádku platná (START), nebo koncový čas, pro který je verze řádku platná (END). Tento argument s argumentem PERIOD FOR SYSTEM_TIME použijte k vytvoření dočasné tabulky.
TRANSACTION_ID bigint ZAČÍNAT: NOT NULL
KONEC: NULL
Platí pro: SQL Server 2022 (16.x) a novější a Azure SQL Database.

ID transakce, která vytvoří (START) nebo zneplatní (END) verzi řádku. Pokud je tabulka hlavní knihy, ID odkazuje na řádek v zobrazení sys.database_ledger_transactions .
SEQUENCE_NUMBER bigint ZAČÍNAT: NOT NULL
KONEC: NULL
Platí pro: SQL Server 2022 (16.x) a novější a Azure SQL Database.

Pořadové číslo operace, která vytvoří (START) nebo odstraní (END) verzi řádku. Tato hodnota je v rámci transakce jedinečná.

Pokud se pokusíte zadat sloupec, který nesplňuje výše uvedené požadavky na datový typ nebo nulovou hodnotu, systém vyvolá chybu. Pokud explicitně nezadáte hodnotu null, systém definuje sloupec podle NULLNOT NULL výše uvedených požadavků.

Jedním nebo oběma sloupci období můžete označit příznakem HIDDEN , aby se tyto sloupce implicitně skrývaly tak, aby SELECT * FROM <table> nevrací hodnotu těchto sloupců. Ve výchozím nastavení nejsou sloupce období skryté. Aby bylo možné je použít, musí být skryté sloupce explicitně zahrnuty do všech dotazů, které přímo odkazují na dočasnou tabulku. Chcete-li změnit HIDDEN atribut existujícího sloupce období, PERIOD je nutné vynechat a znovu vytvořit s jiným skrytým příznakem.

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

Platí pro: SQL Server 2014 (12.x) a novější a Azure SQL Database.

Určuje vytvoření indexu v tabulce. Může se jednat o clusterovaný index nebo neclusterovaný index. Index bude obsahovat sloupce uvedené a seřadí data vzestupně nebo sestupně.

INDEX INDEX_NAME CLUSTERED COLUMNSTORE

Platí pro: SQL Server 2014 (12.x) a novější a Azure SQL Database.

Určuje uložení celé tabulky ve sloupcovém formátu s clusterovaným indexem columnstore. To vždy zahrnuje všechny sloupce v tabulce. Data nejsou seřazená v abecedním nebo číselném pořadí, protože řádky jsou uspořádané tak, aby získaly výhody komprese columnstore.

Můžete zadat pořadí dat v clusterovaném indexu columnstore počínaje SQL Serverem 2022 (16.x), v Azure SQL Database, v Azure SQL Managed InstanceAUTD a v Azure Synapse Analytics. Další informace najdete v sekci Ladění výkonu se seřazenými indexy typu columnstore.

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

Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.

Určuje vytvoření neclusterovaného indexu columnstore v tabulce. Podkladovou tabulkou může být halda úložiště řádků nebo clusterovaný index nebo clusterovaný index columnstore. Ve všech případech se při vytváření neclusterovaného indexu columnstore v tabulce uloží druhá kopie dat pro sloupce v indexu.

Neclusterovaný index columnstore se ukládá a spravuje jako clusterovaný index columnstore. Označuje se jako neclusterovaný index columnstore, protože sloupce mohou být omezené a v tabulce existují jako sekundární index.

Můžete zadat pořadí dat v neclusterovaném indexu columnstore ve službě Azure SQL Database a ve službě Azure SQL Managed InstanceAUTD. Další informace najdete v sekci Ladění výkonu se seřazenými indexy typu columnstore.

ON partition_scheme_name ( column_name )

Určuje schéma oddílů, které definuje skupiny souborů, na které se namapují oddíly děleného indexu. Schéma oddílů musí existovat v databázi spuštěním příkazu CREATE PARTITION SCHEME nebo ALTER PARTITION SCHEME. column_name určuje sloupec, podle kterého bude dělený index rozdělený. Tento sloupec musí odpovídat datovému typu, délce a přesnosti argumentu funkce oddílu, který partition_scheme_name používá. column_name nejsou omezeny na sloupce v definici indexu. Můžete zadat libovolný sloupec v základní tabulce s výjimkou dělení indexu UNIQUE, column_name je nutné vybrat z nich, které se používají jako jedinečný klíč. Toto omezení umožňuje databázovému stroji ověřit jedinečnost hodnot klíčů pouze v rámci jednoho oddílu.

Poznámka:

Když rozdělíte ne jedinečné clusterované indexy, databázový stroj ve výchozím nastavení přidá sloupec dělení do seznamu clusterovaných indexových klíčů, pokud ještě není zadaný. Při dělení nevýznamného neclusterovaného indexu přidá databázový stroj sloupec dělení jako sloupec bez klíče (zahrnutého) indexu, pokud ještě není zadaný.

Pokud partition_scheme_name nebo skupinu souborů nezadáte a tabulka se rozdělí, index se umístí do stejného schématu oddílů pomocí stejného sloupce dělení jako podkladová tabulka.

Poznámka:

V indexu XML nelze zadat schéma dělení. Pokud je základní tabulka rozdělená na oddíly, index XML používá stejné schéma oddílů jako tabulka.

Další informace o dělení indexů dělené tabulky a indexy.

ZAPNUTO filegroup_name

Vytvoří zadaný index pro zadanou skupinu souborů. Pokud není zadáno žádné umístění a tabulka nebo zobrazení nejsou rozdělené na oddíly, index použije stejnou skupinu souborů jako podkladová tabulka nebo zobrazení. Skupina souborů už musí existovat.

ZAPNUTO "výchozí"

Vytvoří zadaný index ve výchozí skupině souborů.

Poznámka:

V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v ON "default" nebo ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

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

Platí pro: SQL Server 2008 R2 (10.50.x) a novější.

Určuje umístění dat FILESTREAM pro tabulku při vytvoření clusterovaného indexu. Klauzule FILESTREAM_ON umožňuje přesunutí dat FILESTREAM do jiného schématu filegroup nebo oddílu FILESTREAM.

filestream_filegroup_name je název filegroup FILESTREAM. Skupina souborů musí mít jeden soubor definovaný pro skupinu souborů pomocí příkazu CREATE DATABASE nebo ALTER DATABASE; v opačném případě se vyvolá chyba.

Pokud je tabulka rozdělená na oddíly, FILESTREAM_ON musí být zahrnuta klauzule a musí zadat schéma oddílů filegroups FILESTREAM, které používá stejnou funkci oddílu a sloupce oddílů jako schéma oddílů tabulky. V opačném případě se vyvolá chyba.

Pokud tabulka není rozdělená na oddíly, sloupec FILESTREAM nemůže být rozdělený na oddíly. Data FILESTREAM pro tabulku musí být uložena v jedné skupině souborů, která je zadána v klauzuli FILESTREAM_ON.

FILESTREAM_ON NULL lze zadat v příkazu CREATE INDEX, pokud se vytváří clusterovaný index a tabulka neobsahuje sloupec FILESTREAM.

Další informace naleznete v tématu FILESTREAM.

ROWGUIDCOL

Označuje, že nový sloupec je sloupec GUID řádku. Jako sloupec ROWGUIDCOL lze určit pouze jeden sloupec uniqueidentifier na tabulku. Použití vlastnosti ROWGUIDCOL umožňuje, aby se na sloupec odkazoval pomocí $ROWGUID. Vlastnost ROWGUIDCOL lze přiřadit pouze ke sloupci uniqueidentifier . Sloupce datového typu definované uživatelem nelze určit pomocí ROWGUIDCOL.

Vlastnost ROWGUIDCOL nevynucuje jedinečnost hodnot uložených ve sloupci. ROWGUIDCOL také automaticky negeneruje hodnoty pro nové řádky vložené do tabulky. Pokud chcete vygenerovat jedinečné hodnoty pro každý sloupec, použijte funkci NEWID nebo NEWSEQUENTIALID u příkazů INSERT nebo použijte tyto funkce jako výchozí pro sloupec.

ŠIFROVANÉ POMOCÍ

Určuje šifrování sloupců pomocí funkce Always Encrypted .

  • COLUMN_ENCRYPTION_KEY = key_name

    Určuje šifrovací klíč sloupce. Další informace naleznete v tématu CREATE COLUMN ENCRYPTION KEY.

  • ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED }

    Deterministické šifrování používá metodu, která vždy generuje stejnou zašifrovanou hodnotu pro libovolnou danou hodnotu prostého textu. Použití deterministického šifrování umožňuje vyhledávání pomocí porovnání rovnosti, seskupování a spojování tabulek pomocí spojení rovnosti na základě šifrovaných hodnot, ale může také umožnit neoprávněným uživatelům odhadnout informace o šifrovaných hodnotách prozkoumáním vzorů v šifrovaném sloupci. Spojení dvou tabulek se sloupci šifrovanými deterministicky je možné pouze v případě, že jsou oba sloupce šifrované pomocí stejného šifrovacího klíče sloupce. Deterministické šifrování musí pro sloupce znaků použít sloupcovou kolaci s pořadím řazení binary2.

    randomizované šifrování používá metodu, která šifruje data méně předvídatelným způsobem. Randomizované šifrování je bezpečnější, ale brání jakýmkoli výpočtům a indexování u šifrovaných sloupců, pokud instance SQL Serveru nepodporuje funkci Always Encrypted se zabezpečenými enklávy. Podrobnosti naleznete v části Always Encrypted se zabezpečenou enklávou.

    Pokud používáte funkci Always Encrypted (bez zabezpečených enkláv), použijte deterministické šifrování sloupců, které se budou prohledávat pomocí parametrů nebo seskupování parametrů, například čísla ID státní správy. Použijte randomizované šifrování dat, jako je číslo platební karty, které není seskupené s jinými záznamy nebo slouží ke spojení tabulek a které se nehledají, protože k vyhledání řádku obsahujícího šifrovaný sloupec zájmu použijete jiné sloupce (například číslo transakce).

    Pokud používáte funkci Always Encrypted se zabezpečenými enklávy, je doporučeným typem šifrování randomizované šifrování.

    Sloupce musí být opravňujícím datovým typem.

  • ALGORITMUS

    platí pro: SQL Server 2016 (13.x) a novější.

    Musí být 'AEAD_AES_256_CBC_HMAC_SHA_256'.

    Další informace včetně omezení funkcí najdete v tématu Funkce Always Encrypted.

ŘÍDKÝ

Označuje, že sloupec je řídký sloupec. Úložiště řídkých sloupců je optimalizované pro hodnoty null. Řídké sloupce nelze označit jako NOT NULL. Další omezení a další informace o řídkých sloupcích najdete v tématu Použití řídkých sloupců.

MASKED WITH ( FUNCTION = 'mask_function' )

platí pro: SQL Server 2016 (13.x) a novější.

Určuje dynamickou masku dat. mask_function je název funkce maskování s příslušnými parametry. K dispozici jsou čtyři funkce:

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

Vyžaduje oprávnění ALTER ANY MASK.

Parametry funkce najdete v tématu dynamického maskování dat.

FILESTREAM

Platí pro: SQL Server 2008 R2 (10.50.x) a novější.

Platné pouze pro sloupce varbinary(max). Určuje úložiště FILESTREAM pro data objektu blob varbinary(max ).

Tabulka musí mít také sloupec datového typu uniqueidentifier , který má atribut ROWGUIDCOL. Tento sloupec nesmí povolit hodnoty null a musí mít omezení JEDINEČNÉ nebo PRIMÁRNÍ KLÍČ s jedním sloupcem. Hodnota GUID pro sloupec musí být zadána aplikací při vkládání dat, nebo ve výchozím omezení, které používá funkci NEWID ().

Sloupec ROWGUIDCOL nelze vynechat a související omezení nelze změnit, pokud je pro tabulku definovaný sloupec FILESTREAM. Sloupec ROWGUIDCOL lze vynechat až po vyřazení posledního sloupce FILESTREAM.

Pokud je pro sloupec zadaný atribut úložiště FILESTREAM, všechny hodnoty pro tento sloupec jsou uloženy v kontejneru dat FILESTREAM v systému souborů.

COLLATION_NAME COLLATE

Určuje kolaci sloupce. Název kolace může být buď název kolace Systému Windows, nebo název kolace SQL. collation_name platí jenom pro sloupce znaku, varcharu, textu, ncharu, nvarcharu a ntextových datových typů. Pokud není zadaný, je sloupec přiřazen buď kolaci uživatelem definovaného datového typu, pokud je sloupec uživatelem definovaný datový typ, nebo výchozí kolace databáze.

Další informace o názvech kolace Systému Windows a SQL naleznete v tématu Název kolace systému Windows a Název kolace SQL.

Další informace naleznete v tématu COLLATE.

OMEZENÍ

Volitelné klíčové slovo, které označuje začátek definice PRIMÁRNÍHO KLÍČE, NOT NULL, UNIQUE, CIZÍ KLÍČ nebo CHECK omezení.

  • constraint_name

    Název omezení. Názvy omezení musí být jedinečné v rámci schématu, do kterého tabulka patří.

  • NULL | NOT NULL

    Určete, zda jsou ve sloupci povoleny hodnoty null. NULL není výhradně omezení, ale dá se zadat stejně jako NOT NULL. HODNOTU NOT NULL lze zadat pro počítané sloupce pouze v případě, že je zadána funkce PERSISTED.

  • PRIMÁRNÍ KLÍČ

    Omezení, které vynucuje integritu entity pro zadaný sloupec nebo sloupce prostřednictvím jedinečného indexu. Pro každou tabulku lze vytvořit pouze jedno omezení PRIMÁRNÍHO KLÍČE.

  • JEDINEČNÝ

    Omezení, které poskytuje integritu entity pro zadaný sloupec nebo sloupce prostřednictvím jedinečného indexu. Tabulka může mít několik omezení UNIQUE.

  • CLUSTERED | NECLUSTERED

    Označuje, že clusterovaný nebo neclusterovaný index je vytvořen pro omezení PRIMÁRNÍ KLÍČ nebo UNIQUE. Omezení PRIMÁRNÍHO KLÍČE jsou výchozí pro CLUSTERED a jedinečná omezení výchozí pro NONCLUSTERED.

    CREATE TABLE V příkazu lze clusterED zadat pouze pro jedno omezení. Pokud je pro omezení UNIQUE zadáno clusterED a je zadáno omezení PRIMÁRNÍHO KLÍČE, primární klíč je výchozí hodnota NONCLUSTERED.

  • ODKAZY NA CIZÍ KLÍČ

    Omezení, které poskytuje referenční integritu dat ve sloupci nebo sloupcích. Omezení CIZÍHO KLÍČE vyžadují, aby každá hodnota ve sloupci existovala v odpovídajícím odkazovaném sloupci nebo sloupcích v odkazované tabulce. Omezení CIZÍHO KLÍČE můžou odkazovat pouze na sloupce, které jsou omezení PRIMARY KEY nebo UNIQUE v odkazované tabulce nebo sloupcích odkazovaných v indexu UNIQUE v odkazované tabulce. Cizí klíče ve vypočítaných sloupcích musí být také označeny JAKO TRVALÉ.

  • [ [ schema_name. ] referenced_table_name ]

    Název tabulky odkazované omezením CIZÍ KLÍČ a schéma, do kterého patří.

  • ( ref_column [ ,... n ] )

    Sloupec nebo seznam sloupců z tabulky odkazované omezením CIZÍ KLÍČ.

  • PŘI ODSTRANĚNÍ { ŽÁDNÁ AKCE | CASCADE | NASTAVIT HODNOTU NULL | NASTAVIT VÝCHOZÍ }

    Určuje, co se akce stane s řádky v tabulce vytvořené, pokud tyto řádky mají referenční relaci a odkazovaný řádek se odstraní z nadřazené tabulky. Výchozí hodnota není ŽÁDNÁ AKCE.

  • ŽÁDNÁ AKCE

    Databázový stroj vyvolá chybu a akce odstranění na řádku v nadřazené tabulce se vrátí zpět.

  • KASKÁDA

    Odpovídající řádky se odstraní z odkazující tabulky, pokud je tento řádek odstraněn z nadřazené tabulky.

  • NASTAVIT HODNOTU NULL

    Všechny hodnoty, které tvoří cizí klíč, jsou nastaveny na hodnotu NULL, pokud je odstraněn odpovídající řádek v nadřazené tabulce. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.

  • NASTAVIT VÝCHOZÍ

    Při odstranění odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec s možnou hodnotou null a neexistuje žádná explicitní výchozí sada hodnot, hodnota NULL se stane implicitní výchozí hodnotou sloupce.

    Nezadávejte CASCADE , jestli bude tabulka zahrnuta do slučovací publikace, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.

    ON DELETE CASCADE Nelze definovat, pokud INSTEAD OF aktivační událost ON DELETE již v tabulce existuje.

    Například v AdventureWorks2022 databázi ProductVendor má tabulka referenční relaci s tabulkou Vendor . Cizí ProductVendor.BusinessEntityID klíč odkazuje na Vendor.BusinessEntityID primární klíč.

    Pokud je DELETE příkaz proveden na řádku v Vendor tabulce a ON DELETE CASCADE akce je určena pro ProductVendor.BusinessEntityID, databázový stroj zkontroluje jeden nebo více závislých řádků v ProductVendor tabulce. Pokud nějaké existují, odstraní se závislé řádky v ProductVendor tabulce a také řádek odkazovaný v Vendor tabulce.

    Pokud NO ACTION je naopak zadán, databázový stroj vyvolá chybu a vrátí akci odstranění na Vendor řádku, pokud je v tabulce, která na ni odkazuje, alespoň jeden řádek ProductVendor .

  • ON UPDATE { NO ACTION | CASCADE | NASTAVIT HODNOTU NULL | NASTAVIT VÝCHOZÍ }

    Určuje, co se stane s řádky v tabulce změněné, když tyto řádky mají referenční relaci a odkazovaný řádek se aktualizuje v nadřazené tabulce. Výchozí hodnota není ŽÁDNÁ AKCE.

  • ŽÁDNÁ AKCE

    Databázový stroj vyvolá chybu a akce aktualizace na řádku v nadřazené tabulce se vrátí zpět.

  • KASKÁDA

    Odpovídající řádky se aktualizují v odkazující tabulce, když se tento řádek aktualizuje v nadřazené tabulce.

  • NASTAVIT HODNOTU NULL

    Při aktualizaci odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na hodnotu NULL. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.

  • NASTAVIT VÝCHOZÍ

    Při aktualizaci odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec s možnou hodnotou null a neexistuje žádná explicitní výchozí sada hodnot, hodnota NULL se stane implicitní výchozí hodnotou sloupce.

    Nezadávejte CASCADE , jestli bude tabulka zahrnuta do slučovací publikace, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.

    ON UPDATE CASCADE, SET NULLnebo SET DEFAULT nelze definovat, pokud INSTEAD OF trigger ON UPDATE již existuje v tabulce, která se mění.

    Například v AdventureWorks2022 databázi ProductVendor má tabulka referenční relaci s Vendor tabulkou: ProductVendor.BusinessEntity cizí klíč odkazuje na Vendor.BusinessEntityID primární klíč.

    Pokud je příkaz UPDATE proveden na řádku v Vendor tabulce a je zadána akce ON UPDATE CASCADE pro ProductVendor.BusinessEntityID, databázový stroj kontroluje jeden nebo více závislých řádků v ProductVendor tabulce. Pokud nějaké existují, aktualizují se závislé řádky v ProductVendor tabulce a také řádek odkazovaný v Vendor tabulce.

    Pokud není zadána ŽÁDNÁ AKCE, databázový stroj vyvolá chybu a vrátí akci aktualizace na Vendor řádku, pokud je v tabulce, která na ni odkazuje, alespoň jeden řádek ProductVendor .

  • ZKONTROLUJ

    Omezení, které vynucuje integritu domény omezením možných hodnot, které lze zadat do sloupce nebo sloupců. Omezení CHECK u počítaných sloupců musí být označená také jako TRVALÁ.

  • logical_expression

    Logický výraz, který vrací hodnotu PRAVDA nebo NEPRAVDA. Datové typy aliasů nemůžou být součástí výrazu.

  • column_name

    Sloupec nebo seznam sloupců v závorkách, které se používají v omezeních tabulky k označení sloupců použitých v definici omezení

  • [ ASC | DESC ]

    Určuje pořadí řazení sloupců nebo sloupců, které se účastní omezení tabulky. Výchozí hodnota je ASC.

  • partition_scheme_name

    Název schématu oddílů, který definuje skupiny souborů, na které se namapují oddíly dělené tabulky. Schéma oddílů musí existovat v databázi.

  • [ partition_column_name. ]

    Určuje sloupec, podle kterého bude dělená tabulka rozdělena. Sloupec se musí shodovat s funkcí oddílu, která partition_scheme_name používá z hlediska datového typu, délky a přesnosti. Počítaný sloupec, který se účastní funkce oddílu, musí být explicitně označen jako PERSISTED.

    Důležité

    Doporučujeme zadat HODNOTU NOT NULL ve sloupci dělení dělených tabulek a také tabulky, které nejsou rozdělené do oddílů, které jsou zdroji nebo cíli ALTER TABLE... OPERACE SWITCH. Tím zajistíte, že všechna omezení CHECK pro dělení sloupců nemusí kontrolovat hodnoty null.

  • WITH FILLFACTOR = fillfactor

    Určuje, jak by měl databázový stroj zaplnit každou indexovou stránku, která se používá k ukládání dat indexu. Uživatelem zadané hodnoty fillfactor mohou být od 1 do 100. Pokud není zadaná hodnota, výchozí hodnota je 0. Hodnoty výplňového faktoru 0 a 100 jsou ve všech ohledech stejné.

    Důležité

    Dokumentování POMOCÍ FILLFACTOR = fillfactor jako jediná možnost indexu, která se vztahuje na omezení PRIMÁRNÍ KLÍČ nebo JEDINEČNÉ, je zachována kvůli zpětné kompatibilitě, ale nebude dokumentována tímto způsobem v budoucích verzích.

column_set_name COLUMN_SET XML PRO ALL_SPARSE_COLUMNS

Název sady sloupců. Sada sloupců je netypová reprezentace XML, která kombinuje všechny řídké sloupce tabulky do strukturovaného výstupu. Další informace o sadách sloupců najdete v tématu Použití sad sloupců.

OBDOBÍ PRO SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )

Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

Určuje názvy sloupců, které systém použije k zaznamenání období, pro které je záznam platný. Tento argument použijte s GENERATED ALWAYS AS ROW { START | END } argumenty a WITH SYSTEM_VERSIONING = ON vytvořte dočasnou tabulku. Další informace naleznete v tématu dočasné tabulky.

COMPRESSION_DELAY

Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

V případě optimalizované paměti zpoždění určuje minimální počet minut, po které musí řádek zůstat v tabulce beze změny, než bude mít nárok na kompresi do indexu columnstore. SQL Server vybere konkrétní řádky, které se mají komprimovat podle času poslední aktualizace. Pokud se například řádky často mění během dvouhodinového časového období, můžete nastavit COMPRESSION_DELAY = 120 Minutes , aby se aktualizace dokončily před komprimacemi řádku SQL Serverem.

U tabulky založené na disku určuje zpoždění minimální počet minut, po které musí rozdílová skupina řádků ve stavu CLOSED zůstat v rozdílové skupině řádků, aby ho SQL Server mohl zkomprimovat do komprimované skupiny řádků. Vzhledem k tomu, že tabulky založené na disku nesledují časy vkládání a aktualizace jednotlivých řádků, SQL Server použije zpoždění u rozdílových skupin řádků ve stavu CLOSED.

Výchozí hodnota je 0 minut.

Doporučení k použití COMPRESSION_DELAYnajdete v tématu Začínáme se columnstorem pro provozní analýzy v reálném čase.

< > table_option ::=

Určuje jednu nebo více možností tabulky.

DATA_COMPRESSION

Určuje možnost komprese dat pro zadanou tabulku, číslo oddílu nebo rozsah oddílů. Možnosti jsou následující:

  • ŽÁDNÝ

    Tabulky nebo zadané oddíly nejsou komprimované.

  • Řádek

    Tabulky nebo zadané oddíly se komprimují pomocí komprese řádků.

  • STRÁNKA

    Tabulky nebo zadané oddíly se komprimují pomocí komprese stránky.

  • COLUMNSTORE

    Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

    Platí pouze pro indexy columnstore, včetně neclusterovaných indexů columnstore i clusterovaných indexů columnstore. COLUMNSTORE určuje komprimaci s nejvýkonnější kompresí columnstore. Toto je typická volba.

  • COLUMNSTORE_ARCHIVE

    Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

    Platí pouze pro indexy columnstore, včetně neclusterovaných indexů columnstore i clusterovaných indexů columnstore. COLUMNSTORE_ARCHIVE dále zkomprimuje tabulku nebo oddíl na menší velikost. Můžete ho použít pro archivaci nebo v jiných situacích, které vyžadují menší velikost úložiště a mohou si dovolit více času pro ukládání a načítání.

Další informace naleznete v tématu Komprese dat.

XML_COMPRESSION

platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.

Určuje možnost komprese XML pro všechny xml sloupce datového typu v tabulce. Možnosti jsou následující:

  • Zapnuto

    Sloupce používající datový typ xml jsou komprimované.

  • Vypnuto

    Sloupce používající xml datový typ nejsou komprimované.

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

Určuje oddíly, na které se vztahují nastavení DATA_COMPRESSION nebo XML_COMPRESSION. Pokud tabulka není rozdělená na oddíly, ON PARTITIONS vygeneruje argument chybu. ON PARTITIONS Pokud klauzule není za předpokladu, DATA_COMPRESSION tato možnost se použije pro všechny oddíly dělené tabulky.

partition_number_expression lze zadat následujícími způsoby:

  • Zadejte číslo oddílu oddílu, například: ON PARTITIONS (2)
  • Zadejte čísla oddílů pro několik jednotlivých oddílů oddělených čárkami, například: ON PARTITIONS (1, 5)
  • Zadejte rozsahy i jednotlivé oddíly, například: ON PARTITIONS (2, 4, 6 TO 8)

<range> lze zadat jako čísla oddílů oddělená slovem TO, například: ON PARTITIONS (6 TO 8).

Pokud chcete nastavit různé typy komprese dat pro různé oddíly, zadejte DATA_COMPRESSION možnost více než jednou, například:

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

Můžete také zadat XML_COMPRESSION možnost více než jednou, například:

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

Určuje jednu nebo více možností indexu. Úplný popis těchto možností najdete v tématu CREATE INDEX.

PAD_INDEX = { ON | VYPNUTO }

Pokud je zapnuto, procento volného místa určené funkcí FILLFACTOR se použije na stránky zprostředkující úrovně indexu. Pokud není zadaná hodnota VYPNUTÁ nebo FILLFACTOR, zaplní se stránky střední úrovně tak, aby se blíží kapacitě, takže je dostatek místa pro alespoň jeden řádek maximální velikosti, kterou index může mít vzhledem k sadě klíčů na zprostředkujících stránkách. Výchozí hodnota je VYPNUTÁ.

FILLFACTOR = fillfactor

Určuje procento, které určuje, jak by měl databázový stroj během vytváření nebo změny indexu nastavit úroveň listu každé stránky indexu. fillfactor musí být celočíselná hodnota od 1 do 100. Výchozí hodnota je 0. Hodnoty výplňového faktoru 0 a 100 jsou ve všech ohledech stejné.

IGNORE_DUP_KEY = { ON | VYPNUTO }

Určuje chybovou odpověď, když se operace vložení pokusí vložit duplicitní hodnoty klíče do jedinečného indexu. Možnost IGNORE_DUP_KEY se vztahuje pouze na operace vložení po vytvoření nebo vytvoření indexu. Možnost nemá žádný vliv při provádění CREATE INDEX, ALTER INDEXnebo UPDATE. Výchozí hodnota je VYPNUTÁ.

  • Zapnuto

    Při vložení duplicitních hodnot klíče do jedinečného indexu se zobrazí zpráva s upozorněním. Pouze řádky, které porušují omezení jedinečnosti, selžou.

  • Vypnuto

    Při vložení duplicitních hodnot klíče do jedinečného indexu se zobrazí chybová zpráva. Celá operace INSERT se vrátí zpět.

IGNORE_DUP_KEY nelze nastavit na hodnotu ZAPNUTO pro indexy vytvořené v zobrazení, ne jedinečné indexy, indexy XML, prostorové indexy a filtrované indexy.

Chcete-li zobrazit , použijtesys.indexes .

V zpětně kompatibilní syntaxi je WITH IGNORE_DUP_KEY ekvivalentní WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | VYPNUTO }

Pokud je zapnuto, statistiky zastaralého indexu se automaticky nepřepočítá. Pokud je tato možnost vypnutá, je povolená automatická aktualizace statistik. Výchozí hodnota je VYPNUTÁ.

ALLOW_ROW_LOCKS = { ON | VYPNUTO }

Pokud je zapnuto, jsou zámky řádků povoleny, když přistupujete k indexu. Databázový stroj určuje, kdy se používají zámky řádků. Pokud je vypnuto, zámky řádků se nepoužívají. Výchozí hodnota je ZAPNUTÁ.

ALLOW_PAGE_LOCKS = { ON | VYPNUTO }

Pokud je zapnuto, jsou při přístupu k indexu povoleny zámky stránek. Databázový stroj určuje, kdy se používají zámky stránek. Pokud je vypnuto, zámky stránek se nepoužívají. Výchozí hodnota je ZAPNUTÁ.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | VYPNUTO }

Platí pro: SQL Server 2019 (15.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Určuje, jestli se má optimalizovat pro kolizí vložení poslední stránky. Výchozí hodnota je VYPNUTÁ. Další informace najdete v části Sekvenční klíče na stránce CREATE INDEX.

FILETABLE_DIRECTORY = directory_name

platí pro: SQL Server 2012 (11.x) a novější.

Určuje název adresáře FileTable kompatibilní se systémem Windows. Tento název by měl být jedinečný mezi všemi názvy adresářů FileTable v databázi. Porovnání jedinečnosti nerozlišuje malá a velká písmena bez ohledu na nastavení kolace. Pokud tato hodnota není zadaná, použije se název FileTable.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

platí pro: SQL Server 2012 (11.x) a novější. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.

Určuje název kolace, který se má použít pro Name sloupec v tabulce FileTable. Kolace musí být nerozlišující velká a malá písmena, aby byla v souladu s sémantikou pojmenování souborů operačního systému Windows. Pokud tato hodnota není zadaná, použije se výchozí kolace databáze. Pokud výchozí kolace databáze rozlišují malá a velká písmena, vyvolá se chyba a operace CREATE TABLE selže.

  • collation_name

    Název kolace nerozlišující malá a velká písmena.

  • database_default

    Určuje, že se má použít výchozí kolace databáze. Tato kolace musí být nerozlišující malá a velká písmena.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

platí pro: SQL Server 2012 (11.x) a novější. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.

Určuje název, který se má použít pro omezení primárního klíče, které se automaticky vytvoří v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

platí pro: SQL Server 2012 (11.x) a novější. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.

Určuje název, který se má použít pro jedinečné omezení, které se automaticky vytvoří ve sloupci stream_id v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

platí pro: SQL Server 2012 (11.x) a novější. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.

Určuje název, který se má použít pro jedinečné omezení, které se automaticky vytvoří na parent_path_locator a sloupcích názvů v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.

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

Platí pro: SQL Server 2016 (13.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Povolí systémovou správu verzí tabulky, pokud jsou splněny požadavky na omezení datového typu, omezení nullability a primárního klíče. Systém zaznamená historii každého záznamu v tabulce se systémovou verzí v samostatné tabulce historie. Pokud se argument HISTORY_TABLE nepoužívá, název této tabulky historie bude MSSQL_TemporalHistoryFor<primary_table_object_id>. Pokud je název tabulky historie zadán během vytváření tabulky historie, je nutné zadat schéma a název tabulky.

Pokud tabulka historie neexistuje, systém vygeneruje novou tabulku historie, která odpovídá schématu aktuální tabulky ve stejné skupině souborů jako aktuální tabulka, a vytvoří propojení mezi těmito dvěma tabulkami a umožní systému zaznamenávat historii jednotlivých záznamů v aktuální tabulce v tabulce historie. Ve výchozím nastavení je tabulka historie PAGE komprimována.

Pokud se HISTORY_TABLE argument používá k vytvoření propojení a použití existující tabulky historie, vytvoří se propojení mezi aktuální tabulkou a zadanou tabulkou. Pokud je aktuální tabulka rozdělená na oddíly, vytvoří se ve výchozí skupině souborů tabulka historie, protože konfigurace dělení se automaticky nereplikuje z aktuální tabulky do tabulky historie. Při vytváření odkazu na existující tabulku historie můžete provést kontrolu konzistence dat. Tato kontrola konzistence dat zajišťuje, že se existující záznamy nepřekrývají. Provedení kontroly konzistence dat je výchozí.

Tento argument použijte s argumenty PERIOD FOR SYSTEM_TIME a GENERATED ALWAYS AS ROW { START | END } povolte správu verzí systému v tabulce. Další informace naleznete v tématu dočasné tabulky. Tento argument s argumentem WITH LEDGER = ON použijte k vytvoření aktualizovatelné tabulky registru. Použití existujících tabulek historie s tabulkami registru není povolené.

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

platí pro: SQL Server 2016 (13.x) a novější.

Vytvoří novou tabulku s povolenou nebo zakázanou funkcí Stretch Database. Další informace najdete v tématu Stretch Database.

Důležité

Funkce Stretch Database je v SQL Serveru 2022 (16.x) a Azure SQL Database zastaralá. Tato funkce bude odebrána v budoucí verzi databázového stroje. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.

povolení funkce Stretch Database pro tabulku

Když funkci Stretch pro tabulku povolíte zadáním ON, můžete volitelně zadat MIGRATION_STATE = OUTBOUND , že chcete začít migrovat data okamžitě nebo MIGRATION_STATE = PAUSED odložit migraci dat. Výchozí hodnota je MIGRATION_STATE = OUTBOUND. Další informace o povolení funkce Stretch pro tabulku najdete v tématu Povolení funkce Stretch Database pro tabulku.

Požadavky. Před povolením funkce Stretch pro tabulku musíte povolit funkci Stretch na serveru a v databázi. Další informace najdete v tématu Povolení funkce Stretch Database pro databázi.

Oprávnění. Povolení funkce Stretch pro databázi nebo tabulku vyžaduje db_owner oprávnění. Povolení funkce Stretch pro tabulku také vyžaduje oprávnění ALTER v tabulce.

[ FILTER_PREDICATE = { NULL | predikát } ]

platí pro: SQL Server 2016 (13.x) a novější.

Volitelně určuje predikát filtru pro výběr řádků, které se mají migrovat z tabulky, která obsahuje historická i aktuální data. Predikát musí volat deterministické vložené funkce s hodnotou tabulky. Další informace najdete v tématu Povolení funkce Stretch Database pro tabulku a výběr řádků, které chcete migrovat pomocí funkce filtru.

Důležité

Pokud zadáte predikát filtru, který se provádí špatně, migrace dat také funguje špatně. Funkce Stretch Database použije predikát filtru na tabulku pomocí operátoru CROSS APPLY.

Pokud nezadáte predikát filtru, celá tabulka se migruje.

Když zadáte predikát filtru, musíte také zadat MIGRATION_STATE.

MIGRATION_STATE = { ODCHOZÍ | PŘÍCHOZÍ | POZASTAVENO }

Platí pro: SQL Server 2016 (13.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } ) } ]

Platí pro: Pouze Azure SQL Edge

Umožňuje vyčištění starých nebo starých dat z tabulek v databázi na základě zásad uchovávání informací. Další informace najdete v tématu Povolení a zakázáníuchovávání dat . Aby bylo možné povolit uchovávání dat, musí být zadány následující parametry.

  • FILTER_COLUMN = { column_name }

    Určuje sloupec, který se má použít k určení, jestli jsou řádky v tabulce zastaralé nebo ne. Pro sloupec filtru jsou povoleny následující datové typy.

    • datum
    • datum a čas
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | číslo {DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | ROKY }}

    Určuje zásady doby uchovávání informací pro tabulku. Doba uchovávání je určena jako kombinace kladné celočíselné hodnoty a jednotky části kalendářního data.

MEMORY_OPTIMIZED

Platí pro: SQL Server 2014 (12.x) a novější, Azure SQL Database a Azure SQL Managed Instance. Spravovaná instance Azure SQL nepodporuje tabulky optimalizované pro paměť na úrovni Pro obecné účely.

Hodnota ON označuje, že tabulka je optimalizována pro paměť. Tabulky optimalizované pro paměť jsou součástí funkce In-Memory OLTP, která se používá k optimalizaci výkonu zpracování transakcí. Pokud chcete začít používat In-Memory OLTP, přečtěte si článek Rychlý start 1: In-Memory TECHNOLOGIE OLTP pro rychlejší Transact-SQL výkon. Podrobnější informace o tabulkách optimalizovaných pro paměť najdete v tématu Memory-Optimized Tabulky.

Výchozí hodnota OFF označuje, že tabulka je založená na disku.

TRVANLIVOST

Platí pro: SQL Server 2014 (12.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Hodnota SCHEMA_AND_DATA označuje, že tabulka je odolná, což znamená, že změny jsou trvalé na disku a přežijí restartování nebo převzetí služeb při selhání. SCHEMA_AND_DATA je výchozí hodnota.

Hodnota SCHEMA_ONLY označuje, že tabulka není odolná. Schéma tabulky je trvalé, ale žádné aktualizace dat se neuchovávají při restartování nebo převzetí služeb při selhání databáze. DURABILITY = SCHEMA_ONLY je povolena pouze s MEMORY_OPTIMIZED = ON.

Výstraha

Když se vytvoří tabulka s DURABILITY = SCHEMA_ONLYtabulkou a READ_COMMITTED_SNAPSHOT následně se změní pomocí ALTER DATABASE, data v tabulce budou ztracena.

BUCKET_COUNT

Platí pro: SQL Server 2014 (12.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Určuje počet kbelíků, které by se měly vytvořit v indexu hash. Maximální hodnota BUCKET_COUNT v indexech hash je 1 073 741 824. Další informace o počtech kontejnerů najdete v tématu Indexy pro tabulky Memory-Optimized.

Bucket_count je povinný argument.

Rejstřík

Platí pro: SQL Server 2014 (12.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

Indexy sloupců a tabulek lze zadat jako součást příkazu CREATE TABLE. Podrobnosti o přidávání a odebírání indexů v tabulkách optimalizovaných pro paměť najdete v tématu Altering Memory-Optimized Tables

  • HAŠÉ

    Platí pro: SQL Server 2014 (12.x) a novější, Azure SQL Database a Azure SQL Managed Instance.

    Označuje, že je vytvořen index HASH.

    Indexy hash jsou podporovány pouze v tabulkách optimalizovaných pro paměť.

LEDGER = ZAPNUTO ( <ledger_option> [ ,... n ] ) | PRYČ

Platí pro: SQL Server 2022 (16.x), Azure SQL Database a Azure SQL Managed Instance

Poznámka:

Pokud příkaz vytvoří tabulku registru, je vyžadováno ENABLE LEDGER oprávnění.

Určuje, zda je vytvářená tabulka hlavní knihy (ON) nebo ne (VYPNUTO). Výchozí hodnota je VYPNUTÁ. Pokud je tato APPEND_ONLY = ON možnost zadaná, vytvoří systém tabulku registru, která umožňuje pouze vkládání nových řádků. V opačném případě systém vytvoří aktualizovatelnou tabulku registru. Aktualizovatelná tabulka registru také vyžaduje SYSTEM_VERSIONING = ON argument. Aktualizovatelná tabulka registru musí být také tabulka se systémovou verzí. Aktualizovatelná tabulka registru ale nemusí být dočasnou tabulkou (nevyžaduje parametr PERIOD FOR SYSTEM_TIME ). Pokud je zadaná tabulka historie a LEDGER = ONSYSTEM_VERSIONING = ONnesmí odkazovat na existující tabulku.

Databáze registru (databáze vytvořená s LEDGER = ON možností) umožňuje pouze vytváření tabulek registru. Při pokusu o vytvoření tabulky s LEDGER = OFF chybou dojde k chybě. Každá nová tabulka se ve výchozím nastavení vytvoří jako aktualizovatelná tabulka registru, i když ji nezadáte LEDGER = ON, a vytvoří se s výchozími hodnotami pro všechny ostatní parametry.

Aktualizovatelná tabulka registru musí obsahovat čtyři GENERATED ALWAYS sloupce, přesně jeden sloupec definovaný s každým z následujících 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

Tabulka registru jen pro připojení musí obsahovat přesně jeden sloupec definovaný s každým z následujících argumentů:

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

Pokud některý z požadovaných vygenerovaných sloupců není definován v CREATE TABLE příkazu a příkaz obsahuje LEDGER = ON, systém se automaticky pokusí přidat sloupec pomocí příslušné definice sloupce z následujícího seznamu. Pokud je název v konfliktu s již definovaným sloupcem, systém vyvolá chybu.

[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<> určuje schéma a název zobrazení registru, systém automaticky vytvoří a prodá propojení s tabulkou. Pokud není tato možnost zadaná, systém vygeneruje název zobrazení registru připojením _Ledger k názvu vytvářené tabulky (database_name.schema_name.table_name). Pokud existuje zobrazení se zadaným nebo vygenerovaným názvem, systém vyvolá chybu. Pokud je tabulka aktualizovatelnou tabulkou registru, vytvoří se zobrazení registru jako sjednocení tabulky a její tabulky historie.

Každý řádek v zobrazení hlavní knihy představuje buď vytvoření nebo odstranění verze řádku v tabulce registru. Zobrazení hlavní knihy obsahuje všechny sloupce tabulky registru s výjimkou vygenerovaných sloupců uvedených výše. Zobrazení hlavní knihy obsahuje také následující další sloupce:

Název sloupce Datový typ Popis
Zadáno pomocí TRANSACTION_ID_COLUMN_NAME možnosti. ledger_transaction_id pokud není zadáno. bigint ID transakce, která vytvořila nebo odstranila verzi řádku.
Zadáno pomocí SEQUENCE_NUMBER_COLUMN_NAME možnosti. ledger_sequence_number pokud není zadáno. bigint Pořadové číslo operace na úrovni řádku v rámci transakce v tabulce.
Zadáno pomocí OPERATION_TYPE_COLUMN_NAME možnosti. ledger_operation_type pokud není zadáno. tinyint Obsahuje 1 (INSERT) nebo 2 (DELETE). Vložení řádku do tabulky registru vytvoří nový řádek v zobrazení registru obsahujícím 1 tento sloupec. Odstranění řádku z tabulky registru vytvoří nový řádek v zobrazení registru obsahujícím 2 tento sloupec. Aktualizace řádku v tabulce registru vytvoří v zobrazení registru dva nové řádky. Jeden řádek obsahuje 2 (DELETE) a druhý řádek obsahuje 1 (INSERT) v tomto sloupci .
Zadáno pomocí OPERATION_TYPE_DESC_COLUMN_NAME možnosti. ledger_operation_type_desc pokud není zadáno. nvarchar(128) Obsahuje INSERT nebo DELETE. Podrobnosti najdete výše.

Transakce, které zahrnují vytváření tabulky registru, jsou zachyceny v sys.database_ledger_transactions.

< >ledger_option ::=

Určuje možnost registru.

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

Určuje název zobrazení registru a názvy dalších sloupců, které systém přidá do zobrazení registru.

[ APPEND_ONLY = ON | VYPNUTO ]

Určuje, jestli je tabulka registru vytvořená pouze pro připojení nebo aktualizovatelná. Výchozí hodnota je OFF.

< >ledger_view_option ::=

Určuje jednu nebo více možností zobrazení registru. Každá z možností zobrazení registru určuje název sloupce, systém přidá do zobrazení kromě sloupců definovaných v tabulce registru.

[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]

Určuje název sloupce, který ukládá ID transakce, která vytvořila nebo odstranila verzi řádku. Výchozí název sloupce je ledger_transaction_id.

[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]

Určuje název sloupců, které ukládají pořadové číslo operace na úrovni řádků v rámci transakce v tabulce. Výchozí název sloupce je ledger_sequence_number.

[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]

Určuje název sloupců, do kterých se ukládá ID typu operace. Výchozí název sloupce je ledger_operation_type.

[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]

Určuje název sloupců, které ukládají popis typu operace. Výchozí název sloupce je ledger_operation_type_desc.

Poznámky

Informace o počtu povolených tabulek, sloupců, omezení a indexů naleznete v tématu Maximální specifikace kapacity pro SQL Server.

Mezera se obecně přiděluje tabulkám a indexům v přírůstcích po jednom rozsahu. SET MIXED_PAGE_ALLOCATION Pokud je možnost ALTER DATABASE nastavena na hodnotu PRAVDA nebo vždy před SQL Serverem 2016 (13.x), při vytváření tabulky nebo indexu se přiděluje stránky ze smíšených rozsahů, dokud nebude mít dostatek stránek k vyplnění jednotného rozsahu. Jakmile bude dostatek stránek k vyplnění jednotného rozsahu, přidělí se další rozsah pokaždé, když se aktuálně přidělené rozsahy zaplní. V sestavě o množství přiděleného prostoru a používaném tabulkou spusťte sp_spaceusedpříkaz .

Databázový stroj nevynucuje pořadí, ve kterém jsou v definici sloupce zadána omezení DEFAULT, IDENTITY, ROWGUIDCOL nebo column.

Při vytvoření tabulky je možnost QUOTED IDENTIFIER vždy uložena jako ON v metadatech tabulky, i když je tato možnost při vytváření tabulky nastavena na VYPNUTO.

V databázi SQL v Microsoft Fabric lze vytvořit některé funkce tabulky, ale nebudou zrcadlené do fabric OneLake. Další informace naleznete v tématu Omezení zrcadlení databáze Fabric SQL.

Dočasné tabulky

Můžete vytvořit místní a globální dočasné tabulky. Místní dočasné tabulky jsou viditelné pouze v aktuální relaci a globální dočasné tabulky jsou viditelné pro všechny relace. Dočasné tabulky nelze rozdělit na oddíly.

Předpona místních dočasných tabulek se znaménkem jediného čísla (#table_name) a předponou globálních dočasných tabulek se znaménkem dvojitého čísla (##table_name).

Transact-SQL příkazy odkazují na dočasnou tabulku pomocí hodnoty zadané pro table_name v CREATE TABLE příkazu, například:

CREATE TABLE #MyTempTable
(
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Pokud je uvnitř jedné uložené procedury nebo dávky vytvořena více než jedna dočasná tabulka, musí mít různé názvy.

Pokud při vytváření dočasné tabulky nebo přístupu k ní zahrnete schema_name , bude ignorována. Ve schématu dbo se vytvoří všechny dočasné tabulky.

Pokud je místní dočasná tabulka vytvořená v uložené proceduře nebo modulu SQL, který lze spustit současně několika relacemi, databázový stroj musí být schopen rozlišit tabulky vytvořené různými relacemi. Databázový stroj to provede interně připojením jedinečné přípony ke každému místnímu dočasnému názvu tabulky. Úplný název dočasné tabulky uložené v sys.objects tabulce tempdb je tvořen názvem tabulky zadaným v CREATE TABLE příkazu a systémově vygenerovanou jedinečnou příponou. Pokud chcete příponu povolit, table_name zadané pro místní dočasný název nesmí překročit 116 znaků.

Dočasné tabulky se automaticky zahodí, když přejdou mimo rozsah, pokud explicitně nezahodíte dříve pomocí DROP TABLE:

  • Místní dočasná tabulka vytvořená v uložené proceduře se po dokončení uložené procedury automaticky zahodí. Na tabulku lze odkazovat všemi vnořenými uloženými procedurami spuštěnými uloženou procedurou, která tabulku vytvořila. Na tabulku nelze odkazovat procesem, který se nazývá uložená procedura, která tabulku vytvořila.
  • Všechny ostatní místní dočasné tabulky se automaticky zahodí na konec aktuální relace.
  • GLOBAL_TEMPORARY_TABLE_AUTO_DROP Pokud je konfigurace v oboru databáze nastavená na ZAPNUTO (výchozí), globální dočasné tabulky se automaticky zahodí, když relace, která vytvořila tabulku, skončí a všechny ostatní úlohy na ně přestaly odkazovat. Přidružení mezi úkolem a tabulkou se udržuje pouze po dobu životnosti jednoho příkazu Transact-SQL. To znamená, že globální dočasná tabulka se při dokončení posledního příkazu Transact-SQL, který při vytváření relace aktivně odkazoval na tabulku.
  • GLOBAL_TEMPORARY_TABLE_AUTO_DROP Pokud je konfigurace s oborem databáze nastavena na vypnuto, globální dočasné tabulky se zahodí pouze pomocí DROP TABLE, nebo když se instance databázového stroje restartuje. Další informace najdete v tématu GLOBAL_TEMPORARY_TABLE_AUTO_DROP.

Místní dočasná tabulka vytvořená v rámci uložené procedury nebo triggeru může mít stejný název jako dočasná tabulka vytvořená před voláním uložené procedury nebo triggeru. Pokud však dotaz odkazuje na dočasnou tabulku a dvě dočasné tabulky se stejným názvem existují v té době, není definována, pro kterou tabulku se dotaz přeloží. Vnořené uložené procedury mohou také vytvářet dočasné tabulky se stejným názvem jako dočasná tabulka vytvořená voláním uložené procedury. Aby se však změny přeložily na tabulku vytvořenou v vnořeném postupu, musí mít tabulka stejnou strukturu se stejnými názvy sloupců jako tabulka vytvořená ve volající procedurě. To je znázorněno v následujícím příkladu.

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

Tady je soubor výsledků.

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

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

Při vytváření místních nebo globálních dočasných tabulek CREATE TABLE syntaxe podporuje definice omezení s výjimkou FOREIGN KEY omezení. FOREIGN KEY Pokud je omezení zadané v dočasné tabulce, příkaz vrátí zprávu s upozorněním, že omezení bylo vynecháno. Tabulka je stále vytvořená bez FOREIGN KEY omezení. Na dočasné tabulky nelze odkazovat v FOREIGN KEY omezeních.

Pokud se v rámci transakce definované uživatelem vytváří dočasná tabulka s pojmenovaným omezením, může příkaz, který dočasnou tabulku vytvoří, spustit pouze jeden uživatel najednou. Pokud například uložená procedura vytvoří dočasnou tabulku s omezením pojmenovaného primárního klíče, uložená procedura se nedá spustit současně více uživateli.

Globální dočasné tabulky s oborem databáze ve službě Azure SQL Database

Globální dočasné tabulky v SQL Serveru (názvy tabulek s předponou ##) jsou uloženy a tempdb sdíleny mezi všemi uživatelskými relacemi v celé instanci SQL Serveru.

Azure SQL Database podporuje globální dočasné tabulky, které jsou také uložené, tempdb ale jsou omezené na úroveň databáze. To znamená, že globální dočasné tabulky jsou sdíleny mezi všemi uživatelskými relacemi ve stejné databázi. Uživatelské relace z jiných databází nemají přístup k globálním dočasným tabulkám. V opačném případě se globální dočasné tabulky pro Azure SQL Database řídí stejnou syntaxí a sémantikou, kterou SQL Server používá.

Podobně globální dočasné uložené procedury jsou také vymezeny na úrovni databáze v Azure SQL Database.

Místní dočasné tabulky (názvy tabulek s předponou #) jsou podporovány také pro Azure SQL Database a používají stejnou syntaxi a sémantiku, kterou SQL Server používá. Další informace naleznete v tématu Dočasné tabulky.

Oprávnění pro dočasné objekty

Každý uživatel může vytvářet dočasné objekty a přistupovat k němu.

Dělené tabulky

Před vytvořením dělené tabulky pomocí příkazu CREATE TABLE musíte nejprve vytvořit funkci oddílu, abyste určili, jak se tabulka rozdělí. Funkce oddílu se vytvoří pomocí funkce CREATE PARTITION. Za druhé je nutné vytvořit schéma oddílů pro určení skupin souborů, které budou obsahovat oddíly označené funkcí oddílu. Schéma oddílů se vytvoří pomocí schématu CREATE PARTITION SCHEME. Umístění omezení PRIMÁRNÍ KLÍČ nebo UNIQUE pro samostatné skupiny souborů nelze zadat pro dělené tabulky. Další informace najdete v tématu dělené tabulky a indexy.

Omezení PRIMÁRNÍHO KLÍČE

  • Tabulka může obsahovat pouze jedno omezení PRIMÁRNÍHO KLÍČE.

  • Index vygenerovaný omezením PRIMÁRNÍHO KLÍČE nemůže způsobit, že počet indexů v tabulce překročí 999 neclusterovaných indexů a 1 clusterovaný index.

  • Pokud pro omezení PRIMÁRNÍHO KLÍČE není zadán clusterED nebo NONCLUSTERED, použije se clusterED, pokud pro omezení UNIQUE nejsou zadané žádné clusterované indexy.

  • Všechny sloupce definované v rámci omezení PRIMÁRNÍHO KLÍČE musí být definovány jako NOT NULL. Pokud není zadána možnost null, všechny sloupce, které se účastní omezení PRIMÁRNÍHO KLÍČE, mají nastavenou hodnotu nullability na HODNOTU NOT NULL.

    Poznámka:

    Pro tabulky optimalizované pro paměť je povolený sloupec klíče s možnou hodnotou null.

  • Pokud je primární klíč definován ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat binární řazení. Další informace naleznete v tématu CLR User-Defined Types.

Jedinečná omezení

  • Pokud pro omezení UNIQUE není zadaný CLUSTERED nebo NONCLUSTERED, použije se ve výchozím nastavení funkce NONCLUSTERED.
  • Každé omezení UNIQUE generuje index. Počet omezení UNIQUE nemůže způsobit, že počet indexů v tabulce překročí 999 neclusterovaných indexů a 1 clusterovaný index.
  • Pokud je jedinečné omezení definováno ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat řazení na základě binárního souboru nebo operátoru. Další informace naleznete v tématu CLR User-Defined Types.

Omezení CIZÍHO KLÍČE

  • Pokud je do sloupce omezení CIZÍ KLÍČ zadána jiná hodnota než NULL, musí tato hodnota existovat v odkazovaném sloupci; v opačném případě se vrátí chybová zpráva o porušení cizího klíče.

  • Omezení cizího klíče se použijí na předchozí sloupec, pokud nejsou zadány zdrojové sloupce.

  • Omezení cizího klíče můžou odkazovat pouze na tabulky ve stejné databázi na stejném serveru. Referenční integrita mezi databázemi musí být implementována prostřednictvím triggerů. Další informace najdete v tématu CREATE TRIGGER.

  • Omezení cizího klíče můžou odkazovat na jiný sloupec ve stejné tabulce. Označuje se jako odkaz na sebe sama.

  • Klauzule REFERENCES omezení CIZÍHO KLÍČE na úrovni sloupce může obsahovat pouze jeden odkazový sloupec. Tento sloupec musí mít stejný datový typ jako sloupec, na kterém je definováno omezení.

  • Klauzule REFERENCES omezení cizího klíče na úrovni tabulky musí mít stejný počet sloupců odkazu jako počet sloupců v seznamu sloupců omezení. Datový typ každého referenčního sloupce musí být také stejný jako odpovídající sloupec v seznamu sloupců. Referenční sloupce musí být zadány ve stejném pořadí, které se použily při zadávání sloupců primárního klíče nebo jedinečného omezení odkazované tabulky.

  • CASCADE, SET NULL nebo SET DEFAULT nelze zadat, pokud je sloupec časového razítka typu součástí cizího klíče nebo odkazovaného klíče.

  • CASCADE, SET NULL, SET DEFAULT a NO ACTION se dají kombinovat u tabulek, které mají vzájemně referenční relace. Pokud databázový stroj narazí na žádnou akci, zastaví a vrátí zpět související akce CASCADE, SET NULL a SET DEFAULT. Když příkaz DELETE způsobí kombinaci kaskádových akcí, SET NULL, SET DEFAULT a NO ACTION, všechny akce CASCADE, SET NULL a SET DEFAULT se použijí před tím, než databázový stroj zkontroluje žádnou AKCI.

  • Databázový stroj nemá předdefinovaný limit počtu omezení cizího klíče, která tabulka může obsahovat odkaz na jiné tabulky, nebo počet omezení CIZÍHO KLÍČE vlastněných jinými tabulkami, které odkazují na konkrétní tabulku.

    Skutečný počet omezení cizího klíče, která lze použít, je však omezen konfigurací hardwaru a návrhem databáze a aplikace. Doporučujeme, aby tabulka neobsahovala více než 253 omezení cizího klíče a aby na ni odkazovala maximálně 253 omezení CIZÍHO KLÍČE. Efektivní limit pro vás může být více nebo méně v závislosti na aplikaci a hardwaru. Při návrhu databáze a aplikací zvažte náklady na vynucování omezení CIZÍHO KLÍČE.

  • Omezení cizího klíče se u dočasných tabulek nevynucuje.

  • Omezení CIZÍHO KLÍČE můžou odkazovat pouze na sloupce v primárním klíči nebo jedinečných omezeních v odkazované tabulce nebo v jedinečném indexu odkazované tabulky.

  • Pokud je cizí klíč definován ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat binární řazení. Další informace naleznete v tématu CLR User-Defined Types.

  • Sloupce, které se účastní relace cizího klíče, musí být definovány se stejnou délkou a měřítkem.

VÝCHOZÍ definice

  • Sloupec může mít pouze jednu výchozí definici.

  • Definice DEFAULT může obsahovat konstantní hodnoty, funkce, standardní niladické funkce SQL nebo NULL. Následující tabulka ukazuje niladické funkce a hodnoty, které vrací jako výchozí během příkazu INSERT.

    FUNKCE SQL-92 niladic Vrácená hodnota
    CURRENT_TIMESTAMP Aktuální datum a čas
    CURRENT_USER Jméno uživatele provádějícího vložení
    SESSION_USER Jméno uživatele provádějícího vložení
    SYSTEM_USER Jméno uživatele provádějícího vložení
    USER Jméno uživatele provádějícího vložení
  • constant_expression v definici DEFAULT nemůže odkazovat na jiný sloupec v tabulce ani na jiné tabulky, zobrazení nebo uložené procedury.

  • Výchozí definice nelze vytvořit ve sloupcích s datovým typem časového razítka nebo sloupci s vlastností IDENTITY.

  • Výchozí definice nelze vytvořit pro sloupce s datovými typy aliasů, pokud je datový typ aliasu svázán s výchozím objektem.

Omezení CHECK

  • Sloupec může mít libovolný počet omezení CHECK a podmínka může obsahovat více logických výrazů v kombinaci s operátory AND a OR. Více omezení CHECK pro sloupec se ověřuje v pořadí, v jakém jsou vytvořeny.

  • Podmínka hledání musí být vyhodnocena jako logický výraz a nemůže odkazovat na jinou tabulku.

  • Omezení CHECK na úrovni sloupce může odkazovat pouze na omezený sloupec a omezení CHECK na úrovni tabulky může odkazovat pouze na sloupce ve stejné tabulce.

    FUNKCE CHECK OMEZENÍ a pravidla slouží ke stejné funkci ověřování dat během příkazů INSERT a UPDATE.

  • Pokud pro sloupec nebo sloupce existuje pravidlo a jedno nebo více omezení CHECK, vyhodnotí se všechna omezení.

  • Omezení check nelze definovat u sloupců textu, ntextu nebo obrázku .

Další informace o omezeních

  • Index vytvořený pro omezení nemůže být vyřazen pomocí ; DROP INDEXomezení musí být ukončeno pomocí .ALTER TABLE Index vytvořený pro omezení a jeho použití lze znovu vytvořit pomocí ALTER INDEX ... REBUILD. Další informace naleznete v tématu změna uspořádání a opětovného sestavení indexů.
  • Názvy omezení musí dodržovat pravidla pro identifikátory s tím rozdílem, že název nemůže začínat znakem čísla (#). Pokud constraint_name nezadáte, přiřadí se k omezení název vygenerovaný systémem. Název omezení se zobrazí ve všech chybových zprávách o porušeních omezení.
  • Pokud dojde k porušení omezení v příkazu INSERT, UPDATEnebo DELETE příkazu, příkaz je ukončen. Pokud SET XACT_ABORT je však nastavena na HODNOTU OFF, transakce, pokud je příkaz součástí explicitní transakce, bude nadále zpracována. Pokud SET XACT_ABORT je nastavena na HODNOTU ON, celá transakce se vrátí zpět. Příkaz můžete také použít ROLLBACK TRANSACTION s definicí transakce kontrolou @@ERROR systémové funkce.
  • ALLOW_ROW_LOCKS = ONZámky ALLOW_PAGE_LOCK = ON na úrovni řádků, stránek a tabulek jsou povoleny, když přistupujete k indexu. Databázový stroj zvolí příslušný zámek a může zámek eskalovat z řádku nebo zámku stránky na zámek tabulky. Při ALLOW_ROW_LOCKS = OFF a ALLOW_PAGE_LOCK = OFFse při přístupu k indexu povolí pouze zámek na úrovni tabulky.
  • Pokud tabulka obsahuje omezení cizího klíče nebo kontrolní omezení a triggery, podmínky omezení se vyhodnocují před spuštěním triggeru.

Pro sestavu v tabulce a jejích sloupcích použijte sp_help nebo sp_helpconstraint. Pokud chcete přejmenovat tabulku, použijte sp_rename. Pro sestavu zobrazení a uložených procedur závislých na tabulce použijte sys.dm_sql_referenced_entities a sys.dm_sql_referencing_entities.

Pravidla nullability v definici tabulky

Hodnota null ve sloupci určuje, jestli tento sloupec může jako data v daném sloupci povolit hodnotu null (NULL). NULL není nulová nebo prázdná: NULL znamená, že nebyla provedena žádná položka nebo byla zadána explicitní NULL položka a obvykle to znamená, že hodnota je neznámá nebo není použitelná.

Když použijete CREATE TABLE nebo ALTER TABLE změníte tabulku, ovlivní nastavení databáze a relace a případně přepíšete hodnotu null datového typu, který se používá v definici sloupce. Doporučujeme vždy explicitně definovat sloupec jako NULL nebo NOT NULL pro nekompočítané sloupce, nebo pokud používáte uživatelem definovaný datový typ, že sloupec povolíte použít výchozí hodnotu nullability datového typu. Řídké sloupce musí vždy umožňovat hodnotu NULL.

Pokud není explicitně zadána hodnota null sloupce, možnost null sloupce se řídí pravidly uvedenými v následující tabulce.

Datový typ sloupce Pravidlo
Datový typ aliasu Databázový stroj používá hodnotu null, která je zadána při vytvoření datového typu. Chcete-li určit výchozí hodnotu nullability datového typu, použijte sp_help.
Uživatelem definovaný typ CLR Hodnota Nullability je určena podle definice sloupce.
Datový typ zadaný systémem Pokud má datový typ zadaný systémem jenom jednu možnost, má přednost. Datové typy časového razítka nesmí být NULL. Pokud jsou všechna nastavení relace nastavená pomocí:SET
ANSI_NULL_DFLT_ON = ONJe přiřazena hodnota NULL.
ANSI_NULL_DFLT_OFF = ONJe přiřazena hodnota NOT NULL.

Pokud jsou všechna nastavení databáze nakonfigurovaná pomocí:ALTER DATABASE
ANSI_NULL_DEFAULT_ON = ONJe přiřazena hodnota NULL.
ANSI_NULL_DEFAULT_OFF = ONJe přiřazena hodnota NOT NULL.

Pokud chcete zobrazit nastavení databáze pro ANSI_NULL_DEFAULT, použijte sys.databases zobrazení katalogu.

Pokud pro relaci není nastavená žádná z možností ANSI_NULL_DFLT a databáze je nastavená na výchozí (ANSI_NULL_DEFAULT je vypnutá), je přiřazena výchozí hodnota NOT NULL.

Pokud je sloupec počítaný sloupec, jeho nulovost je vždy automaticky určena databázovým strojem. Chcete-li zjistit nullability tohoto typu sloupce, použijte COLUMNPROPERTY funkci s AllowsNull vlastnost.

Poznámka:

Ovladač ODBC SYSTÉMU SQL Server a ovladač OLE DB systému SQL Server mají výchozí nastavení ANSI_NULL_DFLT_ON nastavena na zapnuto. Uživatelé ODBC a OLE DB můžou tuto konfiguraci nakonfigurovat ve zdrojích dat ODBC nebo s atributy připojení nebo vlastnostmi nastavenými aplikací.

Komprese dat

Systémové tabulky nelze povolit pro kompresi. Při vytváření tabulky je komprese dat nastavena na NONE, pokud není zadán jinak. Pokud zadáte seznam oddílů nebo oddíl, který je mimo rozsah, vygeneruje se chyba. Další informace o kompresi dat naleznete v tématu Komprese dat.

Pokud chcete vyhodnotit, jak změna stavu komprese ovlivní tabulku, index nebo oddíl, použijte sp_estimate_data_compression_savings uloženou proceduru.

Povolení

Vyžaduje CREATE TABLE oprávnění v databázi a ALTER oprávnění ke schématu, ve kterém se tabulka vytváří.

Pokud jsou v příkazu definovány nějaké sloupce CREATE TABLE typu definovaného uživatelem, REFERENCES je vyžadováno oprávnění k typu definovanému uživatelem.

Pokud jsou v příkazu definovány nějaké sloupce CREATE TABLE typu definovaného uživatelem CLR, je vyžadováno vlastnictví typu nebo REFERENCES oprávnění.

Pokud některé sloupce v CREATE TABLE příkazu mají přidruženou kolekci schémat XML, vyžaduje se buď vlastnictví kolekce schématu XML, nebo REFERENCES oprávnění k němu.

Každý uživatel může vytvořit dočasné tabulky v tempdb.

Pokud příkaz vytvoří tabulku registru, ENABLE LEDGER je vyžadováno oprávnění.

Příklady

A. Vytvoření omezení PRIMÁRNÍHO KLÍČE u sloupce

Následující příklad ukazuje definici sloupce pro omezení PRIMÁRNÍ KLÍČ s clusterovaným indexem ve EmployeeID sloupci Employee tabulky. Protože není zadaný název omezení, systém poskytuje název omezení.

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

B. Použití omezení CIZÍHO KLÍČE

Omezení CIZÍHO KLÍČE se používá k odkazování na jinou tabulku. Cizí klíče můžou být klíče s jedním sloupcem nebo vícesloupcové klíče. Následující příklad ukazuje omezení CIZÍ KLÍČ s jedním sloupcem v SalesOrderHeader tabulce, která odkazuje na SalesPerson tabulku. Pro omezení CIZÍHO KLÍČE s jedním sloupcem se vyžaduje pouze klauzule REFERENCES.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

Můžete také explicitně použít klauzuli FOREIGN KEY a přepsat atribut sloupce. Název sloupce nemusí být v obou tabulkách stejný.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Vícesloupcová omezení klíče se vytvářejí jako omezení tabulky. AdventureWorks2022 V databázi SpecialOfferProduct obsahuje tabulka vícesloupcový PRIMÁRNÍ KLÍČ. Následující příklad ukazuje, jak odkazovat na tento klíč z jiné tabulky; Explicitní název omezení je nepovinný.

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

C. Použití omezení UNIQUE

Omezení UNIQUE se používají k vynucení jedinečnosti u neprimárních klíčových sloupců. Následující příklad vynucuje omezení, že Name sloupec Product tabulky musí být jedinečný.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. Použití výchozích definic

Při zadání žádné hodnoty zadáte hodnotu (s příkazy INSERT a UPDATE). Databáze může například AdventureWorks2022 obsahovat vyhledávací tabulku se seznamem různých zaměstnanců pracovních míst, která můžou vyplnit společnost. Ve sloupci, který popisuje každou úlohu, může výchozí znakový řetězec zadat popis, pokud není explicitně zadán skutečný popis.

DEFAULT 'New Position - title not formalized yet'

Kromě konstant můžou definice DEFAULT zahrnovat funkce. Pomocí následujícího příkladu získáte aktuální datum položky.

DEFAULT (GETDATE())

Kontrola niladické funkce může také zlepšit integritu dat. Chcete-li sledovat uživatele, který vložil řádek, použijte funkci niladic-function pro USER. Neuzavírajte niladické funkce do závorek.

DEFAULT USER

E. Použití omezení CHECK

Následující příklad ukazuje omezení hodnot zadaných do CreditRating sloupce Vendor tabulky. Omezení není pojmenováno.

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

Tento příklad ukazuje pojmenované omezení s omezením vzoru na znaková data zadaná do sloupce tabulky.

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

Tento příklad určuje, že hodnoty musí být v rámci konkrétního seznamu nebo se řídí zadaným vzorem.

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

F. Zobrazit úplnou definici tabulky

Následující příklad ukazuje úplné definice tabulky se všemi definicemi omezení pro tabulku PurchaseOrderDetail vytvořenou AdventureWorks2022 v databázi. Pokud chcete spustit ukázku, schéma tabulky se změní na 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. Vytvoření tabulky s sloupcem XML zadaným do kolekce schémat XML

Následující příklad vytvoří tabulku se sloupcem xml , který je zadán do kolekce HRResumeSchemaCollectionschémat XML . Klíčové DOCUMENT slovo určuje, že každá instance datového xml typu v column_name může obsahovat pouze jeden prvek nejvyšší úrovně.

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

H. Vytvoření dělené tabulky

Následující příklad vytvoří funkci oddílu pro rozdělení tabulky nebo indexu do čtyř oddílů. Pak příklad vytvoří schéma oddílů, které určuje skupiny souborů, ve kterých se mají uchovávat všechny čtyři oddíly. Nakonec příklad vytvoří tabulku, která používá schéma oddílů. Tento příklad předpokládá, že skupiny souborů již v databázi existují.

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

Na základě hodnot ve sloupci col1PartitionTablejsou oddíly přiřazeny následujícími způsoby.

Skupina souborů test1fg test2fg test3fg test4fg
Oddíl 1 2 3 4
Hodnoty col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1,000 col1 > 1000

Já. Použití datového typu UNIQUEIDENTIFIER ve sloupci

Následující příklad vytvoří tabulku se sloupcem uniqueidentifier . Příklad používá omezení PRIMÁRNÍHO KLÍČE k ochraně tabulky před uživateli, kteří vkládají duplicitní hodnoty, a používá NEWSEQUENTIALID() funkci v DEFAULT omezení k zadání hodnot pro nové řádky. Vlastnost ROWGUIDCOL se použije u uniqueidentifier sloupce, aby na ni bylo možné odkazovat pomocí $ROWGUID klíčového slova.

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. Použití výrazu pro počítaný sloupec

Následující příklad ukazuje použití výrazu ((low + high)/2) pro výpočet vypočítaného myavg sloupce.

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

K. Vytvoření počítaného sloupce na základě sloupce definovaného uživatelem

Následující příklad vytvoří tabulku s jedním sloupcem definovaným jako uživatelem definovaný typ utf8stringza předpokladu, že sestavení typu a samotný typ již byl vytvořen v aktuální databázi. Druhý sloupec je definován na základě utf8stringa používá metodu ToString()type(class)utf8string k výpočtu hodnoty sloupce.

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

L. Použití funkce USER_NAME pro počítaný sloupec

Následující příklad používá USER_NAME() funkci ve sloupci myuser_name .

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

M. Vytvoření tabulky se sloupcem FILESTREAM

Následující příklad vytvoří tabulku, která má FILESTREAM sloupec Photo. Pokud tabulka obsahuje jeden nebo více FILESTREAM sloupců, musí mít tabulka jeden ROWGUIDCOL sloupec.

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

N. Vytvoření tabulky, která používá kompresi řádků

Následující příklad vytvoří tabulku, která používá kompresi řádků.

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

Další příklady komprese dat najdete v tématu Komprese dat.

O. Vytvoření tabulky, která používá kompresi XML

platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.

Následující příklad vytvoří tabulku, která používá kompresi XML.

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

P. Vytvoření tabulky, která obsahuje řídké sloupce a sadu sloupců

Následující příklady ukazují, jak vytvořit tabulku, která má řídký sloupec, a tabulku se dvěma řídkými sloupci a sadou sloupců. Příklady používají základní syntaxi. Složitější příklady najdete v tématu Použití řídkých sloupců a použití sad sloupců.

Tento příklad vytvoří tabulku, která má řídký sloupec.

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

Tento příklad vytvoří tabulku, která má dva řídké sloupce a sadu sloupců s názvem 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
);

Otázka. Vytvoření dočasné tabulky založené na disku se systémem

Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

Následující příklady ukazují, jak vytvořit dočasnou tabulku propojenou s novou tabulkou historie a jak vytvořit dočasnou tabulku propojenou s existující tabulkou historie. Dočasná tabulka musí mít definovaný primární klíč, aby byla povolena tabulka pro správu verzí systému. Příklady ukazující, jak přidat nebo odebrat správu verzí systému v existující tabulce, najdete v tématu Správa verzí systému v příkladech. Případy použití najdete v části Dočasné tabulky.

Tento příklad vytvoří novou dočasnou tabulku propojenou s novou tabulkou historie.

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

Tento příklad vytvoří novou dočasnou tabulku propojenou s existující tabulkou historie.

-- 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. Vytvoření dočasné tabulky optimalizované pro systémovou verzi paměti

Platí pro: SQL Server 2016 (13.x) a novější a Azure SQL Database.

Následující příklad ukazuje, jak vytvořit dočasnou tabulku optimalizovanou pro systémovou verzi paměti propojenou s novou tabulkou historie založenou na disku.

Tento příklad vytvoří novou dočasnou tabulku propojenou s novou tabulkou historie.

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

Tento příklad vytvoří novou dočasnou tabulku propojenou s existující tabulkou historie.

-- 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. Vytvoření tabulky se šifrovanými sloupci

Následující příklad vytvoří tabulku se dvěma šifrovanými sloupci. Další informace naleznete v tématu 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. Vytvoření vloženého filtrovaného indexu

Vytvoří tabulku s vloženým filtrovaným indexem.

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

U. Vytvoření vloženého indexu

Následující příklad ukazuje, jak používat vložený příkaz NONCLUSTERED pro diskové tabulky:

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. Vytvoření dočasné tabulky s anonymně pojmenovaným složeným primárním klíčem

Vytvoří tabulku s anonymně pojmenovaným složeným primárním klíčem. To je užitečné, pokud se chcete vyhnout konfliktům za běhu, kdy dvě dočasné tabulky s oborem relace, každý v samostatné relaci, používá stejný název pro omezení.

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

Pokud omezení explicitně pojmenujete, druhá relace vygeneruje chybu, například:

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.

K problému dochází ze skutečnosti, že zatímco název dočasné tabulky je jedinečný, názvy omezení nejsou.

W. Použití globálních dočasných tabulek ve službě Azure SQL Database

Relace A vytvoří globální dočasnou tabulku ##test ve službě Azure SQL Database testdb1 a přidá jeden řádek.

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

Tady je soubor výsledků.

1253579504

Získání názvu globální dočasné tabulky pro dané ID objektu 1253579504 v tempdb (2)

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

Tady je soubor výsledků.

##test

Relace B se připojí ke službě Azure SQL Database testdb1 a má přístup k tabulce ##test vytvořené relací A.

SELECT *
FROM ##test;

Tady je soubor výsledků.

1, 1

Relace C se připojí k jiné databázi ve službě Azure SQL Database testdb2 a chce získat přístup k ##test vytvořené v testdb1. Tento výběr selže kvůli rozsahu databáze globálních dočasných tabulek.

SELECT *
FROM ##test;

Tím se vygeneruje následující chyba:

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

Adresování systémového objektu ve službě Azure SQL Database tempdb z aktuální databáze uživatele testdb1

SELECT *
FROM tempdb.sys.objects;

SELECT *
FROM tempdb.sys.columns;

SELECT *
FROM tempdb.sys.database_files;

X. Povolení zásad uchovávání dat v tabulce

Následující příklad vytvoří tabulku s povoleným uchováváním dat a dobou uchovávání dat o jednom týdnu. Tento příklad platí jenom pro 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. Vytvoření aktualizovatelné tabulky registru

Následující příklad vytvoří aktualizovatelnou tabulku registru, která není dočasnou tabulkou s anonymní tabulkou historie (systém vygeneruje název tabulky historie) a vygenerovaný název zobrazení registru. Vzhledem k tomu, že názvy požadovaných vygenerovaných sloupců vždy a další sloupce v zobrazení hlavní knihy nejsou zadané, budou mít sloupce výchozí názvy.

CREATE SCHEMA [HR];
GO

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

Následující příklad vytvoří tabulku, která je dočasnou i aktualizovatelnou tabulkou registru s anonymní tabulkou historie (s názvem vygenerovaným systémem), vygenerovaným názvem zobrazení registru a výchozími názvy vygenerovaných sloupců vždy a dalších sloupců zobrazení registru.

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

Následující příklad vytvoří tabulku, která je dočasnou i aktualizovatelnou tabulkou registru s explicitně pojmenovanou tabulkou historie, uživatelem zadaným názvem zobrazení registru a uživatelsky zadanými názvy vygenerovaných vždy sloupců a dalších sloupců v zobrazení registru.

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

Následující příklad vytvoří tabulku registru jen pro připojení s vygenerovanými názvy zobrazení registru a sloupci v zobrazení registru.

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

Následující příklad vytvoří databázi registru ve službě Azure SQL Database a aktualizovatelnou tabulku registru pomocí výchozího nastavení. Vytvoření aktualizovatelné tabulky registru v databázi registru nevyžaduje použití 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