Поделиться через


Инструкция CREATE TABLE (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Создает новую таблицу в SQL Server и База данных SQL Azure.

Примечание.

Синтаксис Azure Synapse Analytics см. в статье CREATE TABLE (Azure Synapse Analytics).

Соглашения о синтаксисе Transact-SQL

Параметры синтаксиса

Общий синтаксис

Простой синтаксис CREATE TABLE (общий, если не используются параметры):

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

Полный синтаксис

Синтаксис CREATE TABLE на основе диска:

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>

Синтаксис для таблиц, оптимизированных для памяти

Синтаксис CREATE TABLE, оптимизированный для памяти:

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

}

Аргументы

database_name

Имя базы данных, в которой создается таблица. Параметр database_name должен указывать имя существующей базы данных. Если не указано, в качестве database_name по умолчанию выбирается текущая база данных. Имя входа для текущего соединения должно быть связано с идентификатором пользователя, существующего в базе данных, указанной аргументом database_name, а этот пользователь должен обладать разрешениями CREATE TABLE.

schema_name

Имя схемы, которой принадлежит новая таблица.

table_name

Имя новой таблицы. Имена таблиц должны соответствовать правилам для идентификаторов. Аргумент table_name может состоять не более чем из 128 символов, за исключением имен локальных временных таблиц (имена с префиксом из одного символа решетки (#)), длина которых не должна превышать 116 символов.

AS FileTable

Область применения: SQL Server 2012 (11.x) и более поздних версий.

Создает новую таблицу FileTable. Нет необходимости указывать столбцы, так как таблица FileTable имеет фиксированное схему. Дополнительные сведения см. в статье Таблицы FileTable.

column_name AS computed_column_expression

Выражение, определяющее значение вычисляемого столбца. Вычисляемый столбец представляет собой виртуальный столбец, физически не хранящийся в таблице, если для него не установлен признак PERSISTED. Значение столбца вычисляется на основе выражения, использующего другие столбцы той же таблицы. Например, определение вычисляемого столбца может быть следующим: cost AS price * qty. Выражение может быть именем невычисляемого столбца, константой, функцией, переменной или любой их комбинацией, соединенной одним или несколькими операторами. Выражение не может быть вложенным запросом или содержать псевдонимы типов данных.

Вычисляемые столбцы могут использоваться в списках выбора, предложениях WHERE, ORDER BY и в любых других местах, в которых могут использоваться обычные выражения, за исключением следующих случаев.

  • Для использования в ограничениях FOREIGN KEY или CHECK вычисляемые столбцы должны быть помечены как PERSISTED.

  • Вычисляемый столбец может использоваться в качестве ключевого столбца в индексе или в качестве компонента какого-либо ограничения PRIMARY KEY или UNIQUE, если значение этого вычисляемого столбца определено детерминистическим выражением, а тип данных результата разрешен в столбцах индекса.

    Например, если таблица содержит целочисленные столбцы a и b, вычисляемый столбец a + b может быть включен в индекс, а вычисляемый столбец a + DATEPART(dd, GETDATE()) — не может, так как его значение может изменяться при последующих вызовах.

  • Вычисляемый столбец не может быть целевым столбцом инструкций INSERT или UPDATE.

Примечание.

Каждая строка таблицы может содержать различные значения столбцов, задействованных в вычисляемом столбце; таким образом, значение вычисляемого столбца не будет одним и тем же в каждой строке.

В зависимости от используемых выражений значение NULL вычисляемых столбцов определяется автоматически ядро СУБД. Считается, что результат большинства выражений допускает значение NULL, даже если используются только столбцы, для которых значение NULL запрещено, так как при возможном переполнении или потере точности может получаться значение NULL. Для выяснения допустимости значения NULL в вычисляемом столбце таблицы используйте функцию COLUMNPROPERTY со свойством AllowsNull. Добиться того, чтобы выражение не допускало значения NULL, можно, указав ISNULL с константой check_expression, где константа представляет собой ненулевое значение, заменяющее любое значение NULL. Для вычисляемых столбцов, основанных на выражениях, содержащих определяемые пользователем типы среды CLR, требуется разрешение REFERENCES на тип.

PERSISTED

Указывает, что sql Server ядро СУБД физически сохраняет вычисляемые значения в таблице и обновляет значения при обновлении любых других столбцов, от которых зависит вычисляемый столбец. Указание PERSISTED для вычисляемого столбца позволяет создать индекс по вычисляемому столбцу, который будет детерминированным, но не точным. Дополнительные сведения см. в разделе Индексы вычисляемых столбцов. Все вычисляемые столбцы, используемые как столбцы секционирования в секционированной таблице, должны быть явно помечены как PERSISTED. Если указан параметр PERSISTED, значение computed_column_expression должно быть детерминированным.

ON { partition_scheme | filegroup | "default" }

Указывает схему секционирования или файловую группу, в которой хранится таблица. Если аргумент partition_scheme указан, таблица будет разбита на секции, хранимые в одной или нескольких файловых группах, указанных аргументом partition_scheme. Если указан аргумент filegroup, таблица сохраняется в файловой группе с таким именем. Это должна быть существующая файловая группа в базе данных. Если указано значение "default" или параметр ON не определен вообще, таблица сохраняется в файловой группе по умолчанию. Механизм хранения таблицы, указанный в инструкции CREATE TABLE, изменить в дальнейшем невозможно.

Параметр ON { partition_scheme | filegroup | "default" } можно также указать в ограничении PRIMARY KEY или UNIQUE. С помощью этих ограничений создаются индексы. Если указан аргумент filegroup, индекс сохраняется в файловой группе с таким именем. Если указано значение "default" или параметр ON не определен вообще, индекс сохраняется в той же файловой группе, что и таблица. Если ограничение PRIMARY KEY или UNIQUE создает кластеризованный индекс, страницы данных таблицы сохраняются в той же файловой группе, что и индекс. Если ограничение создает кластеризованный индекс (с помощью параметра CLUSTERED или другим способом), а указанный аргумент partition_scheme отличается от аргументов partition_scheme и filegroup из определения таблицы либо наоборот, принимается во внимание только определение ограничения, а все остальное не учитывается.

Примечание.

В этом контексте default не является ключевым словом. Это идентификатор файловой группы по умолчанию, который должен иметь разделители, как в выражении ON "default" или ON [default]. Если "default" задано, QUOTED_IDENTIFIER параметр должен быть ВКЛЮЧЕН для текущего сеанса. Этот параметр принимается по умолчанию. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.

После создания секционированной таблицы рекомендуется присвоить параметру LOCK_ESCALATION для таблицы значения AUTO. При этом можно усовершенствовать параллелизм, разрешив укрупнение блокировок до уровня секции (HoBT) вместо таблицы. Дополнительные сведения см. в разделе ALTER TABLE.

TEXTIMAGE_ON { filegroup | "default" }

Указывает, что столбцы типов text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max), а также определяемых пользователем типов данных CLR (включая geometry и geography) хранятся в указанной файловой группе.

Параметр TEXTIMAGE_ON недопустим, если в таблице нет столбцов с большими значениями. Нельзя указывать параметр TEXTIMAGE_ON одновременно с параметром partition_scheme. Если указано значение "default" или параметр TEXTIMAGE_ON не определен вообще, столбцы с большими значениями сохраняются в файловой группе по умолчанию. Способ хранения любых данных столбцов с большими значениями, определенный инструкцией CREATE TABLE, изменить в дальнейшем невозможно.

Примечание.

varchar(max), nvarchar(max), varbinary(max), xml и большие значения UDT хранятся прямо в строке данных до предельного размера в 8000 байт и пока значение умещается в записи. Если значение не умещается в записи, то указатель хранится в строке, а все остальное хранится вне строки в области хранения объектов LOB. 0 — это значение по умолчанию, указывающее, что все значения сохраняются прямо в строке данных.

Параметр TEXTIMAGE_ON изменяет только расположение "пространства хранения объектов LOB", но не влияет на данные, хранящиеся в строке. Используйте большие типы значений из параметра строки sp_tableoption для хранения всего бизнес-значения вне строки.

В этом контексте default не является ключевым словом. Это идентификатор файловой группы по умолчанию, который должен иметь разделители, как в выражении TEXTIMAGE_ON "default" или TEXTIMAGE_ON [default]. Если "default" задано, QUOTED_IDENTIFIER параметр должен быть ВКЛЮЧЕН для текущего сеанса. Этот параметр принимается по умолчанию. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | filegroup | "default" }

Область применения: SQL Server 2008 R2 (10.50.x) и более поздних версий. База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают FILESTREAM.

Задает файловую группу для данных FILESTREAM.

Если таблица содержит данные FILESTREAM и является секционированной, необходимо включить предложение FILESTREAM_ON и указать схему секционирования файловых групп файлового потока. В этой схеме секционирования должны использоваться те же функции и столбцы секционирования, что и в схеме секционирования для таблицы; в противном случае возникает ошибка.

Если таблица не секционирована, столбец FILESTREAM не может быть секционирован. Данные FILESTREAM для таблицы должны храниться в отдельной файловой группе. Эта файловая группа указывается в предложении FILESTREAM_ON.

Если таблица не является секционированной и предложение FILESTREAM_ON не указано, используется файловая группа FILESTREAM, для которой задано свойство DEFAULT. При отсутствии файловой группы FILESTREAM возникает ошибка.

Как и в случае с предложениями ON и TEXTIMAGE_ON, значение, указанное с помощью инструкции CREATE TABLE для предложения FILESTREAM_ON, не может быть изменено, за исключением описанных ниже ситуаций.

  • Инструкция CREATE INDEX преобразует кучу в кластеризованный индекс. В этом случае можно указать другую файловую группу FILESTREAM, схему секционирования или значение NULL.
  • Инструкция DROP INDEX преобразует кластеризованный индекс в кучу. В этом случае можно указать другую файловую группу FILESTREAM, схему секционирования."default"

Для файловой группы в предложении FILESTREAM_ON <filegroup> либо для каждой файловой группы FILESTREAM, упомянутой в схеме секционирования, должен быть определен файл. Этот файл должен быть определен с помощью инструкцииCREATE DATABASE или ALTER DATABASE, иначе возникает ошибка.

Дополнительные сведения о FILESTREAM см. в статье Большой двоичный объект — данные большого двоичного объекта.

[ type_schema_name. ] type_name

Указывает тип данных столбца и схему, к которой он принадлежит. Для дисковых таблиц используйте один из следующих типов данных:

  • Системный тип данных.
  • Псевдоним, основанный на системном типе данных SQL Server. Прежде чем псевдонимы типов данных можно будет использовать в определении таблицы, их нужно создать с помощью инструкции CREATE TYPE. Состояние признака NULL или NOT NULL для псевдонима типа данных можно переопределить с помощью инструкции CREATE TABLE. Однако его длину изменить нельзя; длина типа данных-псевдонима не определяется инструкцией CREATE TABLE.
  • Определяемый пользователем тип данных CLR. Прежде чем определяемые пользователем типы данных CLR можно будет использовать в определении таблицы, их нужно создать с помощью инструкции CREATE TYPE. Для создания столбца с определяемым пользователем типом данных CLR требуется разрешение REFERENCES на этот тип.

