CREATE TABLE (Transact-SQL)

適用于:SQL Server (所有支援的版本) Azure SQL Database Azure SQL 受控執行個體

在 SQL Server 和 Azure SQL Database 中建立新的資料表。

注意

如需 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
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( 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 } ] ) ]

}

注意

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

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 子句中,或任何能夠使用規則運算式的其他位置中,但下列狀況例外:

  • 計算資料行必須標示為 PERSISTED,才能參與 FOREIGN KEY 或 CHECK 條件約束。

  • 如果以決定性的運算式定義計算資料行的值,而且索引資料行允許結果的資料類型,則計算資料行可以用來做為索引的索引鍵資料行,或任何 PRIMARY KEY 或 UNIQUE 條件約束的一部分。

    例如,如果資料表具有整數資料行 ab ,則計算資料 a + b 行可能會編制索引,但計算 a + DATEPART(dd, GETDATE()) 資料行無法編制索引,因為該值可能會在後續調用中變更。

  • 計算資料行不能是 INSERT 或 UPDATE 語句的目標。

注意

對於計算資料行所涉及的資料行,資料表中的每個資料列都可能有不同的值;因此,每個資料列的計算資料行可能各有不同的值。

根據所使用的運算式,計算資料行的 Null 性是由 Database Engine 自動決定。 大部分運算式的結果都會視為可為 Null,即使只存在不可為 Null 的資料行也是如此,這是因為可能出現的反向溢位或溢位也會產生 NULL 結果。 請將 COLUMNPROPERTY 函式與 AllowsNull 屬性搭配使用,以調查資料表中任何計算資料行的 Null 屬性。 您可以利用 check_expression 常數來指定 ISNULL,便能將可為 Null 的運算式變成不可為 Null,其中常數是用來替代任何 NULL 結果的非 Null 值。 以 Common Language Runtime (CLR) 使用者定義型別運算式為基礎的計算資料行,需要類型的 REFERENCES 權限。

PERSISTED

指定SQL Server Database Engine 會在資料表中實際儲存計算值,並在更新計算資料行相依的任何其他資料行時更新值。 將計算資料行標示為 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_schemefilegrouppartition_scheme (反之亦然),則只會接受常數定義,其他一概予以忽略。

注意

在這個內容中,default 不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON "default"ON [default]。 如果 "default" 已指定 ,則 QUOTED_IDENTIFIER 目前會話的選項必須為 ON。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER

建立分割資料表之後,請考慮將資料表的 LOCK_ESCALATION 選項設定為 AUTO。 如此一來可以讓鎖定從資料表擴大至分割區 (HoBT) 階層,進而改善並行作業。 如需詳細資訊,請參閱 ALTER TABLE

TEXTIMAGE_ON { filegroup |「default」 }

指示 textntextimagexmlvarchar(max)nvarchar(max)varbinary(max) 及 CLR 使用者自訂類型資料行 (包含幾何及地理位置) ,儲存在指定的檔案群組。

TEXTIMAGE_ON 如果資料表中沒有大數值資料行,則不允許使用。 TEXTIMAGE_ON 如果指定 partition_scheme ,則無法指定 。 如果 "default" 指定 ,或 TEXTIMAGE_ON 完全未指定 ,則大型值資料行會儲存在預設檔案群組中。 後續無法改變在 中指定的 CREATE TABLE 任何大數值資料行資料的儲存。

注意

Varchar (max) Nvarchar (max) Varbinary (max) xml 和大型 UDT 值直接儲存在資料列中,最多限制為 8,000 個位元組,只要值符合記錄即可。 如果記錄無法容納值,便會將指標儲存在同資料列中,其餘部分會儲存在資料列外 (LOB 儲存空間中)。 0 是預設值,表示所有值都直接儲存在資料列中。

TEXTIMAGE_ON 只會變更「LOB 儲存空間」的位置,當資料儲存在資料列時,不會有任何的影響。 使用 sp_tableoption 的 large value types out of row 選項,以便將整個 LOB 值儲存到資料列外。

在這個內容中,default 不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 TEXTIMAGE_ON "default"TEXTIMAGE_ON [default]。 如果 "default" 已指定 ,則 QUOTED_IDENTIFIER 目前會話的選項必須為 ON。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER

FILESTREAM_ON { partition_scheme_name | 檔案群組|「default」 }

適用于:SQL Server 2008 R2 (10.50.x) 和更新版本。 Azure SQL 資料庫和Azure SQL 受控執行個體不支援 FILESTREAM

為 FILESTREAM 資料指定檔案群組。

如果資料表包含 FILESTREAM 資料且資料表已分割,則必須包含FILESTREAM_ON子句,而且必須指定 FILESTREAM 檔案群組的資料分割配置。 這個分割區配置必須與資料表的分割區配置使用相同的分割區函數和分割區資料行。否則,就會引發錯誤。

如果未分割資料表,則無法分割 FILESTREAM 資料行。 此資料表的 FILESTREAM 資料必須儲存在單一檔案群組內。 這個檔案群組是在 FILESTREAM_ON 子句中指定。

如果未分割資料表,而且 FILESTREAM_ON 未指定 子句,則會使用具有屬性集的 DEFAULT FILESTREAM 檔案群組。 如果沒有任何 FILESTREAM 檔案群組,就會引發錯誤。

如同 ON 和 TEXTIMAGE_ON ,使用 設定 FILESTREAM_ON 的值 CREATE TABLE 無法變更,但下列情況除外:

  • CREATE INDEX 陳述式會將堆積轉換成叢集索引。 在此情況中,您就可以指定不同的 FILESTREAM 檔案群組、分割區配置或 NULL。
  • DROP INDEX 陳述式會將叢集索引轉換成堆積。 在此情況下,可以指定不同的 FILESTREAM 檔案群組、分割區配置或 "default"

FILESTREAM_ON <filegroup> 子句中的檔案群組或在分割區配置中指定的每個 FILESTREAM 檔案群組都必須具有一個針對該檔案群組定義的檔案。 您必須使用 CREATE DATABASEALTER DATABASE 陳述式來定義這個檔案。否則,就會引發錯誤。

如需相關的 FILESTREAM 文章,請參閱 二進位大型物件 - Blob 資料

[ type_schema_name。 ] type_name

指定資料行的資料類型及其所屬的結構描述。 針對磁片資料表,請使用下列其中一種資料類型:

  • 系統資料類型
  • 根據SQL Server系統資料類型的別名類型。 別名資料類型是利用 CREATE TYPE 陳述式建立的,在這之後才能在資料表定義中使用它們。 在 CREATE TABLE 陳述式期間,可以覆寫別名資料類型的 NULL 或 NOT NULL 指派。 不過,長度規格無法變更;無法在 語句中 CREATE TABLE 指定別名資料類型的長度。
  • CLR 使用者定義型別。 CLR 使用者定義型別是利用 CREATE TYPE 陳述式來建立的,之後,才能在資料表定義中使用它們。 若要建立 CLR 使用者定義型別的資料行,便需要類型的 REFERENCES 權限。

如果未指定type_schema_name,SQL Server Database Engine 會依下列順序參考type_name

  • SQL Server系統資料類型。
  • 目前資料庫中之目前使用者的預設結構描述。
  • dbo目前資料庫中的架構。