Если аргумент type_schema_name не указан, компонент SQL Server Database Engine ссылается на аргумент type_name в следующем порядке:

  • Системный тип данных SQL Server.
  • в установленной по умолчанию для текущего пользователя схеме в текущей базе данных;
  • Схема dbo в текущей базе данных.

Список системных типов данных, поддерживаемых оптимизированными для памяти таблицами, см. в разделе Поддерживаемые типы данных для выполняющейся в памяти OLTP.

  • precision

    Точность указанного типа данных. Дополнительные сведения о допустимых значениях точности см. в разделе Точность, масштаб и длина.

  • scale

    Масштаб указанного типа данных. Дополнительные сведения о допустимых значениях масштаба см. в разделе Точность, масштаб и длина.

  • max

    Применяется только к типам данных varchar, nvarchar и varbinary для хранения 2^31 байт символьных и двоичных данных или 2^30 байт данных в Юникоде.

CONTENT

Определяет, что каждый экземпляр типа данных xml в column_name может включать в себя несколько элементов верхнего уровня. Аргумент CONTENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection. Если этот параметр не указан, CONTENT принимается в качестве поведения по умолчанию.

DOCUMENT

Определяет, что каждый экземпляр типа данных xml в column_name может включать в себя только один элемент верхнего уровня. Аргумент DOCUMENT применим только к данным типа xml и может быть указан только в том случае, если одновременно указан аргумент xml_schema_collection.

xml_schema_collection

Применим только к типу данных xml для коллекции схем XML, связанной с этим типом. Перед помещением столбца xml в схему она должна быть создана в базе данных при помощи инструкции CREATE XML SCHEMA COLLECTION.

ПО УМОЛЧАНИЮ

Указывает значение, присваиваемое столбцу в случае отсутствия явно заданного значения при вставке. Определения DEFAULT могут применяться к любым столбцам, кроме имеющих тип timestamp или обладающих свойством IDENTITY. Если значение по умолчанию указывается для столбца определяемого пользователем типа, этот тип должен поддерживать неявное преобразование выражения constant_expression в определяемый пользователем тип. Определения DEFAULT удаляются, когда таблица удаляется из памяти. В качестве значения по умолчанию могут использоваться только константы (например, символьные строки), скалярные функции (системные, определяемые пользователем или функции CLR) или значение NULL. Для обеспечения совместимости с более ранними версиями SQL Server можно назначить имя ограничения default.

  • constant_expression

    Константа, значение NULL или системная функция, используемая в качестве значения столбца по умолчанию.

  • memory_optimized_constant_expression

    Константа, значение NULL или системная функция, используемая в качестве значения столбца по умолчанию. Должно поддерживаться для хранимых процедур, скомпилированных в собственном коде. Дополнительные сведения о встроенных функциях в хранимых процедурах, компилируемых в собственном коде, см. в разделе Поддерживаемые функции для модулей, скомпилированных в собственном коде T-SQL.

IDENTITY

Указывает, что новый столбец является столбцом идентификаторов. При добавлении новой строки в таблицу ядро СУБД предоставляет уникальное добавочное значение для столбца. Столбцы идентификаторов обычно используются с ограничением PRIMARY KEY для поддержания уникальности идентификаторов строк в таблице. Свойство IDENTITY может назначаться столбцам типа tinyint, smallint, int, bigint, decimal(p, 0) или numeric(p, 0). Для каждой таблицы можно создать только один столбец идентификаторов. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указать как начальное значение, так и приращение, или же не указывать ничего. Если ничего не указано, применяется значение по умолчанию (1,1).

  • seed

    Значение, используемое для первой строки, загружаемой в таблицу.

  • increment

    Значение приращения, добавляемое к значению идентификатора предыдущей загруженной строки.

NOT FOR REPLICATION

В инструкции CREATE TABLE предложение NOT FOR REPLICATION может указываться для свойства IDENTITY, а также ограничений FOREIGN KEY и CHECK. Если это предложение указано для свойства IDENTITY, значения в столбцах идентификаторов не приращиваются, если вставку выполняют агенты репликации. Если ограничение сопровождается этим предложением, оно не выполняется, когда агенты репликации выполняют операции вставки, обновления или удаления.

GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] [ NOT NULL ]

Область применения: SQL Server 2016 (13.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Определяет столбец, используемый системой для автоматического сбора сведений о версиях строк в таблице и связанной таблице журнала (если для таблицы используется системное управление версиями и таблица журнала). Используйте этот аргумент с параметром WITH SYSTEM_VERSIONING = ON для создания таблиц с системным управлением версиями: темпоральных таблиц или таблиц реестра. Дополнительные сведения см. в разделах об обновляемых таблицах реестра и темпоральных таблицах.

Параметр Требуемый тип данных Требуемая допустимость значений NULL Description
ROW datetime2 START: NOT NULL
END: NOT NULL
Время начала (START) или время окончания (END), определяющие период допустимости определенной версии строки. Используйте этот аргумент с аргументом PERIOD FOR SYSTEM_TIME, чтобы создать темпоральную таблицу.
TRANSACTION_ID bigint START: NOT NULL
END: NULL
Область применения: SQL Server 2022 (16.x) и более поздних версий и База данных SQL Azure.

Идентификатор транзакции, которая создает (START) или делает недействительной (END) версию строки. Если используется таблица реестра, этот идентификатор ссылается на строку в представлении sys.database_ledger_transactions.
SEQUENCE_NUMBER bigint START: NOT NULL
END: NULL
Область применения: SQL Server 2022 (16.x) и более поздних версий и База данных SQL Azure.

Порядковый номер операции, которая создает (START) или удаляет (END) версию строки. Это значение уникально в пределах транзакции.

При попытке указать столбец, который не соответствует приведенному выше типу данных или требованиям к допустимости значений NULL, система выдаст ошибку. Если допустимость значений NULL не указана явным образом, система самостоятельно определит для столбца модификатор NULL или NOT NULL в соответствии с приведенными выше требованиями.

Вы можете пометить один или оба столбца периода флагом HIDDEN, чтобы эти столбцы были скрыты и инструкция SELECT * FROM <table> не возвращала значения этих столбцов. По умолчанию столбцы периода не скрываются. Чтобы использовать скрытые столбцы, их необходимо явно указывать во всех запросах, обращающихся к темпоральной таблице. Чтобы изменить HIDDEN атрибут для существующего столбца периода, PERIOD необходимо удалить и повторно создать с другим скрытым флагом.

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

Область применения: SQL Server 2014 (12.x) и более поздние версии, а также База данных SQL Azure.

Задает создание индекса для таблицы. Это может быть кластеризованный или некластеризованный индекс. Индекс будет содержать указанные столбцы и сортировать данные по возрастанию или убыванию.

INDEX index_name CLUSTERED COLUMNSTORE

Область применения: SQL Server 2014 (12.x) и более поздние версии, а также База данных SQL Azure.

Задает сохранение всей таблицы в виде столбцов с кластеризованным индексом columnstore. Сюда всегда входят все столбцы в таблице. Данные не сортируются в алфавитном или числовом порядке, поскольку организация строк позволяет использовать преимущества сжатия columnstore.

В Azure Synapse Analytics, Системе платформы аналитики (PDW) и SQL Server 2022 (16.x) и более поздних версиях можно определить порядок столбцов для кластеризованного индекса columnstore. Дополнительные сведения см. в разделе "Использование упорядоченного кластеризованного индекса columnstore" для больших таблиц хранилища данных.

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

Область применения: SQL Server 2014 (12.x) и более поздние версии, а также База данных SQL Azure.

Задает создание некластеризованного индекса columnstore в таблице. Базовая таблица может быть кучей rowstore или кластеризованным индексом или кластеризованным индексом columnstore. В любом случае при создании некластеризованного индекса columnstore в таблице сохраняется вторая копия данных для столбцов в индексе.

Некластеризованный индекс columnstore хранится и управляется как кластеризованный индекс columnstore. Он называется некластеризованным индексом columnstore, потому что столбцы могут быть ограничены и он существует как дополнительный индекс в таблице.

ON partition_scheme_name ( column_name )

Задает схему секционирования, которая определяет файловые группы, соответствующие секциям секционированного индекса. Схема секционирования должна быть создана в базе данных путем выполнения инструкции CREATE PARTITION SCHEME или ALTER PARTITION SCHEME. column_name указывает столбец, по которому будет секционирован индекс. Столбец должен соответствовать по типу данных, длине и точности аргументу функции секционирования, используемой аргументом partition_scheme_name. column_name необязательно должен соответствовать столбцам из определения индекса. Можно указать любой столбец базовой таблицы, за исключением случая секционирования индекса UNIQUE, когда аргумент column_name должен быть выбран из используемых в качестве уникального ключа. Это ограничение позволяет ядро СУБД проверять уникальность значений ключей только в одной секции.

Примечание.

При секционировании не уникального кластеризованного индекса ядро СУБД по умолчанию добавляет столбец секционирования в список кластеризованных ключей индекса, если он еще не указан. При секционировании неукластеризованного индекса ядро СУБД добавляет столбец секционирования в виде неключевых (включенных) столбцов индекса, если он еще не указан.

Если partition_scheme_name или filegroup не задан, а таблица секционирована, индекс помещается в ту же схему секционирования и с тем же столбцом секционирования, что и для базовой таблицы.

Примечание.

Для XML-индекса задать схему секционирования невозможно. Если базовая таблица секционирована, XML-индекс использует ту же схему секционирования, что и таблица.

Дополнительные сведения об индексах секционирования см. в разделе Секционированные таблицы и индексы.

ON filegroup_name

Создает заданный индекс в указанной файловой группе. Если местоположение не указано и таблица или представление не секционированы, индекс использует ту же файловую группу, что и базовая таблица или базовое представление. Файловая группа должна существовать.

ON "default"

Создает заданный индекс в файловой группе, используемой по умолчанию.

Примечание.

В этом контексте default не является ключевым словом. Это идентификатор файловой группы по умолчанию, который должен иметь разделители, как в выражении ON "default" или ON [default]. Если "default" задано, QUOTED_IDENTIFIER параметр должен быть ВКЛЮЧЕН для текущего сеанса. Этот параметр принимается по умолчанию. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.

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

Область применения: SQL Server 2008 R2 (10.50.x) и более поздних версий.

Указывает размещение данных FILESTREAM для таблицы при создании кластеризованного индекса. Предложение FILESTREAM_ON позволяет перемещать данные FILESTREAM в другую файловую группу FILESTREAM или схему секционирования.

Аргумент filestream_filegroup_name указывает имя файловой группы FILESTREAM. В файловой группе должен быть определен один файл для файловой группы с помощью инструкции CREATE DATABASE или ALTER DATABASE, иначе возникает ошибка.

Если таблица секционирована, должно быть включено предложение FILESTREAM_ON и указана схема секционирования файловых групп FILESTREAM, использующая ту же функцию и те же столбцы секционирования, что и схема секционирования для таблицы. В противном случае произойдет ошибка.

Если таблица не секционирована, столбец FILESTREAM не может быть секционирован. Данные FILESTREAM для этой таблицы необходимо хранить в отдельной файловой группе, указанной в предложении FILESTREAM_ON.

FILESTREAM_ON NULL можно указать в инструкции CREATE INDEX, если создается кластеризованный индекс и таблица не содержит столбец FILESTREAM.

Дополнительные сведения см. в статье FILESTREAM (SQL Server).

ROWGUIDCOL

Указывает, что новый столбец является столбцом идентификаторов GUID строки. Только один столбец типа uniqueidentifier в таблице может быть назначен в качестве столбца ROWGUIDCOL. Применение свойства ROWGUIDCOL позволяет ссылаться на столбец с помощью ключевого слова $ROWGUID. Свойство ROWGUIDCOL может быть присвоено только столбцу типа uniqueidentifier. Ключевым словом ROWGUIDCOL нельзя обозначать столбцы определяемых пользователем типов данных.

Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце. Кроме того, при указании данного свойства автоматического формирования значений для новых строк, вставляемых в таблицу, не выполняется. Для создания уникальных значений в каждом столбце следует использовать функцию NEWID или NEWSEQUENTIALID в инструкциях INSERT либо использовать эти функции по умолчанию для столбца.

ENCRYPTED WITH

Указывает столбцы шифрования с помощью функции Always Encrypted.

  • COLUMN_ENCRYPTION_KEY = key_name

    Указывает пустой ключ шифрования столбца. Дополнительные сведения см. в этой статье.

  • ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED }

    Детерминированное шифрование использует метод, который всегда создает одно и то же зашифрованное значение для любого текстового значения. Это позволяет выполнять поиск с помощью сравнения на равенство, группирование и объединение таблиц по зашифрованным значениям. При этом несанкционированные пользователи могут определять некоторую информацию о зашифрованных значениях путем анализа повторов в зашифрованном столбце. Соединить две таблицы по столбцам с детерминированным шифрованием можно только в том случае, если оба столбца шифруются с помощью одного ключа шифрования столбца. При использовании детерминированного шифрования необходимо указать порядок сортировки binary2 в параметрах сортировки для символьных столбцов.

    Случайное шифрование использует метод, который шифрует данные менее предсказуемым образом. Случайное шифрование более безопасное, но не предусматривает вычисления и индексацию в зашифрованных столбцах, если экземпляр SQL Server не поддерживает функцию Always Encrypted с безопасными анклавами. Дополнительные сведения см. в статье Always Encrypted с безопасными анклавами.

    Если вы используете функцию Always Encrypted (без безопасных анклавов), к столбцам, поиск которых осуществляется на основе параметров или параметров группирования, например номер внутреннего паспорта, следует применять детерминированное шифрование. Используйте случайное шифрование для таких данных, как номер кредитной карты, которые не группируются с другими записями, не используются для соединения таблиц и не могут быть параметром поиска, так как для поиска нужной строки с зашифрованным столбцом используются другие столбцы (например, номер транзакции).

    При использовании функции Always Encrypted с безопасными анклавами советуем использовать случайное шифрование.

    Столбцы должны иметь подходящий тип данных.

  • ALGORITHM

    Область применения: SQL Server 2016 (13.x) и более поздних версий.

    Этот параметр должен содержать значение 'AEAD_AES_256_CBC_HMAC_SHA_256'.

    Дополнительные сведения о функции Always Encrypted, в том числе об ограничениях, см. в этой статье.

SPARSE

Указывает, что столбец является разреженным столбцом. Хранилище разреженных столбцов оптимизируется для значений NULL. Для разреженных столбцов нельзя указать параметр NOT NULL. Дополнительные ограничения и сведения о разреженных столбцах см. в разделе Разреженные столбцы.

MASKED WITH ( FUNCTION = 'mask_function' )

Область применения: SQL Server 2016 (13.x) и более поздних версий.

Указывает маску для динамического маскирования данных. mask_function — это имя функции маскирования с соответствующими параметрами. Доступны четыре функции:

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

Требуется разрешение ALTER ANY MASK.

Параметры функции см. в разделе Динамическое маскирование данных.

FILESTREAM

Область применения: SQL Server 2008 R2 (10.50.x) и более поздних версий.

Допустимо только для столбцов типа varbinary(max). Указывает хранилище FILESTREAM для данных больших двоичных объектов типа varbinary(max).

Таблица также должна содержать столбец данных типа uniqueidentifier с атрибутом ROWGUIDCOL. Этот столбец не должен допускать значений NULL и должен иметь относящееся к одному столбцу ограничение UNIQUE или PRIMARY KEY. Значение идентификатора GUID для столбца должно быть предоставлено приложением во время вставки данных или ограничением DEFAULT, в котором используется функция NEWID ().

Столбец ROWGUIDCOL нельзя удалить, а связанные ограничения нельзя изменить, если в таблице определен столбец FILESTREAM. Столбец ROWGUIDCOL можно удалить только после удаления последнего столбца FILESTREAM.

Если для столбца задан атрибут хранилища FILESTREAM, то все значения для этого столбца хранятся в контейнере данных FILESTREAM в файловой системе.

COLLATE collation_name

Задает параметры сортировки для столбца. Могут использоваться параметры сортировки Windows или параметры сортировки SQL. Аргумент collation_name применим только к столбцам типа char, varchar, text, nchar, nvarchar и ntext. Если этот аргумент не указан, столбцу назначаются либо параметры сортировки определяемого пользователем типа, если столбец принадлежит к определяемому пользователем типу данных, либо установленные по умолчанию параметры сортировки для базы данных.

Дополнительные сведения об именах параметров сортировки Windows и SQL см. в разделах Имя параметров сортировки Windows и Имя параметров сортировки SQL.

Дополнительные сведения см. в описании COLLATE.

ОГРАНИЧЕНИЯ

Необязательное ключевое слово, указывающее на начало определения ограничения PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY или CHECK.

  • constraint_name

    Имя ограничения. Имена ограничений должны быть уникальными в пределах схемы, к которой принадлежит таблица.

  • NULL | NOT NULL

    Определяет, допустимы ли для столбца значения NULL. Параметр NULL не является ограничением в строгом смысле слова, но может быть указан так же, как и NOT NULL. Ограничение NOT NULL может быть указано для вычисляемых столбцов только в случае, если одновременно указан параметр PERSISTED.

  • ПЕРВИЧНЫЙ КЛЮЧ

    Ограничение, которое обеспечивает целостность сущностей для указанного столбца или столбцов с помощью уникального индекса. Можно создать только одно ограничение PRIMARY KEY для таблицы.

  • UNIQUE

    Ограничение, которое обеспечивает целостность сущностей для указанного столбца или столбцов с помощью уникального индекса. В таблице может быть несколько ограничений UNIQUE.

  • CLUSTERED | NONCLUSTERED

    Указывает, что для ограничения PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный индекс. Для ограничений PRIMARY KEY по умолчанию создается кластеризованный индекс (CLUSTERED), а для ограничений UNIQUE — некластеризованный (NONCLUSTERED).

    В инструкции CREATE TABLE параметр CLUSTERED можно задать только для одного ограничения. Если для ограничения UNIQUE указан параметр CLUSTERED, и, кроме того, указано ограничение PRIMARY KEY, то для PRIMARY KEY применяется по умолчанию значение NONCLUSTERED.

  • FOREIGN KEY REFERENCES

    Ограничение, которое обеспечивает ссылочную целостность данных в этом столбце или столбцах. Ограничения FOREIGN KEY требуют, чтобы каждое значение в столбце существовало в соответствующем связанном столбце или столбцах в связанной таблице. Ограничения FOREIGN KEY могут ссылаться только на столбцы, являющиеся ограничениями PRIMARY KEY или UNIQUE в связанной таблице или на столбцы, на которые имеются ссылки в индексе UNIQUE INDEX связанной таблицы. Внешние ключи в вычисляемых столбцах должны быть также помечены как PERSISTED.

  • [ [ schema_name. ] referenced_table_name ]

    Имя таблицы, на которую ссылается ограничение FOREIGN KEY, и схема, к которой она принадлежит.

  • ( ref_column [ ,... n ] )

    Столбец или список столбцов из таблицы, на которую ссылается ограничение FOREIGN KEY.

  • ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

    Определяет операцию, которая производится над строками создаваемой таблицы, если эти строки имеют ссылочную связь, а строка, на которую имеются ссылки, удаляется из родительской таблицы. Параметр по умолчанию — NO ACTION.

  • NO ACTION

    Ядро СУБД вызывает ошибку, а действие удаления строки в родительской таблице откатывается.

  • CASCADE

    Если из родительской таблицы удаляется строка, соответствующие ей строки удаляются и из ссылающейся таблицы.

  • SET NULL

    Все значения, составляющие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в NULL. Для выполнения этого ограничения внешние ключевые столбцы должны допускать значения NULL.

  • SET DEFAULT

    Все значения, составляющие внешний ключ, задаются по умолчанию при удалении соответствующей строки в родительской таблице. Для выполнения этого ограничения все внешние ключевые столбцы должны иметь определения по умолчанию. Если столбец допускает значения NULL и значение по умолчанию явно не определено, значением столбца по умолчанию становится NULL.

    Не указывайте параметр CASCADE, если таблица будет включена в публикацию слиянием, в которой используются логические записи. Дополнительные сведения о логических записях см. в статье Группирование изменений в связанных строках с помощью логических записей.

    Параметр ON DELETE CASCADE нельзя указывать, если в таблице уже существует триггер INSTEAD OF для условия ON DELETE.

    Например, в базе данных AdventureWorks2022 таблица ProductVendor имеет ссылочную связь с таблицей Vendor. Внешний ключ ProductVendor.BusinessEntityID ссылается на первичный ключ Vendor.BusinessEntityID.

    DELETE Если инструкция выполняется в строке таблицыVendor, а ON DELETE CASCADE для нее указано ProductVendor.BusinessEntityIDдействие, ядро СУБД проверяет наличие одной или нескольких зависимых строк в ProductVendor таблице. При наличии зависимые строки в ProductVendor таблице удаляются, а также строка, указанная в Vendor таблице.

    В противном случае, если задан параметр NO ACTION, ядро СУБД выдает ошибку и производит откат операции по удалению строки из таблицы Vendor, если в таблице ProductVendor существует хотя бы одна строка, ссылающаяся на нее.

  • ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

    Указывает, какое действие совершается над строками в изменяемой таблице, когда эти строки имеют ссылочную связь и строка родительской таблицы, на которую указывает ссылка, обновляется. Параметр по умолчанию — NO ACTION.

  • NO ACTION

    Ядро СУБД вызывает ошибку, а действие обновления строки в родительской таблице откатится.

  • CASCADE

    Соответствующие строки обновляются в ссылающейся таблице, если эта строка обновляется в родительской таблице.

  • SET NULL

    Всем значениям, составляющим внешний ключ, присваивается значение NULL, когда обновляется соответствующая строка в родительской таблице. Для выполнения этого ограничения внешние ключевые столбцы должны допускать значения NULL.

  • SET DEFAULT

    Всем значениям, составляющим внешний ключ, присваивается их значение по умолчанию, когда обновляется соответствующая строка в родительской таблице. Для выполнения этого ограничения все внешние ключевые столбцы должны иметь определения по умолчанию. Если столбец допускает значения NULL и значение по умолчанию явно не определено, значением столбца по умолчанию становится NULL.

    Не указывайте параметр CASCADE, если таблица будет включена в публикацию слиянием, в которой используются логические записи. Дополнительные сведения о логических записях см. в статье Группирование изменений в связанных строках с помощью логических записей.

    Действия ON UPDATE CASCADE, SET NULL и SET DEFAULT нельзя определить, если в изменяемой таблице уже существует триггер INSTEAD OF для условия ON UPDATE.

    Например, в AdventureWorks2022 базе данных ProductVendor таблица имеет ссылку на Vendor таблицу: ProductVendor.BusinessEntity внешний ключ ссылается на первичный Vendor.BusinessEntityID ключ.

    Если инструкция UPDATE выполняется в строке таблицыVendor, а для параметра ON UPDATE CASCADE указано ProductVendor.BusinessEntityIDдействие ON UPDATE CASCADE, ядро СУБД проверяет наличие одной или нескольких зависимых строк в ProductVendor таблице. При наличии зависимые строки в ProductVendor таблице обновляются, а также строка, указанная в Vendor таблице.

    В противном случае, если задан параметр NO ACTION, ядро СУБД выдает ошибку и производит откат операции по обновлению строки в таблице Vendor, если в таблице ProductVendor существует хотя бы одна строка, ссылающаяся на нее.

  • ПРОВЕРКА

    Ограничение, обеспечивающее целостность домена путем ограничения возможных значений, которые могут быть введены в столбец или столбцы. Ограничения CHECK в вычисляемых столбцах должны быть также помечены как PERSISTED.

  • logical_expression

    Логическое выражение, возвращающее значения TRUE или FALSE. Псевдонимы типа данных частью выражения быть не могут.

  • column_name

    Столбец или список столбцов (в скобках), используемый в ограничениях таблицы для указания столбцов, используемых в определении ограничения.

  • [ ASC | DESC ]

    Указывает порядок сортировки столбца или столбцов, участвующих в ограничениях таблицы. Значение по умолчанию — ASC.

  • partition_scheme_name

    Имя схемы секционирования, определяющей файловые группы, которым сопоставляются секции секционированной таблицы. Эта схема секционирования должна существовать в базе данных.

  • [ partition_column_name. ]

    Указывает столбец, по которому будет секционирована таблица. Столбец должен совпадать с указанным в функции секционирования, которая используется аргументом partition_scheme_name, по типу данных, длине и точности. Вычисляемый столбец, участвующий в функции секционирования, должен быть явно обозначен ключевым словом PERSISTED.

    Внимание

    Рекомендуется указывать параметр NOT NULL для столбца секционирования секционированных таблиц, а также для несекционированных таблиц, являющихся источниками или целями для операций ALTER TABLE...SWITCH. В результате любые ограничения CHECK, заданные для столбцов секционирования, не будут проверять значения NULL.

  • WITH FILLFACTOR = fillfactor

    Указывает, как полный ядро СУБД должен сделать каждую страницу индекса, которая используется для хранения данных индекса. Пользовательские значения аргумента fillfactor могут быть в диапазоне от 1 до 100. Если значение не указано, по умолчанию используется 0. Значения коэффициентов заполнения 0 и 100 идентичны.

    Внимание

    Описание выражения WITH FILLFACTOR = fillfactor как единственного параметра индекса, применимого к ограничениям PRIMARY KEY или UNIQUE, сохранено для обеспечения обратной совместимости, но в будущих выпусках это выражение документировано не будет.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