如需了解記憶體最佳化資料表,請參閱記憶體中 OLTP 支援的資料類型,以取得支援的系統類型清單。

  • 有效位數

    所指定資料類型的有效位數。 如需有關有效位數值的詳細資訊,請參閱有效位數、小數位數和長度

  • scale

    所指定資料類型的小數位數。 如需有關有效小數位數值的詳細資訊,請參閱有效位數、小數位數和長度

  • max

    只適用於 varcharnvarcharvarbinary 資料類型,可用來儲存 2^31-1 位元組的字元和二進位資料以及 2^30 位元組的 Unicode 資料。

CONTENT

指定 column_namexml 資料類型的每個執行個體都可以包含多個最上層元素。 CONTENT 只適用於 xml 資料類型,而且只有在同時指定 xml_schema_collection 時,才能指定。 若未指定,CONTENT 便是預設行為。

DOCUMENT

指定 column_namexml 資料類型的每個執行個體只可以包含單一最上層元素。 DOCUMENT 只適用於 xml 資料類型,而且只有在同時指定 xml_schema_collection 時,才能指定。

xml_schema_collection

只適用於 xml 資料類型,以便將 XML 結構描述集合與類型產生關聯。 在結構描述中鍵入 xml 資料行之前,必須先使用 CREATE XML SCHEMA COLLECTION,在資料庫中建立結構描述。

DEFAULT

指定插入期間未明確提供值時,為數據行提供的值。 除了定義為 timestamp 或含有 IDENTITY 屬性的資料行之外,任何資料行都可以套用 DEFAULT 定義。 如果使用者定義的類型資料行指定了預設值,該類型應該支援將 constant_expression 隱含地轉換成使用者定義的類型。 當卸除資料表時,便會移除 DEFAULT 定義。 預設值只能使用常數值 (例如字元字串)、純量函數 (系統函數、使用者自訂函數或 CLR 函數) 或 NULL。 若要維持與舊版SQL Server的相容性,可以將條件約束名稱指派給 DEFAULT。

  • constant_expression

    常數、Null 或系統函式,做為資料行的預設值。

  • memory_optimized_constant_expression

    常數、Null 或系統函式,用於做為資料行的預設值。 必須在原生編譯的預存程序中受到支援。 如需原生編譯預存程序中的內建函數詳細資訊,請參閱原生編譯的 T-SQL 模組支援的功能

IDENTITY

指出新資料行是識別欄位。 將新資料列加入資料表時,Database Engine 會為數據行提供唯一的累加值。 識別欄位通常用來搭配 PRIMARY KEY 條件約束一起使用,做為資料表的唯一資料列識別碼。 屬性 IDENTITY 可以指派給 TinyintSmallintintBigintdecimal (p、0) numeric (p、0) 資料行。 每份資料表都只能建立一個識別欄位。 系結預設值和 DEFAULT 條件約束不能與識別資料行搭配使用。 您必須同時指定種子和遞增,或同時不指定這兩者。 如果同時不指定這兩者,預設值便是 (1,1)。

  • seed

    值,用於載入資料表的第一個資料列。

  • increment

    已載入前一個資料列之識別值的累加值。

NOT FOR REPLICATION

CREATE TABLE 陳述式中,可以為 IDENTITY 屬性、FOREIGN KEY 條件約束和 CHECK 條件約束指定 NOT FOR REPLICATION 子句。 如果為 IDENTITY 屬性指定這個子句,當複寫代理程式執行插入時,不會在識別資料行中遞增值。 如果為條件約束指定這個子句,則複寫代理程式執行插入、更新或刪除作業時,不會強制執行條件約束。

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

適用于:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL Database。

指定系統用來自動記錄資料表中資料列版本及其歷程記錄資料表的資訊, (如果資料表已設定系統版本,且具有記錄資料表) 。 搭配 參數使用此 WITH SYSTEM_VERSIONING = ON 引數來建立系統版本資料表:時態表或總帳資料表。 如需詳細資訊,請參閱 可更新的總帳資料表時態表

參數 必要資料類型 必要可為 Null 描述
ROW datetime2 開始: NOT NULL
結束: NOT NULL
資料列版本的開始時間 (START) 或資料列版本有效之結束時間 (END) 。 使用這個引數搭配 PERIOD FOR SYSTEM_TIME 引數來建立時態表。
TRANSACTION_ID BIGINT 開始: NOT NULL
結束: NULL
適用于:SQL Server 2022 (16.x) 和更新版本,以及 Azure SQL Database。

建立 (START) 或 (END) 資料列版本的交易識別碼。 如果資料表是總帳資料表,識別碼會參考 sys.database_ledger_transactions 檢視中的資料列
SEQUENCE_NUMBER BIGINT 開始: NOT NULL
結束: NULL
適用于:SQL Server 2022 (16.x) 和更新版本,以及 Azure SQL Database。

建立 (START) 或刪除 (END) 資料列版本的作業序號。 此值在交易內是唯一的。

如果您嘗試指定不符合上述資料類型或可為 Null 功能需求的資料行,系統將會擲回錯誤。 如果您未明確指定可為 Null,系統會根據上述需求來定義資料 NOT NULLNULL

您可以使用 旗標標記一或兩個句點 HIDDEN 資料行,以隱含隱藏這些資料行, SELECT * FROM <table> 這樣不會傳回這些資料行的值。 根據預設,不會隱藏期間資料行。 為了方便我們使用,隱藏的資料行必須明確包含在所有會直接參考時態表的查詢中。 若要變更 HIDDEN 現有期間資料行的屬性, PERIOD 必須卸載並使用不同的隱藏旗標重新建立。

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

適用于:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL Database。

指定要在資料表上建立索引。 這可以是叢集的索引或非叢集索引。 索引將包含列示的資料行,並會以遞增或遞減順序來排序資料。

INDEX index_name CLUSTERED COLUMNSTORE

適用于:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL Database。

指定要以單欄式格式來儲存整個資料表並具有叢集資料行存放區索引。 這一律會包含資料表中的所有資料行。 資料不會依字母順序或數值順序排序,因為資料列會組織為取得資料行存放區壓縮優點。

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

適用于:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL Database。

指定要在資料表上建立非叢集資料行存放區索引。 基礎資料表可以是資料列存放區堆積或叢集索引,或非叢集資料行存放區索引。 在所有情況下,在資料表上建立非叢集資料行存放區索引時,會將資料行的第二個資料複本儲存至索引。

非叢集資料行存放區索引會當作是叢集資料行存放區索引來加以排序和管理。 因為資料行可能會受到限制,而且以次要索引的形式存在於資料表上,因此被稱為非叢集資料行存放區索引。

ON partition_scheme_name ( column_name )

指定分割區配置來定義要做為分割區索引之分割區對應目標的檔案群組。 透過執行 CREATE PARTITION SCHEMEALTER PARTITION SCHEME,讓資料分割配置一定會存在於資料庫內。 column_name 會指定資料分割索引將進行分割的資料行。 此資料行必須符合 partition_scheme_name 所使用資料分割函數引數的資料類型、長度與有效位數。 column_name 不限於索引定義中的資料行。 可以指定基底資料表中的任何資料行,但有個例外是,在分割 UNIQUE 索引時,必須從用來作為唯一索引鍵使用的資料行中選擇 column_name。 此限制可讓 Database Engine 僅驗證單一資料分割內索引鍵值的唯一性。

注意

當您分割非唯一的叢集索引時,如果尚未指定,則 Database Engine 預設會將資料分割資料行新增至叢集索引鍵清單。 當分割非唯一的非叢集索引時,如果尚未指定資料分割資料行,Database Engine 會將資料分割資料行新增為非索引鍵 (包含) 資料行。

如果未指定 partition_scheme_name檔案群組 ,而且資料表已分割,則索引會使用與基礎資料表相同的分割資料行,放在相同的資料分割配置中。

注意

您無法在 XML 索引上指定分割區配置。 如果基底資料表已分割,XML 索引會使用與資料表相同的分割區配置。

如需分割索引的詳細資訊,請參閱資料分割資料表與索引

ON filegroup_name

在指定的檔案群組上建立指定的索引。 如果未指定任何位置,而且資料表或檢視表未分割,索引會使用與基礎資料表或檢視相同的檔案群組。 此檔案群組必須已存在。

ON "default"

在預設的檔案群組上建立指定的索引。

注意

在這個內容中,default 不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON "default"ON [default]。 如果 "default" 已指定,則目前 QUOTED_IDENTIFIER 會話的選項必須為 ON。 這是預設值。 如需詳細資訊,請參閱 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 DATABASEALTER DATABASE 陳述式針對此檔案群組定義的檔案,否則會引發錯誤。

如果資料表已分割, FILESTREAM_ON 則必須包含 子句,而且必須指定 FILESTREAM 檔案群組的資料分割配置,其使用與資料表的資料分割配置相同的資料分割函數和資料分割資料行。 否則,就會引發錯誤。

如果未分割資料表,則無法分割 FILESTREAM 資料行。 此資料表的 FILESTREAM 資料必須儲存在 FILESTREAM_ON 子句中指定的單一檔案群組內。

FILESTREAM_ON NULL 如果要建立叢集索引,而且資料表不包含 FILESTREAM 資料行,可以在 語句中 CREATE INDEX 指定。

如需詳細資訊,請參閱 FILESTREAM

ROWGUIDCOL

指出新資料行是一個資料列 GUID 資料行。 每個資料表只能有一個 uniqueidentifier 資料行指定為 ROWGUIDCOL 資料行。 套用 ROWGUIDCOL 屬性後,便可以使用 $ROWGUID 來參考資料行。 ROWGUIDCOL 屬性只能指派給 uniqueidentifier 資料行。 無法使用 ROWGUIDCOL 來指定使用者定義的資料類型資料行。

ROWGUIDCOL 屬性不會強制執行資料行中所儲存值的唯一性。 ROWGUIDCOL 也不會自動為插入資料表的新資料列產生值。 若要產生每個資料行的唯一值,請在 INSERT 陳述式上使用 NEWIDNEWSEQUENTIALID 函數,或利用這些函數當做資料行的預設值。

ENCRYPTED WITH

指定使用 Always Encrypted 功能來加密資料行。

  • COLUMN_ENCRYPTION_KEY = key_name

    指定資料行加密金鑰。 如需詳細資訊,請參閱 CREATE COLUMN ENCRYPTION KEY

  • 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) BLOB 資料。

此資料表也必須要有具有 ROWGUIDCOL 屬性之 uniqueidentifier 資料類型的資料行。 這個資料行不能允許 null 值,且必須具有 UNIQUE 或 PRIMARY KEY 單一資料行條件約束。 資料行的 GUID 值必須在插入資料時由應用程式提供,或是由使用 NEWID () 函數的 DEFAULT 條件約束所提供。

無法卸載 ROWGUIDCOL 資料行,而且有針對資料表定義的 FILESTREAM 資料行時,無法變更相關的條件約束。 只有當最後一個 FILESTREAM 資料行卸除之後,才可卸除 ROWGUIDCOL 資料行。

當有針對資料行指定 FILESTREAM 儲存屬性時,該資料行的所有值都會儲存在檔案系統的 FILESTREAM 資料容器內。

COLLATE collation_name

指定資料行的定序。 定序名稱可以是 Windows 定序名稱,也可以是 SQL 定序名稱。 collation_name 僅適用於 charvarchartextncharnvarcharntext 資料類型的資料行。 若未指定,當資料行是使用者自訂資料類型時,便會將使用者自訂資料類型的定序指派給這個資料行,否則,便會指派資料庫的預設定序。

如需有關 Windows 和 SQL 定序名稱的詳細資訊,請參閱 Windows 定序名稱SQL 定序名稱

如需詳細資訊,請參閱 COLLATE

CONSTRAINT

選擇性關鍵字,表示 PRIMARY KEY、NOT Null、UNIQUE、FOREIGN KEY 或 CHECK 條件約束的定義開頭。

  • constraint_name

    條件約束的名稱。 在資料表所屬的結構描述內,條件約束名稱必須是唯一的。

  • NULL | NOT NULL

    決定資料行中是否允許使用 NULL 值。 Null 不是嚴格限制式,但可以指定,就像 NOT Null 一樣。 只有在也指定了 PERSISTED 時,計算資料行才能指定 NOT NULL。

  • PRIMARY KEY

    條件約束,可透過唯一索引強制執行指定資料行或資料行的實體完整性。 每份資料表都只能建立一個 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

    Database Engine 會引發錯誤,並回復父資料表中資料列上的刪除動作。

  • CASCADE

    如果從父資料表中刪除資料列,便會從進行參考的資料表中刪除對應的資料列。

  • SET NULL

    如果刪除父資料表中對應的資料列,所有組成外部索引鍵的值都會設為 NULL。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。

  • SET DEFAULT

    如果刪除父資料表中對應的資料列,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果有可為 Null 的資料行,但沒有設定明確的預設值,NULL 便成為這個資料行的隱含預設值。

    如果資料表將包含在使用邏輯記錄的合併式發行集中,請勿指定 CASCADE。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更

    ON DELETE CASCADE 如果 INSTEAD OF 資料表上已有觸發程式 ON DELETE ,則無法定義。

    例如,在 AdventureWorks2019 資料庫中, ProductVendor 資料表與資料表具有引用關聯性 Vendor 。 外 ProductVendor.BusinessEntityID 鍵會參考 Vendor.BusinessEntityID 主鍵。

    DELETE如果語句是在資料表中的資料 Vendor 列上執行,而且 ON DELETE CASCADE 已針對 ProductVendor.BusinessEntityID 指定動作,則 Database Engine 會檢查資料表中的 ProductVendor 一或多個相依資料列。 如果有的話,就會刪除資料表中的 ProductVendor 相依資料列,以及資料表中所參考的資料 Vendor 列。

    相反地,如果 NO ACTION 已指定 ,Database Engine 就會引發錯誤,如果資料表中 ProductVendor 至少有一個參考該資料列的資料列,則會回復資料列上的 Vendor 刪除動作。

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

    指定當變更的資料表中之資料列有參考關聯性,且在父資料表中所參考的資料列有了更新時,變更的資料表中之資料列會發生什麼動作。 預設值是 NO ACTION。

  • NO ACTION

    Database Engine 會引發錯誤,並回復父資料表中資料列的更新動作。

  • CASCADE

    當父資料表中的資料列有了更新時,在進行參考的資料表中,也會更新對應的資料列。

  • SET NULL

    當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為 NULL。 若要執行這個條件約束,外部索引鍵資料行必須可為 Null。

  • SET DEFAULT

    當更新父資料表中對應的資料列時,所有組成外部索引鍵的值都會設為預設值。 若要執行這個條件約束,所有外部索引鍵資料行都必須有預設定義。 如果有可為 Null 的資料行,但沒有設定明確的預設值,NULL 便成為這個資料行的隱含預設值。

    請勿指定 CASCADE 資料表是否包含在使用邏輯記錄的合併式發行集中。 如需邏輯記錄的詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更

    ON UPDATE CASCADESET NULL如果 INSTEAD OF 已改變的資料表上已有觸發程式 ON UPDATE ,則無法定義 、 或 SET DEFAULT

    例如,在 AdventureWorks2019 資料庫中, ProductVendor 資料表具有與 Vendor 資料表的引用關聯性: ProductVendor.BusinessEntity 外鍵會參考 Vendor.BusinessEntityID 主鍵。

    如果在資料表中的資料 Vendor 列上執行 UPDATE 語句,且已針對 ProductVendor.BusinessEntityID 指定 ON UPDATE CASCADE 動作,Database Engine 會檢查資料表中的 ProductVendor 一或多個相依資料列。 如果有的話,資料表中的 ProductVendor 相依資料列會更新,也會更新資料表中參考的資料 Vendor 列。

    相反地,如果指定 NO ACTION,Database Engine 就會引發錯誤,如果資料表中至少有一個參考該動作的資料列,則會回復資料列上的 VendorProductVendor 更新動作。

  • CHECK

    限制式,藉由限制可以輸入到資料行或資料行的可能值,來強制執行定義域完整性。 計算資料行的 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

    指定 Database Engine 應該如何建立用來儲存索引資料的每個索引頁面。 使用者指定的 fillfactor 可以是從 1 到 100 的值。 如果未指定值,則預設值為 0。 填滿因數值 0 和 100 在各方面都是一樣的。

    重要

    為了與舊版相容,我們保持將 WITH FILLFACTOR = fillfactor 記載為適用於 PRIMARY KEY 或 UNIQUE 條件約束的唯一索引選項,但未來版本的文件不會再依照這個方式來說明。

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