Имя набора столбцов. Набор столбцов представляет собой нетипизированное XML-представление, в котором все разреженные столбцы таблицы объединены в структурированные выходные данные. Дополнительные сведения о наборах столбцов см. в разделе Использование наборов столбцов.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )

Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

Указывает имена столбцов, которые система будет использовать для обозначения периода действия записи. Используйте этот аргумент с аргументами GENERATED ALWAYS AS ROW { START | END } и WITH SYSTEM_VERSIONING = ON, чтобы создать темпоральную таблицу. Дополнительные сведения см. в разделе Temporal Tables.

COMPRESSION_DELAY

Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

Если используется оптимизация для памяти, указывается минимальное количество минут задержки, в течение которых строка должна оставаться в таблице без изменений до сжатия в индекс columnstore. SQL Server выбирает определенные строки для сжатия в зависимости от времени их последнего обновления. Например, если строки часто меняются в течение двухчасового периода, установите COMPRESSION_DELAY = 120 Minutes, чтобы обновления были завершены до того, как SQL Server сожмет строку.

Для таблицы на основе диска значение delay указывает минимальное количество минут, в течение которых разностная группа строк в состоянии CLOSED должна оставаться в разностной группе строк до того, как SQL Server сожмет ее в сжатую группу строк. Поскольку таблицы на основе диска не отслеживают время вставки и обновления отдельных строк, SQL Server применяет задержку к разностным группам строк в состоянии CLOSED.

Значение по умолчанию — 0 минут.

Рекомендации по использованию COMPRESSION_DELAY см. в статье Начало работы с Columnstore для получения операционной аналитики в реальном времени.

<table_option> ::=

Указывает один или более параметров таблицы.

DATA_COMPRESSION

Задает режим сжатия данных для указанной таблицы, номера секции или диапазона секций. Существуют следующие варианты выбора.

  • NONE

    Таблица или указанные секции не сжимаются.

  • ROW

    Таблицы или указанные секции сжимаются, используя сжатие строк.

  • СТРАНИЦА

    Таблицы или указанные секции сжимаются, используя сжатие страниц.

  • COLUMNSTORE

    Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

    Применяется только к индексам columnstore, включая некластеризованные и кластеризованные индексы columnstore. COLUMNSTORE задает сжатие с использованием самого эффективного сжатия columnstore. Это обычный вариант.

  • COLUMNSTORE_ARCHIVE

    Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

    Применяется только к индексам columnstore, включая некластеризованные и кластеризованные индексы columnstore. Параметр COLUMNSTORE_ARCHIVE обеспечивает дальнейшее сжатие таблицы или секции до еще меньшего размера. Это может использоваться для архивации или в других ситуациях, где требуется уменьшение объема пространства и допускается увеличение затрат времени на сохранение и выборку

Дополнительные сведения см. в разделе Data Compression.

XML_COMPRESSION

Область применения: SQL Server 2022 (16.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Задает параметр сжатия XML для всех столбцов с типом данных xml в таблице. Существуют следующие варианты выбора.

  • DNS

    Столбцы, использующие тип данных xml, сжимаются.

  • ВЫКЛ.

    Столбцы, использующие тип данных xml, не сжимаются.

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

Указывает разделы, к которым применяется параметр DATA_COMPRESSION или XML_COMPRESSION. Если таблица не секционирована, аргумент ON PARTITIONS приведет к возникновению ошибки. Если не указано предложение ON PARTITIONS, параметр DATA_COMPRESSION применяется ко всем секциям секционированной таблицы.

partition_number_expression можно указать одним из следующих способов:

  • Указав номер секции, например: ON PARTITIONS (2)
  • Указав номера нескольких секций, разделив их запятыми, например ON PARTITIONS (1, 5)
  • Указав диапазоны секций и отдельные секции, например ON PARTITIONS (2, 4, 6 TO 8)

<range> можно указать в виде номеров секций, разделенных ключевым словом TO, например: ON PARTITIONS (6 TO 8).

Чтобы для разных секций задать разные типы сжатия данных, укажите параметр DATA_COMPRESSION несколько раз, например следующим образом:

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

Параметр XML_COMPRESSION можно указывать несколько раз, например:

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

Указывает один или более параметров индекса. Полное описание этих параметров см. в этой статье.

PAD_INDEX = { ON | OFF }

Если указано значение ON, процент свободного места, определяемый параметром FILLFACTOR, применяется к страницам индекса промежуточного уровня. Если указано значение OFF или значение FILLFACTOR не указано, страницы промежуточного уровня заполняются до приблизительного объема, оставляющего достаточно места для, как минимум, одной строки максимального размера, которого может достигать индекс, при этом учитывается набор ключей на промежуточных страницах. Значение по умолчанию — OFF.

FILLFACTOR = fillfactor

Указывает процент, указывающий, насколько полный ядро СУБД должен сделать конечный уровень каждой страницы индекса во время создания или изменения индекса. Значение fillfactor должно быть целым числом от 1 до 100. По умолчанию установлено значение 0. Значения коэффициентов заполнения 0 и 100 идентичны.

IGNORE_DUP_KEY = { ON | OFF }

Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса. Параметр не работает во время выполнения инструкции CREATE INDEX, ALTER INDEX или UPDATE. Значение по умолчанию — OFF.

  • DNS

    Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится предупреждающее сообщение. С ошибкой завершаются только строки, нарушающие ограничение уникальности.

  • ВЫКЛ.

    Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится сообщение об ошибке. Будет выполнен откат всей операции INSERT.

Для IGNORE_DUP_KEY нельзя установить значение ON для индексов, создаваемых для представлений, неуникальных индексов, XML-индексов, пространственных индексов и фильтруемых индексов.

Для просмотра значения IGNORE_DUP_KEY используйте sys.indexes.

Для обратной совместимости синтаксиса аргумент WITH IGNORE_DUP_KEY эквивалентен WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF }

Если указано значение ON, автоматический пересчет устаревших статистик индекса не производится. Если указано значение OFF, включается автоматическое обновление статистик. Значение по умолчанию — OFF.

ALLOW_ROW_LOCKS = { ON | OFF }

Если указано значение ON, при доступе к индексу допустимы блокировки строк. Ядро СУБД определяет, когда используются блокировки строк. При значении OFF блокировки строк не используются. Значение по умолчанию — ON.

ALLOW_PAGE_LOCKS = { ON | OFF }

Если указано значение ON, при доступе к индексу допустимы блокировки страниц. Ядро СУБД определяет, когда используются блокировки страниц. При значении OFF блокировки страниц не используются. Значение по умолчанию — ON.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