資料行集的名稱。 資料行集是不具類型的 XML 表示,可將資料表的所有疏鬆資料行結合到結構化輸出中。 如需資料行集的詳細資訊,請參閱 使用資料行集

system_start_time_column_name SYSTEM_TIME (期間,system_end_time_column_name )

適用于:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL Database。

指定資料行的名稱,系統會使用這個資料行來記載某一筆記錄的有效期。 搭配 和 WITH SYSTEM_VERSIONING = ON 引數使用此引數 GENERATED ALWAYS AS ROW { START | END } 來建立時態表。 如需相關資訊,請參閱 Temporal Tables

COMPRESSION_DELAY

適用于:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL Database。

為了記憶體最佳化,延遲會指定資料列在資料表中至少要保持不變多少分鐘;等過了這段時間後,就可以將它壓縮到資料行存放區索引。 SQL Server 會根據上次更新時來選取要壓縮的具體資料列。 例如,如果資料列要在兩小時的時間內頻繁變更,您可以設定 COMPRESSION_DELAY = 120 Minutes,以確保在 SQL Server 壓縮資料列之前,會先完成更新。

至於磁碟資料表,延遲會指定關閉 狀態下的差異資料列群組,必須在差異資料列群組中至少保留多少分鐘的時間,然後 SQL Server 才能將它壓縮到壓縮的資料列群組。 因為磁碟資料表不會追蹤個別資料列的插入和更新時間,因此 SQL Server 會將這段延遲時間套用於關閉狀態下的差異資料列群組。

預設值是 0 分鐘。

如需何時使用 COMPRESSION_DELAY 的建議,請參閱 開始使用資料行存放區以進行即時作業分析

<>table_option ::=

指定一個或多個資料表選項。

DATA_COMPRESSION

針對指定的資料表、分割區編號或分割區範圍指定資料壓縮選項。 選項如下:

  • 不會壓縮資料表或指定的資料分割。

  • ROW

    使用資料列壓縮來壓縮資料表或指定的分割區。

  • PAGE

    使用頁面壓縮來壓縮資料表或指定的分割區。

  • COLUMNSTORE

    適用于:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL Database。

    只適用於資料行存放區索引,包括非叢集資料行存放區索引和叢集資料行存放區索引。 COLUMNSTORE 會指定要利用最高效能的資料行存放區壓縮方式來進行壓縮。 這是典型的選擇。

  • COLUMNSTORE_ARCHIVE

    適用于:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL Database。

    只適用於資料行存放區索引,包括非叢集資料行存放區索引和叢集資料行存放區索引。 COLUMNSTORE_ARCHIVE 將進一步將資料表或分割區壓縮成較小的大小。 這可用於封存,或是其他需要較小儲存體,而且可負擔更多時間來儲存和擷取的狀況。

如需詳細資訊,請參閱 Data Compression

XML_COMPRESSION

適用于:SQL Server 2022 (16.x) 及更新版本,以及 Azure SQL Database Preview。

指定資料表中任何 xml 資料類型資料行的 XML 壓縮選項。 選項如下:

  • 開啟

    使用 xml 資料類型的資料行會壓縮。

  • OFF

    不會壓縮使用 xml 資料類型的資料行。

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

指定 或 XML_COMPRESSION 設定套用至其中的 DATA_COMPRESSION 分割區。 如果未分割資料表,自 ON PARTITIONS 變數將會產生錯誤。 ON PARTITIONS如果未提供 子句, DATA_COMPRESSION 此選項會套用至分割資料表的所有分割區。

注意

XML_COMPRESSION僅適用于從 2022 SQL Server 2022 (16.x) 開始,以及 Azure SQL Database Preview。

可以使用以下方式來指定 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 > ::=

指定一個或多個索引選項。 如需這些選項的完整描述,請參閱 CREATE INDEX

PAD_INDEX = { ON | OFF }

當設為 ON 時,便會在索引的中繼層級頁面上,套用 FILLFACTOR 所指定的可用空間百分比。 當設為 OFF 或未指定 FILLFACTOR 值時,考慮到中繼頁面的各組索引鍵,中繼層級頁面容量的填滿程度,會保留至少足以容納一個資料列的空間,且資料列是索引所能擁有的大小上限。 預設值為 OFF。

FILLFACTOR = fillfactor

指定百分比,指出 Database Engine 在建立或變更索引期間,應該如何讓每個索引頁面的分葉層級。 fillfactor 必須是 1 到 100 之間的整數值。 預設值是 0。 填滿因數值 0 和 100 在各方面都是一樣的。

IGNORE_DUP_KEY = { ON | OFF }

指定當插入作業嘗試將重複的索引鍵值插入唯一索引時所產生的錯誤回應。 IGNORE_DUP_KEY 選項只適用於在建立或重建索引之後所發生的插入作業。 執行 CREATE INDEXALTER INDEXUPDATE 時,這個選項沒有任何作用。 預設值為 OFF。

  • 開啟

    當重複的索引鍵值插入唯一索引時,就會出現警告訊息。 只有違反唯一性條件約束的資料列才會失敗。

  • OFF

    當重複的索引鍵值插入唯一索引時,就會出現錯誤訊息。 整個 INSERT 作業將會回復。