Область применения: SQL Server 2019 (15.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Определяет, следует ли выполнять оптимизацию, связанную с состязанием при операциях вставки на последнюю страницу. Значение по умолчанию — OFF. См. подробнее раздел о последовательных ключах в документации по CREATE INDEX.

FILETABLE_DIRECTORY = directory_name

Область применения: SQL Server 2012 (11.x) и более поздних версий.

Указывает имя каталога таблицы FileTable, совместимое с Windows. Это имя должно быть уникальным среди всех имен каталогов FileTable в базе данных. Проверка уникальности выполняется без учета регистра, независимо от параметров сортировки. Если это значение не задано, то используется имя таблицы FileTable.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

Область применения: SQL Server 2012 (11.x) и более поздних версий. База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают FILETABLE.

Указывает имя параметров сортировки, применяемых к Name столбцу в FileTable. Для соответствия семантике именования файлов в операционной системе Windows параметры сортировки не должны учитывать регистр. Если это значение не задано, то используются параметры сортировки по умолчанию базы данных. Если в параметрах сортировки по умолчанию базы данных учитывается регистр, то выдается ошибка и операция CREATE TABLE оканчивается неуспешно.

  • collation_name

    Имя параметров сортировки, не учитывающих регистр.

  • database_default

    Указывает, что для базы данных следует использовать параметры сортировки по умолчанию. Эти параметры сортировки не должны учитывать регистр символов.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

Область применения: SQL Server 2012 (11.x) и более поздних версий. База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают FILETABLE.

Указывает имя, которое должно использоваться для ограничения первичного ключа, автоматически создаваемого в FileTable. Если это значение не задано, то имя для ограничения формируется системой.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

Область применения: SQL Server 2012 (11.x) и более поздних версий. База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают FILETABLE.

Указывает имя, которое должно использоваться для ограничения уникальности, автоматически создаваемого в столбце stream_id в FileTable. Если это значение не задано, то имя для ограничения формируется системой.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

Область применения: SQL Server 2012 (11.x) и более поздних версий. База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают FILETABLE.

Указывает имя, которое должно использоваться для ограничения уникальности, автоматически создаваемого в столбцах parent_path_locator и name в FileTable. Если это значение не задано, то имя для ограничения формируется системой.

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

Область применения: SQL Server 2016 (13.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Допускает системное управление версиями таблицы, если выполнены требования по типу данных, ограничении допустимости значений NULL и ограничении первичного ключа. Эта система будет записывать журнал каждой записи из таблицы с системным управлением версиями в отдельную таблицу журнала. Если аргумент HISTORY_TABLE не используется, этой таблице журнала будет присвоено имя MSSQL_TemporalHistoryFor<primary_table_object_id>. Если при создании таблицы журнала указывается ее имя, следует также указать имя схемы и таблицы.

Если таблица журнала не существует, система создает новую таблицу журнала, соответствующую схеме текущей таблицы, в той же файловой группе, что и текущая таблица. При этом между двумя таблицами создается связь, и система записывает журнал каждой записи в текущей таблице в таблицу журнала. По умолчанию таблица журнала сжимается с использованием метода PAGE.

Если аргумент HISTORY_TABLE используется для создания ссылки и применения существующей таблицы журнала, ссылка создается между текущей таблицей и указанной таблицей. Если текущая таблица секционирована, таблица журнала создается в файловой группе по умолчанию, так как конфигурация секционирования не реплицируется автоматически из текущей таблицы в таблицу журнала. При создании ссылки на существующую таблицу журнала вы можете указать необходимость проверки согласованности данных. Проверка согласованности данных гарантирует, что существующие записи не перекрываются. Проверка согласованности данных является проверкой по умолчанию.

Используйте этот аргумент с аргументами PERIOD FOR SYSTEM_TIME и GENERATED ALWAYS AS ROW { START | END }, чтобы выключить системное управление версиями в таблице. Дополнительные сведения см. в разделе Temporal Tables. Используйте этот аргумент с аргументом WITH LEDGER = ON, чтобы создать обновляемую таблицу реестра. Использование существующих таблиц журнала с таблицами реестра не допускается.

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

Область применения: SQL Server 2016 (13.x) и более поздних версий.

Создание новой таблицы, для которой включена или отключена Stretch Database. Дополнительные сведения см. в разделе Stretch Database.

Внимание

Stretch Database устарел в SQL Server 2022 (16.x) и База данных SQL Azure. Эта функция будет удалена в будущей версии ядро СУБД. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

Включение Stretch Database для таблицы

Если вы включаете Stretch для таблицы, указывая ON, вы можете дополнительно указать MIGRATION_STATE = OUTBOUND, чтобы сразу же приступить к переносу данных, или MIGRATION_STATE = PAUSED, чтобы отложить его. Значение по умолчанию — MIGRATION_STATE = OUTBOUND. Более подробную информацию о включении Stretch для таблицы см. в разделе Включение Stretch Database для таблицы.

Предварительные требования. Прежде чем включить Stretch для таблицы, необходимо включить Stretch на сервере и в базе данных. Дополнительные сведения см. в разделе Enable Stretch Database for a database.

Разрешения. Чтобы включить Stretch для таблицы или базы данных, требуются права db_owner. Чтобы включить Stretch для таблицы, нужно иметь разрешения ALTER для таблицы.

[ FILTER_PREDICATE = { NULL | predicate } ]

Область применения: SQL Server 2016 (13.x) и более поздних версий.

Дополнительно указывает предикат фильтра для выбора строк для миграции из таблицы, которая содержит данные журнала и текущие данные. Этот предикат должен вызывать детерминированную встроенную функцию с табличным значением. Более подробную информацию см. в разделе Включение Stretch Database для таблицы и Выбор строк для миграции с помощью функции фильтра.

Внимание

Если указать плохо оптимизированный предикат фильтра, перенос данных будет выполняться медленно. Stretch Database применяет предикат фильтра к таблице при помощи оператора CROSS APPLY.

Если предикат фильтра не указан, переносится вся таблица.

Если вы указываете предикат фильтра, необходимо также указать MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }

Область применения: SQL Server 2016 (13.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS } ) } ]

Применяется только к: Только для пограничных вычислений SQL Azure

Включает очистку старых или устаревших данных из таблиц в базе данных на основе политики хранения. Дополнительные сведения см. в статье Включение и отключение хранения данных. Для включения хранения данных необходимо указать следующие параметры.

  • FILTER_COLUMN = { column_name }

    Указывает столбец, который должен использоваться для определения того, являются ли строки в таблице устаревшими. Для столбца фильтра разрешены следующие типы данных.

    • date
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS }}

    Указывает политику периода хранения для таблицы. Период хранения указывается как сочетание положительного целого значения и единицы измерения для дат.

MEMORY_OPTIMIZED

Область применения: SQL Server 2014 (12.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure. Управляемый экземпляр SQL Azure не поддерживает оптимизированные для памяти таблицы на уровне общего назначения.

Значение ON указывает, что таблица оптимизирована для памяти. Таблицы, оптимизированные для памяти, входят в функцию выполняющейся в памяти OLTP, которая используется для оптимизации производительности обработки транзакций. Сведения о начале работы с OLTP в памяти см . в кратком руководстве 1. Технологии OLTP в памяти для ускорения производительности Transact-SQL. Дополнительные сведения об оптимизированных для памяти таблицах см. в статье Таблицы, оптимизированные для памяти.

Значение по умолчанию OFF указывает, что таблица основана на диске.

DURABILITY

Область применения: SQL Server 2014 (12.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Значение SCHEMA_AND_DATA указывает на устойчивость таблицы. Это означает, что изменения сохраняются на диске даже после перезагрузки или отработки отказа. SCHEMA_AND_DATA является значением по умолчанию.

Значение SCHEMA_ONLY указывает, что таблица не является устойчивой. При перезапуске или отработке отказа в базе данных схема таблицы сохраняется, а обновления данных — нет. Аргумент DURABILITY = SCHEMA_ONLY может использоваться только совместно с аргументом MEMORY_OPTIMIZED = ON.

Предупреждение

Если таблица была создана с использованием аргумента DURABILITY = SCHEMA_ONLY, а впоследствии значение READ_COMMITTED_SNAPSHOT было изменено с помощью инструкции ALTER DATABASE, данные в таблице будут потеряны.

BUCKET_COUNT

Область применения: SQL Server 2014 (12.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Отображает число контейнеров, которые необходимо создать в хэш-индексе. Максимальное значение для параметра BUCKET_COUNT в хэш-индексах составляет 1 073 741 824. Дополнительные сведения о числах контейнеров см. в разделе Индексы для таблиц, оптимизированных для памяти.

Bucket_count — это обязательный аргумент.

INDEX

Область применения: SQL Server 2014 (12.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Индексы столбцов и таблиц необходимо указывать в составе инструкции CREATE TABLE. Дополнительные сведения о добавлении и удалении индексов в таблицах, оптимизированных для памяти, см. в разделе: Изменение таблиц, оптимизированных для памяти

  • ХЭШ

    Область применения: SQL Server 2014 (12.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

    Указывает, что был создан индекс HASH.

    Хэш-индексы поддерживаются только в таблицах, оптимизированных для памяти.

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

Область применения: SQL Server 2022 (16.x), База данных SQL Azure и Управляемый экземпляр SQL Azure.

Примечание.

Если инструкция создает таблицу реестра, требуется разрешение ENABLE LEDGER.

Указывает, является ли создаваемая таблица таблицей реестра (ON) или нет (OFF). Значение по умолчанию — OFF. Если указан параметр APPEND_ONLY = ON, система создает таблицу реестра только для добавления, в которую можно только вставлять новые строки. В противном случае система создает обновляемую таблицу реестра. Для обновляемой таблицы реестра также требуется аргумент SYSTEM_VERSIONING = ON. Обновляемая таблица реестра должна также поддерживать системное управление версиями. Но обновляемая таблица реестра не обязательно должна быть темпоральной таблицей (для нее не требуется параметр PERIOD FOR SYSTEM_TIME). Если таблица журнала указана с параметрами LEDGER = ON и SYSTEM_VERSIONING = ON, она не должна ссылаться на существующую таблицу.

База данных реестра (созданная с помощью параметра LEDGER = ON) позволяет только создавать таблицы реестра. Попытки создать таблицу с помощью LEDGER = OFF приведут к ошибке. Каждая новая таблица по умолчанию создается как обновляемая таблица реестра, даже если не указано значение LEDGER = ON, которая будет иметь значения по умолчанию для всех остальных параметров.

Обновляемая таблица реестра должна содержать четыре GENERATED ALWAYS столбца, точно один столбец, определенный с каждым из следующих аргументов:

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

Таблица реестра только для добавления должна содержать один столбец, определенный с использованием следующих аргументов:

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

Если какой-либо из обязательных столбцов GENERATED ALWAYS не определен в инструкции CREATE TABLE, но эта инструкция содержит LEDGER = ON, система автоматически попытается добавить столбец, используя применимое определение из приведенного ниже списка. Если существует конфликт имен с определенным ранее столбцом, система выдаст ошибку.

[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> определяет схему и имя для представления реестра, которое система автоматически создает и привязывает к таблице. Если этот параметр не указан, система создает имя представления реестра, добавляя _Ledger к имени создаваемой таблицы (database_name.schema_name.table_name). Если представление с указанным или созданным именем уже существует, система выдаст ошибку. Если таблица является обновляемой таблицей реестра, представление реестра создается путем объединения таблицы и связанной таблицы журнала.

Каждая строка в представлении реестра содержит сведения о создании или удалении версии строки в таблице реестра. Представление реестра содержит все столбцы таблицы реестра, за исключением указанных выше столбцов GENERATED ALWAYS. Представление реестра также содержит следующие дополнительные столбцы:

Имя столбца Тип данных Description
Определяется с использованием параметра TRANSACTION_ID_COLUMN_NAME. ledger_transaction_id, если не определено. bigint Идентификатор транзакции, при выполнении которой была создана или удалена версия строки.
Определяется с использованием параметра SEQUENCE_NUMBER_COLUMN_NAME. ledger_sequence_number, если не определено. bigint Порядковый номер операции на уровне строки в пределах транзакции в таблице.
Определяется с использованием параметра OPERATION_TYPE_COLUMN_NAME. ledger_operation_type, если не определено. tinyint Содержит 1 (INSERT) или 2 (DELETE). При вставке строки в таблицу реестра создается новая строка в представлении реестра, содержащая 1 в этом столбце. При удалении строки из таблицы реестра в представлении реестра создается новая строка, содержащая 2 в этом столбце. При обновлении строки в таблице реестра в представлении реестра появляются две новые строки. Одна строка содержит 2 (DELETE) и другую строку 1 содержит (INSERT) в этом столбце.
Определяется с использованием параметра OPERATION_TYPE_DESC_COLUMN_NAME. ledger_operation_type_desc, если не определено. NVARCHAR(128) Содержит INSERT или DELETE. Дополнительные сведения см. выше.

Транзакции, включающие создание таблицы реестра, регистрируются в sys.database_ledger_transactions.

<ledger_option> ::=

Задает параметр реестра.

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

Задает имя представления реестра и имена дополнительных столбцов, которые система добавляет в представление реестра.

[ APPEND_ONLY = ON | OFF ]

Указывает, является ли созданная таблица реестра доступной только для добавления или обновляемой. Значение по умолчанию — OFF.

<ledger_view_option> ::=

Задает один или несколько параметров представления реестра. В каждом параметре представления реестра указывается имя столбца, которое система добавит к представлению в дополнение к столбцам, определенным в таблице реестра.

[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]

Указывает имя столбца, в котором хранится идентификатор транзакции, которая создала или удалила версию строки. Имя столбца по умолчанию — ledger_transaction_id.

[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]

Указывает имя столбцов, хранящие порядковый номер операции на уровне строк в транзакции в таблице. Имя столбца по умолчанию — ledger_sequence_number.

[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]

Указывает имя столбцов, хранющих идентификатор типа операции. Имя столбца по умолчанию — ledger_operation_type.

[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]

Указывает имя столбцов, хранящие описание типа операции. Имя столбца по умолчанию — ledger_operation_type_desc.

Замечания

Сведения о допустимом количестве таблиц, столбцов, ограничений и индексов см. в разделе Спецификации максимально допустимых параметров SQL Server.

Пространство таблицам и индексам обычно выделяется по одному экстенту за раз. SET MIXED_PAGE_ALLOCATION Если параметр ALTER DATABASE имеет значение TRUE или всегда до SQL Server 2016 (13.x) при создании таблицы или индекса, он выделяет страницы из смешанных экстентов до тех пор, пока не будет достаточно страниц для заполнения единообразной экстенты. Каждый раз, когда число страниц достигает размера однородного экстента, и текущие выделенные экстенты становятся заполненными, выделяется новый экстент. Получить отчет об объеме выделенного и используемого таблицей пространства можно с помощью процедуры sp_spaceused.

Компонент Database Engine не требует указания параметров DEFAULT, IDENTITY, ROWGUIDCOL или ограничения столбцов в определенном порядке при определении столбца.

После создания таблицы параметр QUOTED IDENTIFIER всегда сохраняется в метаданных таблицы в состоянии ON, даже если он был установлен в состояние OFF при создании таблицы.

Временные таблицы

Можно создавать локальные и глобальные временные таблицы. Локальные временные таблицы видимы только во время текущего сеанса, а глобальные — во всех сеансах. Временные таблицы не подлежат секционированию.

Имени локальной временной таблицы должен предшествовать знак номера (#table_name), а имени глобальной временной таблицы — двойной знак номера (##table_name).

Инструкции Transact-SQL обращаются к временной таблице по значению аргумента table_name, заданному в инструкции CREATE TABLE, например так:

CREATE TABLE #MyTempTable (
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Если в пределах одной хранимой процедуры или пакета создается более одной временной таблицы, им должны быть присвоены разные имена.

Параметр schema_name игнорируется при создании или временной таблице или обращении к ней. Все временные таблицы создаются в схеме dbo.

Если локальная временная таблица создается в хранимой процедуре или приложении, которые могут выполняться одновременно несколькими сеансами, ядро СУБД должны иметь возможность различать таблицы, созданные различными сеансами. Ядро СУБД делает это путем внутреннего добавления числовых суффиксов к каждому имени локальной временной таблицы. Полное имя временной таблицы, хранящейся в sys.sysobjects таблице, состоит из имени таблицы tempdb , указанной в инструкции CREATE TABLE, и суффикса, созданного системой. Для обеспечения возможности добавления суффикса значение параметра table_name, определенного как имя локальной временной таблицы, не должно содержать более 116 символов.

Временные таблицы автоматически удаляются при выходе за пределы области определения, если не удалять их явно с помощью инструкции DROP TABLE.

  • Локальная временная таблица, созданная хранимой процедурой, удаляется автоматически при завершении хранимой процедуры. К этой таблице могут обращаться любые вложенные хранимые процедуры, выполняемые хранимой процедурой, создавшей таблицу. Процесс, вызвавший хранимую процедуру, создавшую таблицу, к этой таблице обращаться не может.
  • Все прочие локальные временные таблицы удаляются автоматически в конце текущего сеанса.
  • Глобальные временные таблицы автоматически удаляются при завершении сеанса, создавшего таблицу, и прекращении обращения к ним всех прочих задач. Взаимосвязь между задачей и таблицей поддерживается только на время выполнения конкретной инструкции Transact-SQL. Это означает, что глобальная временная таблица удаляется после выполнения последней инструкции Transact-SQL, которая активно использовала ссылку на таблицу на момент завершения сеанса, создавшего эту таблицу.

Локальная временная таблица, созданная хранимой процедурой или триггером, может иметь то же имя, что и временная таблица, созданная до вызова хранимой процедуры или триггера. Однако если запрос обращается к временной таблице и одновременно существует две таблицы с одинаковым именем, не определено, к какой из таблиц будет направлен запрос. Вложенные хранимые процедуры могут также создавать временные таблицы с тем же именем, что и временная таблица, созданная вызывающей хранимой процедурой. Однако для применения изменений к таблице, созданной во вложенной процедуре, эта таблица должна иметь ту же структуру с теми же именами столбцов, что и таблица, созданная в вызывающей процедуре. Это показано в следующем примере.

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

CREATE PROCEDURE dbo.Test1
AS
    CREATE TABLE #t (x INT PRIMARY KEY);
    INSERT INTO #t VALUES (1);
    SELECT Test1Col = x FROM #t;
    EXEC Test2;
GO

CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;
GO

Результирующий набор:

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

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

При создании локальных или глобальных временных таблиц синтаксис инструкции CREATE TABLE поддерживает определение всех ограничений, кроме FOREIGN KEY. Если во временной таблице указано ограничение FOREIGN KEY, инструкция возвращает предупредительное сообщение, указывающее на то, что ограничение было пропущено. При этом таблица создается без ограничений FOREIGN KEY. В ограничениях FOREIGN KEY обращение к временным таблицам недопустимо.

При создании таблицы с именованным ограничением внутри области, определяемой пользователем транзакции, возможность выполнения инструкций, формирующих временные таблицы, ограничивается одним пользователем единовременно. Например, если хранимая процедура формирует временную таблицу с именованным ограничением первичного ключа, то она не может быть выполнена несколькими пользователями одновременно.

Глобальные временные таблицы (база данных SQL Azure) в области базы данных

Глобальные временные таблицы для SQL Server (с префиксом ##) хранятся в tempdb и являются общими для всех сеансов пользователей на всем экземпляре SQL Server. Дополнительную информацию о типах таблиц SQL см. в предыдущем разделе о создании таблиц.

База данных SQL Azure поддерживает глобальные временные таблицы, которые хранятся в базе данных tempdb и областью действия которых является база данных. Это означает, что глобальные временные таблицы используются для всех сеансов пользователей в одном База данных SQL Azure. Сеансы пользователей, связанные с другими базами данных, не имеют доступа к глобальным временным таблицам.

Глобальные временные таблицы для База данных SQL Azure соответствуют тому же синтаксису и семантике, что и SQL Server для временных таблиц. Аналогичным образом глобальные временные хранимые процедуры также относятся к уровню базы данных в База данных SQL Azure. Локальные временные таблицы (с префиксом #) также поддерживаются базой данных SQL Azure и имеют тот же синтаксис и семантику, что и на SQL Server. См. предыдущий раздел Временные таблицы.

Внимание

Эта функция доступна для База данных SQL Azure.

Устранение неполадок с глобальными временными таблицами в Базе данных SQL Azure

Сведения об устранении неполадок с базой данных tempdb см. в разделе Мониторинг использования базы данных tempdb.

Примечание.

Только администратор сервера может получить доступ к динамическим представлениям по устранению неполадок в База данных SQL Azure.

Разрешения

Любой пользователь может создавать глобальные временные объекты. Если не предоставлены какие-либо дополнительные разрешения, то пользователи могут производить доступ только к тем объектам, которыми они владеют.

Секционированные таблицы

Перед созданием секционированной таблицы с помощью инструкции CREATE TABLE следует вначале создать функцию секционирования, чтобы указать, как должна быть секционирована таблица. Функция секционирования создается с помощью инструкции CREATE PARTITION FUNCTION. Затем необходимо создать схему секционирования, чтобы указать файловые группы, которые будут содержать указанные функцией секционирования секции. Схема секционирования создается с помощью инструкции CREATE PARTITION SCHEME. Для секционированных таблиц нельзя указать ограничения PRIMARY KEY или UNIQUE для разделения файловых групп. Дополнительные сведения см. в разделе Partitioned Tables and Indexes.

Ограничения PRIMARY KEY

  • В таблице возможно наличие только одного ограничения по первичному ключу.

  • Индекс, формируемый ограничением PRIMARY KEY, не может привести к выходу количества индексов в таблице за пределы в 999 некластеризованных индексов и 1 кластеризованный.

  • Если для ограничения PRIMARY KEY не указан параметр CLUSTERED или NONCLUSTERED, применяется параметр CLUSTERED, если для ограничения UNIQUE не определено кластеризованных индексов.

  • Все столбцы с ограничением PRIMARY KEY должны иметь признак NOT NULL. Если допустимость значения NULL не указана, то для всех столбцов c ограничением PRIMARY KEY устанавливается признак NOT NULL.

    Примечание.

    В таблицах, оптимизированных для памяти, допускается ключевой столбец, способный принимать значение NULL.

  • Если первичный ключ определен на столбце определяемого пользователем типа данных CLR, реализация этого типа должна поддерживать двоичную сортировку. Дополнительные сведения об определяемых пользователем типах данных CLR см. в разделе Определяемые пользователем типы данных CLR.

Ограничения UNIQUE

  • Если для ограничения UNIQUE не указан параметр CLUSTERED или NONCLUSTERED, по умолчанию применяется параметр NONCLUSTERED.
  • Каждое ограничение уникальности создает индекс. Количество ограничений UNIQUE не может привести к выходу количества индексов в таблице за пределы в 999 некластеризованных индексов и 1 кластеризованный.
  • Если ограничение уникальности определено на столбце определяемого пользователем типа данных CLR, реализация этого типа должна поддерживать двоичную сортировку или сортировку на основе оператора. Дополнительные сведения об определяемых пользователем типах данных CLR см. в разделе Определяемые пользователем типы данных CLR.

Ограничения FOREIGN KEY

  • Если столбцу, имеющему ограничение внешнего ключа, задается значение, отличное от NULL, такое же значение должно существовать и в указываемом столбце; в противном случае будет возвращено сообщение о нарушении внешнего ключа.

  • Если не указаны исходные столбцы, ограничения FOREIGN KEY применяются к предшествующему столбцу.

  • Ограничения FOREIGN KEY могут ссылаться только на таблицы в пределах той же базы данных на том же сервере. Межбазовую ссылочную целостность необходимо реализовать посредством триггеров. Дополнительные сведения см. в статье об инструкции CREATE TRIGGER.

  • Ограничения FOREIGN KEY могут ссылаться на другие столбцы той же таблицы. Это называется самовызовом.

  • Предложение REFERENCES ограничения внешнего ключа на уровне столбца может содержать только один ссылочный столбец. Этот столбец должен принадлежать к тому же типу данных, что и столбец, для которого определяется ограничение.

  • Предложение REFERENCES ограничения внешнего ключа на уровне таблицы должно содержать такое же число ссылочных столбцов, какое содержится в списке столбцов в ограничении. Тип данных каждого ссылочного столбца должен также совпадать с типом соответствующего столбца в списке столбцов. Ссылочные столбцы должны быть указаны в том же порядке, который использовался при указании столбцов первичного ключа или уникального ограничения в упоминаемой таблице.

  • Если частью внешнего ключа или ключа, на который указывает ссылка, является столбец типа timestamp, ключевые слова CASCADE, SET NULL и SET DEFAULT указывать нельзя.

  • Ключевые слова CASCADE, SET NULL, SET DEFAULT и NO ACTION можно сочетать в таблицах, имеющих взаимные ссылочные связи. Если ядро СУБД обнаруживает NO ACTION, он останавливается и откатывает связанные действия CASCADE, SET NULL и SET DEFAULT. Если инструкция DELETE вызывает сочетание действий CASCADE, SET NULL, SET DEFAULT и NO ACTION, все действия CASCADE, SET NULL и SET DEFAULT применяются до ядро СУБД проверки для любого действия NO ACTION.

  • Компонент Database Engine не имеет стандартного предела на количество ограничений FOREIGN KEY, содержащихся в таблице, ссылающейся на другие таблицы, или на количество ограничений FOREIGN KEY в других таблицах, ссылающихся на указанную таблицу.

    Тем не менее фактическое количество ограничений FOREIGN KEY, доступных для использования, ограничивается конфигурацией оборудования, базы данных и приложения. Рекомендуется, чтобы таблица содержала не более 253 ограничений FOREIGN KEY, а также чтобы на нее ссылалось не более 253 ограничений FOREIGN KEY. Предел эффективности в конкретном случае может более или менее зависеть от приложения и оборудования. При разработке базы данных и приложений следует учитывать стоимость принудительных ограничений FOREIGN KEY.

  • Ограничения FOREIGN KEY не применяются к временным таблицам.

  • Ограничения FOREIGN KEY могут ссылаться только на столбцы с ограничениями PRIMARY KEY или UNIQUE в таблице, на которую указывает ссылка, или на столбцы уникального индекса (UNIQUE INDEX) такой таблицы.

  • Если внешний ключ определен на столбце определяемого пользователем типа данных CLR, реализация этого типа должна поддерживать двоичную сортировку. Дополнительные сведения об определяемых пользователем типах данных CLR см. в разделе Определяемые пользователем типы данных CLR.

  • Столбцы, участвующие в связи по внешнему ключу, должны иметь одинаковую длину и масштаб.

DEFAULT, определения

  • Столбец может иметь только определение DEFAULT.

  • Ограничение DEFAULT может содержать значения констант, функции, стандартные функции без параметров SQL или значение NULL. В следующей таблице приведены функции без параметров и возвращаемые ими по умолчанию значения в процессе выполнения инструкции INSERT.

    Функция без параметров SQL-92 Возвращенное значение
    CURRENT_TIMESTAMP Текущие дата и время.
    CURRENT_USER Имя пользователя, выполняющего вставку.
    SESSION_USER Имя пользователя, выполняющего вставку.
    SYSTEM_USER Имя пользователя, выполняющего вставку.
    Пользователь Имя пользователя, выполняющего вставку.
  • Выражение constant_expression в определении DEFAULT не может ссылаться на другой столбец таблицы, а также на другие таблицы, представления или хранимые процедуры.

  • Определения DEFAULT нельзя создавать для столбцов с типом данных timestamp или столбцов со свойством IDENTITY.

  • Определения DEFAULT нельзя создавать для столбцов с псевдонимами типов данных, если такой тип привязан к определенному по умолчанию объекту.

CHECK, ограничение

  • Столбец может содержать любое количество ограничений CHECK, а условие может включать несколько логических выражений, соединенных операторами AND и OR. При указании нескольких ограничений CHECK для столбца их проверка производится в порядке создания.

  • Условие поиска должно возвращать логическое выражение и не может ссылаться на другую таблицу.

  • Ограничение CHECK уровня столбца может ссылаться только на ограничиваемый столбец, а ограничение CHECK уровня таблицы — только на столбцы этой таблицы.

    Правила и ограничения CHECK выполняют одну и ту же функцию проверки данных при выполнении инструкций INSERT и UPDATE.

  • Если для столбца или столбцов задано правило либо одно или несколько ограничений CHECK, применяются все ограничения.

  • Ограничения CHECK нельзя определять для столбцов типов text, ntext или image.

Дополнительные сведения об ограничении

  • Индекс, созданный для ограничения, нельзя удалить с помощью инструкции DROP INDEX. Вам нужно удалить ограничение с помощью инструкции ALTER TABLE. Индекс, созданный для ограничения и используемый им, можно перестроить с помощью инструкции ALTER INDEX ... REBUILD. Дополнительные сведения см. в статье Реорганизация и перестроение индексов.
  • Имена ограничений должны подчиняться правилам для идентификаторов, за исключением тех, которые не могут начинаться с символа решетки (#). Если аргумент constraint_name не указан, то ограничению присваивается имя, формируемое системой. Имя ограничения отображается в любых сообщениях об ошибках, связанных с нарушением ограничения.
  • При нарушении ограничения в инструкции INSERT, UPDATE или DELETE выполнение инструкции прекращается. Однако если параметр SET XACT_ABORT установлен в значение OFF, а инструкция является частью явной транзакции, выполнение этой транзакции продолжается. Если параметр SET XACT_ABORT установлен в значение ON, производится откат всей транзакции. С определением транзакции можно также использовать инструкцию ROLLBACK TRANSACTION, установив флажок для системной функции @@ERROR.
  • Когда присвоены значения ALLOW_ROW_LOCKS = ON и ALLOW_PAGE_LOCK = ON, при доступе к индексу допустимы блокировки на уровне строк, страниц и таблиц. Ядро СУБД выбирает соответствующую блокировку и может передавать блокировку из строки или блокировки страницы на блокировку таблицы. Если присвоены значения ALLOW_ROW_LOCKS = OFF и ALLOW_PAGE_LOCK = OFF, при доступе к индексу допустима только блокировка на уровне таблиц.
  • Если в таблице содержатся ограничения FOREIGN KEY или CHECK и триггеры, условия ограничений вычисляются перед выполнением триггера.

Получить отчет о таблице и ее столбцах можно с помощью процедуры sp_help или sp_helpconstraint. Для переименования таблицы используется процедура sp_rename. Чтобы получить сведения о представлениях и хранимых процедурах, зависящих от таблицы, используйте функции sys.dm_sql_referenced_entities и sys.dm_sql_referencing_entities.

Правила допустимости значения NULL в рамках определения таблицы

Допустимость значений NULL для столбца определяет, разрешает ли столбец использовать такие значения для своих данных. Значение NULL не является нулевым или пустым. NULL означает, что никаких данных не вводилось либо значение NULL было указано явно. Обычно оно подразумевает, что значение неизвестно или неприменимо.

При создании или изменении таблицы с помощью инструкции CREATE TABLE или ALTER TABLE параметры базы данных и сеанса влияют на допустимость значений NULL для типа данных, указанного в определении столбца, и могут переопределять ее. Рекомендуется всегда явно определять столбец как NULL или NOT NULL для невычисляемых столбцов или, если используется пользовательский тип данных, разрешать, чтобы для столбца применялась возможность, установленная для этого типа по умолчанию. Для разреженных столбцов всегда должно быть разрешено значение NULL.

Если возможность столбца принимать значение NULL не задана явно, она определяется согласно правилам, указанным в следующей таблице.

Тип данных столбца Правило
Псевдоним типа данных Ядро СУБД использует значение NULL, указанное при создании типа данных. Чтобы определить значение NULL по умолчанию типа данных, используйте sp_help.
CLR, определяемый пользователем тип данных Допустимость значения NULL определяется в соответствии с определением столбца.
Системный тип данных Если для системного типа данных предусмотрен только один вариант, он и применяется. Для столбцов типа timestamp должен быть указан параметр NOT NULL. Если любые параметры сеанса с помощью инструкции SET установлены в ON:
ANSI_NULL_DFLT_ON = ON, присваивается значение NULL.
ANSI_NULL_DFLT_OFF = ON, присваивается значение NOT NULL.

Если настроены какие-либо параметры базы данных с помощью инструкции ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = ON, присваивается значение NULL.
ANSI_NULL_DEFAULT_OFF = ON, присваивается значение NOT NULL.

Просмотреть параметр базы данных ANSI_NULL_DEFAULT можно в представлении каталога sys.databases

Если для сеанса не установлен ни один из параметров ANSI_NULL_DFLT, а база данных настроена по умолчанию (ANSI_NULL_DEFAULT = OFF), применяется установленное по умолчанию значение NOT NULL.

Если столбец является вычисляемым столбцом, его значение NULL всегда определяется автоматически ядро СУБД. Определить допустимость значения NULL для этого типа столбцов можно с помощью функции COLUMNPROPERTY со свойством AllowsNull.

Примечание.

Как драйвер ODBC для SQL Server, так и драйвер OLE DB для SQL Server предусматривают по умолчанию значение параметра ANSI_NULL_DFLT_ON, равное ON. Пользователи ODBC и OLE DB могут настраивать этот параметр в источниках данных ODBC или с помощью установки атрибутов или свойств соединения в приложении.

Сжатие данных

В системных таблицах не может быть включено сжатие. При создании таблицы параметру сжатия данных присваивается значение NONE, если не указано иное. При указании списка секций или секции, выходящей за пределы диапазона, будет сформирована ошибка. Дополнительную информацию о сжатии данных см. в разделе Сжатие данных.

Оценить состояние сжатия таблицы, индекса или секции можно с помощью хранимой процедуры sp_estimate_data_compression_savings.

Разрешения

Требуется разрешение CREATE TABLE в базе данных и разрешение ALTER для схемы, в которой создается таблица.

Если какие-либо столбцы в инструкции CREATE TABLE определены как принадлежащие к пользовательскому типу, необходимо иметь разрешение REFERENCES для этого типа.

Если какие-либо столбцы в инструкции CREATE TABLE определены как принадлежащие к определяемому пользователем типу данных CLR, необходимо быть владельцем этого типа либо иметь разрешение REFERENCES для него.

Если какие-либо столбцы в инструкции CREATE TABLE имеют связанную коллекцию схем XML, необходимо быть владельцем этой коллекции схем или иметь разрешение REFERENCES для нее.

Временные таблицы в базе данных tempdb может создавать любой пользователь.

Если инструкция создает таблицу реестра, требуется разрешение ENABLE LEDGER.

Примеры

А. Создание ограничения PRIMARY KEY для столбца

В следующем примере показано определение ограничения PRIMARY KEY с кластеризованным индексом для столбца EmployeeID таблицы Employee. Поскольку имя ограничения не указано, оно будет подставлено системой.

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

B. Применение ограничений FOREIGN KEY

Ограничение FOREIGN KEY используется для ссылки на другую таблицу. Внешние ключи могут включать один или несколько столбцов. В следующем примере показано ограничение FOREIGN KEY с одним столбцом в таблице SalesOrderHeader, ссылающееся на таблицу SalesPerson. Для ограничения FOREIGN KEY с одним столбцом требуется только предложение REFERENCES.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

Кроме того, предложение FOREIGN KEY можно применить явно и заново определить атрибут столбца. Имена столбцов в обеих таблицах могут различаться.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Ограничения по ключам с несколькими столбцами создаются в виде табличных ограничений. В базе данных AdventureWorks2022 таблица SpecialOfferProduct включает ограничение PRIMARY KEY с несколькими столбцами. В следующем примере показано, как обращаться к этому ключу из другой таблицы; задавать имя ограничения явно необязательно.

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

C. Применение ограничений UNIQUE

Ограничения UNIQUE используются для указания уникальности непервичных ключевых столбцов. В следующем примере применяется ограничение уникальности столбца Name таблицы Product.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. Применение определений DEFAULT

Определения DEFAULT (вместе с инструкциями INSERT и UPDATE) позволяют указать значение по умолчанию, используемое, если значение не задано. Например, база данных AdventureWorks2022 может включать таблицу уточняющих запросов, содержащую различные должности, которые могут занимать сотрудники компании. В столбце, описывающем каждую должность, значение символьной строки по умолчанию может содержать описание, отображаемое, если фактическое описание должности не было введено явно.

DEFAULT 'New Position - title not formalized yet'

Кроме констант, определения DEFAULT могут включать функции. Следующий пример позволяет получить текущую дату для той или иной записи.

DEFAULT (GETDATE())

Обработка функциями без параметров также может повысить целостность данных. Чтобы определить пользователя, вставившего строку, используйте функцию без параметров для USER. Не заключайте функции без параметров в скобки.

DEFAULT USER

Е. Применение ограничений CHECK

В следующем примере показано ограничение, применяемое к значениям, вводимым в столбец CreditRating таблицы Vendor. Ограничение не имеет имени.

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

В этом примере показано именованное ограничение вводимых в столбец таблицы символьных данных по шаблону.

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

В этом примере указывается, что значения должны входить в заданный список или соответствовать заданному шаблону.

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

F. Вывод на экран полного определения таблицы

В следующем примере выводятся полные определения таблицы со всеми определениями ограничений для таблицы PurchaseOrderDetail, созданной в базе данных AdventureWorks2022. Для выполнения этого образца схема таблицы заменяется на схему dbo.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID int NOT NULL
        REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
    LineNumber smallint NOT NULL,
    ProductID int NULL
        REFERENCES Production.Product(ProductID),
    UnitPrice money NULL,
    OrderQty smallint NULL,
    ReceivedQty float NULL,
    RejectedQty float NULL,
    DueDate datetime NULL,
    rowguid uniqueidentifier ROWGUIDCOL NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()),
    ModifiedDate datetime NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()),
    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. Создание таблицы со столбцом, приведенным к типу коллекции схем XML

В следующем примере создается таблица со столбцом xml, приведенным к типу коллекции схем XML HRResumeSchemaCollection. Ключевое слово DOCUMENT указывает, что каждый экземпляр типа данных xml в столбце column_name может содержать только один элемент верхнего уровня.

CREATE TABLE HumanResources.EmployeeResumes
(
    LName nvarchar(25),
    FName nvarchar(25),
    Resume xml(DOCUMENT HumanResources.HRResumeSchemaCollection)
);

H. Создание секционированной таблицы

В следующем примере создается функция секционирования для разделения таблицы или индекса на четыре секции. Затем создается схема секционирования, определяющая файловые группы, в которых содержится каждая из четырех секций. Наконец, создается таблица, использующая схему секционирования. В примере предполагается, что в базе данных уже существуют файловые группы.

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

Секции назначаются на основе столбца col1 таблицы PartitionTable следующими способами.

Файловая группа test1fg test2fg test3fg test4fg
Секция 1 2 3 4
Значения col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1,000 col1 > 1000

I. Использование типа данных UNIQUEIDENTIFIER в столбце

В следующем примере создается таблица со столбцом типа uniqueidentifier. В этом примере используется ограничение PRIMARY KEY для защиты таблицы от вставки пользователями повторяющихся значений, а также функция NEWSEQUENTIALID() в ограничении DEFAULT для указания значений для новых строк. К столбцу uniqueidentifier применяется свойство ROWGUIDCOL, чтобы на столбец можно было ссылаться с помощью ключевого слова $ROWGUID.

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

J. Использование выражения для вычисляемого столбца

В следующем примере показано использование выражения ((low + high)/2) для вычисления столбца myavg.

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

K. Создание вычисляемого столбца на основе столбца определяемого пользователем типа

В следующем примере создается таблица с одним столбцом, имеющим определяемый пользовательским тип utf8string, и предполагается, что как сборка, содержащая данный тип, так и сам тип, уже созданы в текущей базе данных. Второй столбец определяется на основе метода ToString() типа (класса) utf8string для вычисления значения столбца.utf8string

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

L. Использование функции USER_NAME для вычисляемого столбца

В следующем примере используется функция USER_NAME() в столбце myuser_name.

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

M. Создание таблицы со столбцом FILESTREAM

В следующем примере создается таблица со столбцом FILESTREAMPhoto. Если таблица содержит один или более столбцов FILESTREAM, она должна содержать столбец ROWGUIDCOL.

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

О. Создание таблицы, использующей сжатие строк

В следующем примере создается таблица, использующая сжатие строк.

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

Дополнительные примеры сжатия данных см. в разделе Сжатие данных.

O. Создание таблицы, использующей сжатие XML

Область применения: SQL Server 2022 (16.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

В следующем примере создается таблица, использующая сжатие XML.

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

P. Создание таблицы с разреженными столбцами и набором столбцов

В следующих примерах показано создание таблицы с разреженным столбцом и таблицы с двумя разреженными столбцами и набором столбцов. В примерах используется основной синтаксис. Более сложные примеры см. в разделе Использование разреженных столбцов и Использование наборов столбцов.

В следующем примере создается таблица с разреженным столбцом.

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

В этом примере создается таблица с двумя разреженными столбцами и набором столбцов с именем 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
);

В. Создание темпоральной таблицы на основе диска с системным управлением версиями

Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

В следующих примерах показано, как создать темпоральную таблицу, привязанную к новой таблице журнала, и как создать темпоральную таблицу, привязанную к существующей таблице журнала. Для темпоральной таблицы должен быть определен первичный ключ, чтобы включить системное управление версиями. Примеры добавления или удаления системного управления версиями в существующей таблице см. в главе Примеры в разделе "Системное управление версиями". Варианты использования описаны в разделе Темпоральные таблицы.

В этом примере создается новая темпоральная таблица, привязанная к новой таблице журнала.

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

В этом примере создается новая темпоральная таблица, привязанная к существующей таблице журнала.

-- 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. Создание оптимизированной для памяти темпоральной таблицы с системным управлением версиями

Область применения: SQL Server 2016 (13.x) и более поздние версии, а также База данных SQL Azure.

В следующем примере показано, как создать оптимизированную для памяти темпоральную таблицу с системным управлением версиями, привязанную к новой таблице журнала на диске.

В этом примере создается новая темпоральная таблица, привязанная к новой таблице журнала.

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

В этом примере создается новая темпоральная таблица, привязанная к существующей таблице журнала.

-- 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. Создание таблицы с зашифрованными столбцами

В следующем примере создается таблица с двумя зашифрованными столбцами. Дополнительные сведения см. в разделе Постоянное шифрование.

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. Создание встроенного фильтруемого индекса

В этом примере создается таблица со встроенным фильтруемым индексом.

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

Ф. Создание встроенного индекса

В приведенном ниже примере показано использование встроенного параметра NONCLUSTERED для дисковых таблиц.

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. Создание временной таблицы с анонимным составным первичным ключом.

В примере создается таблица с анонимным составным первичным ключом. Это полезно для предотвращения конфликтов во время выполнения, если две временные таблицы, областью действия которых являются сеансы (каждая в отдельном сеансе), используют одно и то же имя для ограничения.

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

Если вы явным образом именуете ограничение, во втором сеансе возникнет ошибка, например:

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.

Причина проблемы в том, что имя временной таблицы уникально, а имена ограничений — нет.

Ц. Использование глобальных временных таблиц в базе данных SQL Azure

Сеанс A создает глобальную временную таблицу ##test в базе данных SQL Azure testdb1 и добавляет одну  строку

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

Результирующий набор:

1253579504

Получаем имя глобальной временной таблицы для идентификатора объекта 1253579504 в tempdb (2)

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

Результирующий набор:

##test

Сеанс B подключается к базе данных SQL Azure testdb1 и может открыть таблицу ##test, созданную сеансом A

SELECT * FROM ##test;

Результирующий набор:

1, 1

Сеанс C подключается к другой базе данных SQL Azure testdb2 и хочет получить доступ к таблице ##test, созданной в базе данных testdb1. Это невозможно, поскольку глобальные временные таблицы существуют в области базы данных

SELECT * FROM ##test

В результате выдается следующая ошибка:

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

Обращение к системному объекту в базе данных SQL Azure tempdb из текущей базы данных пользователя testdb1

SELECT * FROM tempdb.sys.objects;
SELECT * FROM tempdb.sys.columns;
SELECT * FROM tempdb.sys.database_files;

.X Включение политики хранения данных в таблице

В следующем примере создается таблица с включенным хранением данных и периодом хранения, равным одной неделе. Этот пример применяется только к SQL Azure для пограничных вычислений.

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. Создание обновляемой таблицы реестра

В следующем примере создается обновляемая таблица реестра, которая не является темпоральной таблицей, с анонимной таблицей журнала (имя таблицы журнала система создает автоматически) и создаваемым именем представления реестра. Так как для обязательных столбцов GENERATED ALWAYS имена не указаны, и дополнительные столбцы в представлении реестра не определены, будут использоваться имена столбцов по умолчанию.

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

В следующем примере создается таблица, которая одновременно является темпоральной таблицей и обновляемой таблицей реестра, с анонимной таблицей журнала (имя для таблицы журнала система создает автоматически) и создаваемым именем представления реестра. Для столбцов GENERATED ALWAYS и дополнительных столбцов представления реестра используются имена по умолчанию.

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

В следующем примере создается таблица, которая одновременно является темпоральной таблицей и обновляемой таблицей реестра, с явно именованной таблицей журнала, заданными пользователем именами для столбцов GENERATED ALWAYS и дополнительными столбцами в представлении реестра.

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

В следующем примере создается таблица реестра только для добавления с созданными именами представления реестра и столбцами в представлении реестра.

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

В следующем примере создается база данных реестра в Базе данных SQL Azure и обновляемая таблица реестра с параметрами по умолчанию. Для создания обновляемой таблицы реестра в базе данных реестра не требуется использовать 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