IGNORE_DUP_KEY 無法在檢視表、非唯一索引、XML 索引、空間索引和篩選索引上建立的索引設定為 ON。

若要檢視 IGNORE_DUP_KEY,請使用 sys.indexes

在與舊版本相容的語法中,WITH IGNORE_DUP_KEY 相當於 WITH IGNORE_DUP_KEY = ON

STATISTICS_NORECOMPUTE = { ON | OFF }

當開啟時,不會自動重新計算過期的索引統計資料。 當設為 OFF 時,便會啟用統計資料的自動更新。 預設值為 OFF。

ALLOW_ROW_LOCKS = { ON | OFF }

當設為 ON 時,在您存取索引時,允許資料列鎖定。 Database Engine 會決定何時使用資料列鎖定。 當關閉時,不會使用資料列鎖定。 預設值是 ON。

ALLOW_PAGE_LOCKS = { ON | OFF }

當設為 ON 時,在您存取索引時,允許頁面鎖定。 Database Engine 會決定何時使用頁面鎖定。 當關閉時,不會使用頁面鎖定。 預設值是 ON。

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

適用于:SQL Server 2019 (15.x) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

指定是否要最佳化最後一頁的插入競爭。 預設值為 OFF。 請參閱 CREATE INDEX 頁面的循序索引鍵一節以取得詳細資訊。

FILETABLE_DIRECTORY = directory_name

適用于:SQL Server 2012 (11.x) 和更新版本。

指定 Windows 相容的 FileTable 目錄名稱。 在資料庫的所有 FileTable 目錄名稱之間,此名稱必須是唯一的。 無論定序設定為何,唯一性比較皆不會區分大小寫。 如果未指定此值,則會使用 FileTable 的名稱。

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

適用于:SQL Server 2012 (11.x) 和更新版本。 Azure SQL 資料庫和Azure SQL 受控執行個體不支援 FILETABLE

指定要套用至 Name FileTable 中資料行的定序名稱。 定序必須不區分大小寫,以符合 Windows 作業系統檔案命名語義。 如果未指定此值,則會使用資料庫預設定序。 如果資料庫預設定序區分大小寫,就會引發錯誤,而 CREATE TABLE 作業會失敗。

  • collation_name

    不區分大小寫的定序名稱。

  • database_default

    指定所要使用的資料庫預設定序。 此定序不可區分大小寫。

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

適用于:SQL Server 2012 (11.x) 和更新版本。 Azure SQL 資料庫和Azure SQL 受控執行個體不支援 FILETABLE

指定在 FileTable 上自動建立的主索引鍵條件約束所要使用的名稱。 如果未指定此值,系統會產生條件約束的名稱。

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

適用于:SQL Server 2012 (11.x) 和更新版本。 Azure SQL 資料庫和Azure SQL 受控執行個體不支援 FILETABLE

指定當系統在 FileTable 的 stream_id 資料行上,自動建立唯一條件約束時,所要使用的名稱。 如果未指定此值,系統會產生條件約束的名稱。

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

適用于:SQL Server 2012 (11.x) 和更新版本。 Azure SQL 資料庫和Azure SQL 受控執行個體不支援 FILETABLE

指定當系統在 FileTable 的 parent_path_locatorname 資料行上,自動建立唯一條件約束時,所要使用的名稱。 如果未指定此值,系統會產生條件約束的名稱。

SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_namehistory_table_name [ , DATA_CONSISTENCY_CHECK = { ON |OFF } ] ) ]

適用于:SQL Server 2016 (13.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

如果符合資料類型、 可 Null 性條件約束和主索引鍵條件約束需求,就會啟用資料表的系統版本設定。 系統會在個別記錄資料表中,記錄系統版本設定資料表中每個記錄的歷程記錄。 如果未使用自 HISTORY_TABLE 變數,此記錄資料表的名稱將會是 MSSQL_TemporalHistoryFor<primary_table_object_id> 。 若在建立歷程記錄資料表時指定歷程記錄資料表名稱,則您必須指定結構描述和資料表名稱。

如果歷程記錄資料表不存在,系統會產生符合目前資料表之檔案群組中目前資料表架構的新歷程記錄資料表,並建立兩個數據表之間的連結,並讓系統記錄資料表中目前資料表中的每個記錄。 根據預設,記錄資料表會 PAGE 壓縮。

如果使用 HISTORY_TABLE 引數來建立連結,並使用現有的記錄資料表,則會在目前的資料表和指定的資料表之間建立連結。 如果目前資料表已分割,則會在預設檔案群組上建立歷程記錄資料表,因為資料分割組態不會自動從目前資料表複寫到記錄資料表。 建立現有記錄資料表的連結時,您可以選擇執行資料一致性檢查。 這個資料一致性檢查可確保現有的記錄不會重疊。 預設執行資料一致性檢查。

搭配 和 GENERATED ALWAYS AS ROW { START | END } 引數使用此引數 PERIOD FOR SYSTEM_TIME ,在資料表上啟用系統版本設定。 如需相關資訊,請參閱 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 在 2022 SQL Server 2022 (16.x) 中已被取代。 未來的 Microsoft SQL Server 版本將移除這項功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

啟用資料表的 Stretch Database

當您透過指定 ON 來啟用資料表的 Stretch 時,您可以選擇性指定 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) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

  • 指定 OUTBOUND 將資料從 SQL Server 移轉至 Azure SQL Database。

  • 指定 INBOUND 將資料表的遠端資料從 Azure SQL Database 複製到SQL Server,並停用資料表的 Stretch。 如需詳細資訊,請參閱 停用 Stretch Database 並帶回遠端資料

    這項操作會產生資料傳輸成本,且無法取消。

  • 指定 PAUSED 以暫停或延後資料移轉。 如需詳細資訊,請參閱暫停和繼續資料移轉 - Stretch Database

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

適用範圍: 「僅限」Azure SQL Edge

根據資料庫內的資料表,啟用保留原則式清除舊的或過時資料。 如需詳細資訊,請參閱 啟用和停用資料保留。 必須指定下列參數才能啟用資料保留。

  • 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) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。 Azure SQL 受控執行個體不支援常規用途層中的記憶體優化資料表。

值為 ON 時,會指出資料表為記憶體最佳化。 記憶體優化資料表是In-Memory OLTP 功能的一部分,可用來優化交易處理的效能。 若要開始使用記憶體內部 OLTP,請參閱快速入門 1:可讓 Transact-SQL 擁有更快效能的記憶體內部 OLTP 技術。 如需記憶體優化資料表的詳細資訊,請參閱 記憶體優化資料表

預設值 OFF 表示資料表是以磁碟為基礎。

DURABILITY

適用于:SQL Server 2014 (12.x) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

若值為 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) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

指出應該在雜湊索引中建立的貯體數目。 雜湊索引中 BUCKET_COUNT 的最大值是 1,073,741,824。 如需貯體計數的詳細資訊,請參閱經記憶體最佳化之資料表上的索引

Bucket_count 是必要的引數。

INDEX

適用于:SQL Server 2014 (12.x) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

您必須指定資料行和資料表索引,作為 CREATE TABLE 陳述式的一部分。 如需在記憶體優化資料表上新增和移除索引的詳細資訊,請參閱 改變Memory-Optimized資料表

  • HASH

    適用于:SQL Server 2014 (12.x) 及更新版本、Azure SQL Database 和 Azure SQL 受控執行個體。

    表示已建立雜湊索引。

    只有記憶體最佳化資料表才支援雜湊索引。

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

適用于:SQL Server 2022 (16.x) ,Azure SQL Database。

注意

如果語句建立總帳資料表, ENABLE LEDGER 則需要許可權。

指出所建立的資料表是否為 ON) (總帳資料表 (OFF) 。 預設值為 OFF。 APPEND_ONLY = ON如果指定選項,系統會建立只允許插入新資料列的僅附加總帳資料表。 否則,系統會建立可更新的總帳資料表。 可更新的總帳資料表也需要 SYSTEM_VERSIONING = ON 引數。 可更新的總帳資料表也必須是系統版本的資料表。 不過,可更新的總帳資料表不需要是時態表, (不需要 PERIOD FOR SYSTEM_TIME 參數) 。 如果使用 和 SYSTEM_VERSIONING = ON 指定 LEDGER = 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

如果語句中 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) 。 如果具有指定或產生名稱的檢視存在,系統會引發錯誤。 如果資料表是可更新的總帳資料表,則總帳檢視會在資料表及其歷程記錄資料表上建立為聯集。

總帳檢視中的每個資料列都代表在總帳資料表中建立或刪除資料列版本。 總帳檢視包含總帳資料表的所有資料行,但上述產生的一律資料行除外。 總帳檢視也包含下列其他資料行:

資料行名稱 資料類型 描述
使用 TRANSACTION_ID_COLUMN_NAME 選項指定。 ledger_transaction_id 如果未指定,則為 。 BIGINT 建立或刪除資料列版本的交易 ID。
使用 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) 包含 INSERTDELETE。 如需詳細資訊,請參閱上方。

包含建立總帳資料表的交易會在 sys.database_ledger_transactions中擷取。

<> ledger_option ::=

指定總帳選項。

[ LEDGER_VIEW = schema_nameledger_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 語句會使用針對 語句中 CREATE TABLEtable_name指定的值來參考臨時表,例如:

CREATE TABLE #MyTempTable (
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

如果在單一預存程序或批次內,建立了多個暫存資料表,它們必須有不同的名稱。

如果您在建立或存取站存資料表時加入了 schema_name,系統會予以忽略。 所有暫存資料表都會建立在 dbo 結構描述中。

如果本機臨時表是在預存程式或應用程式中建立,而該應用程式可以同時由數個會話執行,Database Engine 必須能夠區分不同會話所建立的資料表。 Database Engine 會在內部將數值尾碼附加至每個本機臨時表名稱,以執行此動作。 中儲存在 資料表 tempdb 中的 sys.sysobjects 臨時表完整名稱是由 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 條件約束中無法參考臨時表。

如果您使用具名條件約束來建立暫存資料表,而且在使用者定義交易的範圍內建立此暫存資料表,則一次只有一位使用者能夠執行建立暫存資料表的陳述式。 例如,如果預存程式建立具有具名主鍵條件約束的臨時表,則多個使用者無法同時執行預存程式。

限定資料庫範圍的全域暫存資料表 (Azure SQL Database)

以 ## 資料表) 名稱起始SQL Server (的全域臨時表會儲存在 中 tempdb ,並在整個 SQL Server 實例的所有使用者會話之間共用。 如需 SQL 資料表型別的相關資訊,請參閱上述的「建立資料表」相關章節。

Azure SQL Database 支援同時儲存在 tempdb 資料庫層級並設定為範圍的全域臨時表。 這表示全域臨時表會針對相同 Azure SQL Database 內的所有使用者會話共用。 來自其他資料庫的使用者會話無法存取全域臨時表。

Azure SQL 資料庫的全域臨時表遵循SQL Server用於臨時表的相同語法和語意。 同樣地,全域暫存程式也會限定在 Azure SQL Database 中的資料庫層級。 本機暫存資料表 (資料表名稱是 #) 也支援 Azure SQL Database,並採用和 SQL Server 相同的語法和語意。 請參閱上述的 暫存資料表相關章節。

重要

此功能適用于 Azure SQL Database。

針對 Azure SQL Database 的全域臨時表進行疑難排解

如需疑難排解 tempdb ,請參閱 如何監視 tempdb 的使用方式。

注意

只有伺服器管理員可以存取 Azure SQL 資料庫中的疑難排解 DMV。

權限

任何使用者都可以建立全域暫存物件。 除非收到其他權限,否則使用者只能存取自己的物件。

資料分割資料表

在利用 CREATE TABLE 來建立分割區資料表之前,您必須先建立一個分割區函數來指定資料表分割區的方式。 資料分割函數是使用 CREATE PARTITION FUNCTION 建立的。 其次,您必須建立一個分割區配置來指定保留分割區函數所指示之分割區的檔案群組。 分割區配置是使用 CREATE PARTITION SCHEME 建立的。 無法為分割資料表指定將 PRIMARY KEY 或 UNIQUE 條件約束放置至個別檔案群組。 如需詳細資訊,請參閱< Partitioned Tables and Indexes>。

PRIMARY KEY 條件約束

  • 一份資料表只能有一個 PRIMARY KEY 條件約束。

  • PRIMARY KEY 條件約束所產生的索引不會導致資料表上的索引數目超過 999 個非叢集索引和 1 個叢集索引。

  • 如果未針對 PRIMARY KEY 條件約束指定 CLUSTERED 或 NONCLUSTERED,則如果沒有針對 UNIQUE 條件約束指定叢集索引,則會使用 CLUSTERED。

  • PRIMARY KEY 條件約束內所定義的所有資料行,都必須定義成 NOT NULL。 如果未指定 Null 屬性,參與 PRIMARY KEY 條件約束的所有資料行都會將其 Null 屬性設定為 NOT Null。

    注意

    對於記憶體優化資料表,允許可為 Null 的索引鍵資料行。

  • 如果在 CLR 使用者定義的類型資料行上定義主索引鍵,類型的實作必須支援二進位排序。 如需詳細資訊,請參閱 CLR 使用者定義型別

UNIQUE 條件約束

  • 如果未指定 UNIQUE 條件約束的 CLUSTERED 或 NONCLUSTERED,預設會使用 NONCLUSTERED。
  • 每個 UNIQUE 條件約束都會產生一個索引。 UNIQUE 條件約束的數目無法造成資料表上的索引數目超過 999 個非叢集索引和 1 個叢集索引。
  • 如果在 CLR 使用者定義型別資料行上定義唯一條件約束,類型的實作必須支援二進位順序或以運算子為基礎的順序。 如需詳細資訊,請參閱 CLR 使用者定義型別

FOREIGN KEY 條件約束

  • 在 FOREIGN KEY 條件約束的資料行中輸入 NULL 以外的值時,值必須在參考的資料行中;否則,系統會傳回外部索引鍵違規錯誤訊息。

  • 除非您也指定了來源資料行,否則,FOREIGN KEY 條件約束會套用在前面的資料行。

  • FOREIGN KEY 條件約束只能參考在相同伺服器之相同資料庫內的資料表。 跨資料庫參考完整性必須利用觸發程序來實作。 如需詳細資訊,請參閱 CREATE TRIGGER

  • FOREIGN KEY 條件約束可以參考相同資料表中的另一個資料行。 這稱為自我參考。

  • 資料行層級 FOREIGN KEY 條件約束的 REFERENCES 子句只能列出一個參考資料行。 這個資料行必須有定義了條件約束的資料行之相同資料類型。

  • 資料表層級 FOREIGN KEY 條件約束的 REFERENCES 子句,必須有與條件約束資料行清單中的資料行一樣多的參考資料行。 每個參考資料行的資料類型,也必須與資料行清單中的對應資料行相同。 您必須以在參考資料表上指定 PRIMARY KEY 或 UNIQUE 條件約束資料行時所使用的相同順序來指定參考資料行。

  • 如果 timestamp 類型的資料行是外鍵或參考索引鍵的一部分,就無法指定 CASCADE、SET Null 或 SET DEFAULT。

  • 您可以在相互具有參考關聯性的資料表上,組合 CASCADE、SET NULL、SET DEFAULT 和 NO ACTION。 如果 Database Engine 遇到 NO ACTION,它會停止並回復相關的 CASCADE、SET Null 和 SET DEFAULT 動作。 當 DELETE 子句造成 CASCADE、SET Null、SET DEFAULT 和 NO ACTION 動作的組合時,所有 CASCADE、SET Null 和 SET DEFAULT 動作都會在 Database Engine 檢查是否有任何 NO ACTION 之前套用。

  • Database Engine 對資料表可以包含該參考其他資料表的 FOREIGN KEY 條件約束數目,或是參考特定資料表之其他資料表所擁有的 FOREIGN KEY 條件約束數目,沒有預先定義的限制。

    不過,FOREIGN KEY 條件約束的實際可用數目,會受到硬體組態及資料庫和應用程式設計的限制。 建議資料表所包含的 FOREIGN KEY 條件約束數目不要超出 253 個,參考資料表的 FOREIGN KEY 條件約束數目也不要超出 253 個。 有效限制多少會隨著應用程式和硬體而不同。 當您設計資料庫和應用程式時,請考量強制執行 FOREIGN KEY 條件約束的成本。

  • 暫存資料表不會強制執行 FOREIGN KEY 條件約束。

  • FOREIGN KEY 條件約束只能參考在所參考的資料表中之 PRIMARY KEY 或 UNIQUE 條件約束中的資料行,或在所參考的資料表之 UNIQUE INDEX 中的資料行。

  • 如果在 CLR 使用者定義的類型資料行上定義外部索引鍵,類型的實作必須支援二進位順序。 如需詳細資訊,請參閱 CLR 使用者定義型別

  • 加入外部索引鍵關聯性的資料行都必須定義相同的長度和小數位數。

DEFAULT 定義

  • 資料行只能有一個 DEFAULT 定義。

  • DEFAULT 定義可以包含常數值、函數、SQL 標準 niladic 函數 或 NULL。 下表顯示在 INSERT 陳述式期間,niladic 函數及它們傳回的預設值。

    SQL-92 niladic 函數 傳回的值
    CURRENT_TIMESTAMP 目前的日期和時間。
    CURRENT_USER 執行插入的使用者名稱。
    SESSION_USER 執行插入的使用者名稱。
    SYSTEM_USER 執行插入的使用者名稱。
    USER 執行插入的使用者名稱。
  • DEFAULT 定義中的constant_expression無法參考資料表中的其他資料行,或是參照其他資料表、檢視或預存程式。

  • 您無法在 具有 timestamp 資料類型的資料行或具有 IDENTITY 屬性的資料行上建立 DEFAULT 定義。

  • 如果別名資料類型系結至預設物件,則無法為具有別名資料類型的資料行建立 DEFAULT 定義。

CHECK 條件約束

  • 資料行可以有任意數目的 CHECK 條件約束,且條件可以包括用 AND 和 OR 組合的多個邏輯運算式。 資料行的多個 CHECK 條件約束是依照建立的順序來驗證的。

  • 搜尋條件必須評估為布林運算式,而且無法參考另一個資料表。

  • 資料行層級 CHECK 條件約束只能參考受條件約束限制的資料行,資料表層級的 CHECK 條件約束只能參考相同資料表中的資料行。

    CHECK CONSTRAINTS 和規則會在 INSERT 和 UPDATE 陳述式期間,提供相同的資料驗證功能。

  • 當一個或多個資料行有規則和一個或多個 CHECK 條件約束存在時,會評估所有限制。

  • 無法在 textNtextimage 資料行上定義 CHECK 條件約束。

進一步的條件約束資訊

  • 無法使用 卸載為條件約束 DROP INDEX 建立的索引;必須使用 卸載 ALTER TABLE 條件約束。 建立給條件約束及條件約束所使用的索引,可以利用 ALTER INDEX ... REBUILD 來重建。 如需詳細資訊,請參閱 重新組織與重建索引
  • 條件約束名稱必須遵循 識別碼的規則,不同之處在于名稱不能以數位記號 (#) 開頭。 如果未提供 constraint_name ,系統會將系統產生的名稱指派給條件約束。 條件約束名稱會出現在強制違規的任何錯誤訊息中。
  • INSERTUPDATEDELETE 陳述式中違反條件約束時,陳述式便會結束。 不過,當 SET XACT_ABORT 設為 OFF 時,如果陳述式在明確的交易中,就會繼續處理交易。 當 SET XACT_ABORT 設為 ON 時,就會回復整個交易。 您也可以藉由檢查 @@ERROR 系統函式,將 ROLLBACK TRANSACTION 陳述式與交易定義搭配使用。
  • ALLOW_ROW_LOCKS = ONALLOW_PAGE_LOCK = ON 時,您存取索引時就允許資料列層級、分頁層級和資料表層級的鎖定。 Database Engine 會選擇適當的鎖定,並可將鎖定從資料列或頁面鎖定呈報到資料表鎖定。 如果 ALLOW_ROW_LOCKS = OFFALLOW_PAGE_LOCK = OFF,當您存取索引時,只允許資料表層級的鎖定。
  • 如果資料表有 FOREIGN KEY 或 CHECK CONSTRAINTS 和觸發程序,就會先評估條件約束的條件,再執行觸發程序。

如需資料表及其資料行的報表,請使用 sp_helpsp_helpconstraint。 若要為資料表重新命名,請使用 sp_rename。 如需相依於資料表之檢視表和預存程序的報表,請使用 sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities

資料表定義內的 Null 屬性規則

資料行的 Null 屬性會決定該資料行是否可以允許 null 值 (NULL) 做為該資料行中的資料。 NULL 不是零或空白: NULL 表示未提供任何專案或明確 NULL 提供,而且通常表示值未知或不適用。

當您使用 CREATE TABLEALTER TABLE 建立或變更資料表時,資料庫和工作階段設定值會影響資料行定義中使用之資料類型的 Null 屬性,且可能會加以覆寫。 我們建議您對於非計算資料行,一律將資料行明確定義為 NULL 或 NOT NULL,如果您採用使用者自訂資料類型,建議您允許資料行使用資料類型的預設 Null 屬性。 疏鬆資料行必須永遠允許 NULL。

未明確指定資料行可為 Null 時,資料行可為 Null 功能會遵循下表所示的規則。

資料行資料類型 規則
別名資料型別 Database Engine 會使用建立資料類型時所指定的 Null 屬性。 若要判斷資料類型的預設 Null 屬性,請使用 sp_help
CLR 使用者定義型別 (CLR user-defined type) 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 屬性。

注意

SQL Server ODBC 驅動程式和 SQL Server OLE DB 驅動程式都預設為將 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 結構描述集合,則需要 XML 結構描述集合的擁有權或其 REFERENCES 權限。

任何使用者可以在 中 tempdb 建立臨時表。

如果語句建立總帳資料表, ENABLE LEDGER 則需要許可權。

範例

A. 在資料行上建立 PRIMARY KEY 條件約束

下列範例會顯示 PRIMARY KEY 條件約束的資料行定義,其中 EmployeeID 資料表的 Employee 資料行上包含叢集索引。 因為未指定條件約束名稱,所以系統會提供條件約束名稱。

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

B. 使用 FOREIGN KEY 條件約束

FOREIGN KEY 條件約束用來參考另一份資料表。 外部索引鍵可以是單一資料行,也可以是多重資料行的索引鍵。 這個範例顯示參考 SalesOrderHeader 資料表之 SalesPerson 資料表的單一資料行 FOREIGN KEY 條件約束。 單一資料行 FOREIGN KEY 條件約束只需要 REFERENCES 子句。

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

另外,您也可以明確地使用 FOREIGN KEY 子句,再重新指定資料行屬性。 在這兩個數據表中,資料行名稱不一定相同。

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

多重資料行索引鍵條件約束會建立成資料表條件約束。 在 AdventureWorks2019 資料庫中,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 定義

當未提供值時,預設值會提供一個值 (利用 INSERT 和 UPDATE 陳述式)。 例如,AdventureWorks2019 資料庫可以包括一份查閱資料表,列出公司中員工能夠填入的不同作業。 在描述每個作業的資料行下,未明確輸入實際描述時,字元字串預設值可能會提供描述。

DEFAULT 'New Position - title not formalized yet'

除了常數之外,DEFAULT 定義也可以包含函數。 請利用下列範例來取得項目的目前日期。

DEFAULT (GETDATE())

niladic 函數掃描也可以改進資料完整性。 若要追蹤插入資料列的使用者,請使用 USER 的 niladic 函數。 請勿使用括弧括住 niladic 函式。

DEFAULT USER

E. 使用 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. 顯示完整的資料表定義

下列範例會顯示含有 AdventureWorks2019 資料庫中所建立的 PurchaseOrderDetail 資料表之所有條件約束定義的完整資料表定義。 若要執行範例,資料表架構會變更為 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 資料行的資料表,且該資料行的類型符合 XML 結構描述集合 HRResumeSchemaCollectionDOCUMENT 關鍵字指定 column_namexml 資料類型的每個執行個體,都只能包含一個最上層元素。

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

分割區會以 col1PartitionTable 資料行值為基礎而以下列方式進行指派。

檔案群組 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 函數來提供新資料列的值。 ROWGUIDCOL 屬性會套用到 uniqueidentifier 資料行,以便可以使用 $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 的資料行,且假設目前資料庫中已建立了這個類型的組件及這個類型本身。 第二個資料行則是以 utf8string為基礎來定義,且利用 type(class)utf8stringToString() 方法來計算資料行的值。

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 資料行的資料表

下列範例會建立一份含有 FILESTREAM 資料行 Photo 的資料表。 如果資料表具有一個或多個 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()
);

N. 建立使用資料列壓縮的資料表

下列範例會建立一份使用資料列壓縮的資料表。

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

如需其他資料壓縮範例,請參閱資料壓縮

O. 建立使用 XML 壓縮的資料表

適用于:SQL Server 2022 (16.x) 和更新版本,以及 Azure SQL Database Preview。

下列範例會建立一份使用資料列壓縮的資料表。

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) 和更新版本,以及 Azure SQL Database。

下列範例顯示如何建立與新記錄資料表連結的時態表,以及如何建立與現有記錄資料表連結至的時態表。 時態表必須已定義主鍵,才能啟用系統版本設定的資料表。 如需範例來示範如何在現有資料表新增或移除系統版本設定,請參閱範例中的「系統版本設定」。 如需使用案例,請參閱時態表

這個範例會建立一個與新記錄資料表連結的新時態表。

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) 和更新版本,以及 Azure SQL Database。

下列範例示範如何建立一個與新磁碟記錄資料表連結的系統版本設定記憶體最佳化時態表。

這個範例會建立一個與新記錄資料表連結的新時態表。

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. 建立具有加密資料行的資料表

下列範例會建立一份含加密資料行的資料表。 如需詳細資訊,請參閱 Always Encrypted

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

T. 建立內嵌已篩選的索引

建立具有內嵌已篩選之索引的資料表。

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

U. 建立內嵌索引

下列範例說明如何在磁碟型資料表中使用內嵌的 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.

發生問題的原因是,雖然臨時表名稱是唯一的,但條件約束名稱則不是。

W. 在 Azure SQL 資料庫中使用全域臨時表

會話 A 會在 Azure SQL Database testdb1 中建立全域臨時表 ##test,並新增一個資料列

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

在 (2) 中 tempdb 取得指定物件識別碼1253579504的全域臨時表名稱

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

以下為結果集。

##test

工作階段 B 會連線到 Azure SQL Database testdb1,而且可以存取工作階段 A 建立的資料表 ##test

SELECT * FROM ##test;

以下為結果集。

1, 1

工作階段 C 會連線至 Azure SQL Database testdb2 中的另一個資料庫,並想要存取 testdb1 中建立的 ##test。 因為全域暫存資料表的資料庫範圍所致,這項選取會失敗

SELECT * FROM ##test

這產生了下列錯誤:

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

從目前使用者資料庫 testdb1 定址Azure SQL Database tempdb 中的系統物件

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

X. 在資料表上啟用資料保留原則

下列範例會建立已啟用資料保留的資料表,以及一周的保留期間。 此範例僅適用於 Azure SQL Edge

CREATE TABLE [dbo].[data_retention_table]
(
  [dbdatetime2] datetime2(7),
  [product_code] int,
  [value] char(10)
)
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ))

Y. 建立可更新的總帳資料表

下列範例會建立不是具有匿名歷程記錄資料表的時態表的可更新總帳資料表, (系統會產生歷程記錄資料表的名稱) 和產生的總帳檢視名稱。 由於產生的一律為必要資料行的名稱,且未指定總帳檢視中的其他資料行,因此資料行會有預設名稱。

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

下列範例會建立同時為時態表和可更新總帳資料表的資料表,其中匿名歷程記錄資料表 (系統) 產生的名稱、產生的總帳檢視名稱和所產生之一律資料行的預設名稱,以及其他總帳檢視資料行。

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

下列範例會建立同時為時態表和可更新總帳資料表的資料表,其中包含明確命名的歷程記錄資料表、總帳檢視的使用者指定名稱,以及總帳檢視中產生的一律資料行和其他資料行的使用者指定名稱。

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

下列範例會在 Azure SQL Database 中建立總帳資料庫,以及使用預設設定的可更新總帳資料表。 在總帳資料庫中建立可更新的總帳資料表不需要使用 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

後續步驟