適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric
中的倉庫Microsoft Fabric 中的 SQL 資料庫
改變、新增或卸除資料行和條件約束來修改資料表定義。
ALTER TABLE 也會重新指派和重建分割區,或停用和啟用限制和觸發程式。
Note
目前, ALTER TABLE 在網狀架構倉儲中,僅支持條件約束和新增可為 Null 的數據行。 請參閱 Microsoft Fabric 中的倉儲語法。
目前,Microsoft Fabric 的 SQL 資料庫中尚無記憶體優化資料表。
對於磁碟型資料表和記憶體最佳化資料表,的 ALTER TABLE 語法不同。 請使用下列連結來直接前往適合您資料表類型的語法區塊,以及前往適當的語法範例:
磁碟型資料表:
記憶體最佳化資料表:
如需語法慣例的詳細資訊,請參閱 Transact-SQL 語法慣例。
磁碟型資料表的語法
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
| max
| xml_schema_collection
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ] [ SPARSE ]
| { ADD | DROP }
{ ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }
| { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]
}
[ WITH ( ONLINE = ON | OFF ) ]
| [ WITH { CHECK | NOCHECK } ]
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
| [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START
[ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END
[ HIDDEN ] [ NOT NULL ][ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES] ,
start_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_transaction_id_column_name bigint GENERATED ALWAYS AS TRANSACTION_ID END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
start_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER START
[ HIDDEN ] NOT NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES],
end_sequence_number_column_name bigint GENERATED ALWAYS AS SEQUENCE_NUMBER END
[ HIDDEN ] NULL [ CONSTRAINT constraint_name ]
DEFAULT constant_expression [WITH VALUES]
]
PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
| DROP
[ {
[ CONSTRAINT ][ IF EXISTS ]
{
constraint_name
[ WITH
( <drop_clustered_constraint_option> [ ,...n ] )
]
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| { ENABLE | DISABLE } CHANGE_TRACKING
[ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
| SET
(
[ FILESTREAM_ON =
{ partition_scheme_name | filegroup | "default" | "NULL" } ]
| SYSTEM_VERSIONING =
{
OFF
| ON
[ ( HISTORY_TABLE = schema_name . history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ]
[, HISTORY_RETENTION_PERIOD =
{
INFINITE | number {DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS }
}
]
)
]
}
| DATA_DELETION =
{
OFF
| ON
[( [ FILTER_COLUMN = column_name ]
[, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS } } ]
)]
} )
| REBUILD
[ [PARTITION = ALL]
[ WITH ( <rebuild_option> [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]
]
]
| <table_option>
| <filetable_option>
| <stretch_configuration>
}
[ ; ]
-- ALTER TABLE options
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<drop_clustered_constraint_option> ::=
{
MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| MOVE TO
{ partition_scheme_name ( column_name ) | filegroup | "default" }
}
<table_option> ::=
{
SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
}
<filetable_option> ::=
{
[ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]
[ SET ( FILETABLE_DIRECTORY = directory_name ) ]
}
<stretch_configuration> ::=
{
SET (
REMOTE_DATA_ARCHIVE
{
= ON (<table_stretch_options>)
| = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )
| ( <table_stretch_options> [, ...n] )
}
)
}
<table_stretch_options> ::=
{
[ FILTER_PREDICATE = { null | table_predicate_function } , ]
MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
}
<single_partition_rebuild__option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE}
| ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }
}
<low_priority_lock_wait>::=
{
WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ],
ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}
如需詳細資訊,請參閱
- 變更表格column_constraint
- 更改表格column_definition
- 變更表格computed_column_definition
- 變更表格index_option
- 變更表格table_constraint
記憶體最佳化資料表的語法
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name
[ (
{
precision [ , scale ]
}
) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
}
| ALTER INDEX index_name
{
[ type_schema_name. ] type_name
REBUILD
[ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
]
}
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <table_index>
| <column_index>
} [ ,...n ]
| DROP
[ {
CONSTRAINT [ IF EXISTS ]
{
constraint_name
} [ ,...n ]
| INDEX [ IF EXISTS ]
{
index_name
} [ ,...n ]
| COLUMN [ IF EXISTS ]
{
column_name
} [ ,...n ]
| PERIOD FOR SYSTEM_TIME
} [ ,...n ] ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| SWITCH [ [ PARTITION ] source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
[ WITH ( <low_priority_lock_wait> ) ]
}
[ ; ]
-- ALTER TABLE options
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{PRIMARY KEY | UNIQUE }
{
NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column [ ,...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 [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [MINUTES] } ) ]
[ ON filegroup_name | default ]
}
Azure Synapse Analytics 和平行處理資料倉儲的語法
ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_name | source_table_name }
{
ALTER COLUMN column_name
{
type_name [ ( precision [ , scale ] ) ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
| ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
| REBUILD {
[ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ]
| [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
}
| { SPLIT | MERGE } RANGE (boundary_value)
| SWITCH [ PARTITION source_partition_number
TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET = ON | OFF ) ] ]
}
[ ; ]
<column_definition>::=
{
column_name
type_name [ ( precision [ , scale ] ) ]
[ <column_constraint> ]
[ COLLATE Windows_collation_name ]
[ NULL | NOT NULL ]
}
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
DEFAULT constant_expression
| PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
| UNIQUE (column_name [ ,... n ]) NOT ENFORCED -- Applies to Azure Synapse Analytics only
}
<rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]
}
<single_partition_rebuild_option > ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
}
Fabric 中倉儲的語法
ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
ADD { column_name <data_type> [COLLATE collation_name] [ <column_options> ] } [ ,...n ]
| ADD { <column_constraint> FOR column_name} [ ,...n ]
| DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]
}
[ ; ]
<column_options> ::=
[ NULL ] -- default is NULL
<data type> ::=
datetime2 ( n )
| date
| time ( n )
| float [ ( n ) ]
| real [ ( n ) ]
| decimal [ ( precision [ , scale ] ) ]
| numeric [ ( precision [ , scale ] ) ]
| bigint
| int
| smallint
| bit
| varchar [ ( n ) ]
| char [ ( n ) ]
| varbinary [ ( n ) ]
| uniqueidentifier
<column_constraint>::=
[ CONSTRAINT constraint_name ]
{
PRIMARY KEY NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| UNIQUE NONCLUSTERED (column_name [ ,... n ]) NOT ENFORCED
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] NOT ENFORCED
}
Arguments
database_name
建立資料表的資料庫名稱。
schema_name
資料表所屬的結構描述名稱。
table_name
要改變的資料表名稱。 如果資料表不在目前資料庫中,或未包含在目前使用者擁有的結構描述內,則您必須明確指定該資料庫和結構描述。
變更欄
指定將要變更或改變的具名資料行。
修改後的資料行不能是:
資料類型為 timestamp 的資料行。
對於
ROWGUIDCOL桌子。計算資料行,或用於計算資料行。
用於陳述式產生的
CREATE STATISTICS統計資料。 使用者需要執行DROP STATISTICS以卸除統計資料,才能ALTER COLUMN成功。 執行此查詢,以取得使用者所建立所有統計資料及資料表的統計資料行。SELECT s.name AS statistics_name, c.name AS column_name, sc.stats_column_id FROM sys.stats AS s INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND c.column_id = sc.column_id WHERE s.object_id = OBJECT_ID('<table_name>');Note
查詢最佳化工具自動產生的統計資料會由
ALTER COLUMN自動捨棄。用於 或
PRIMARY KEY約束。[FOREIGN KEY] REFERENCES用於 或
CHECK約束。UNIQUE但是,允許變更 orCHECK限制中使用的UNIQUE可變長度直欄的長度。與預設定義相關聯。 不過,如果資料類型未變更,則會變更資料行的長度、有效位數或小數位數。
text、ntext 與 image 資料行的資料類型只能透過以下方式來變更:
- text 變更為 varchar(max) 、nvarchar(max) 或 xml
- ntext 變更為 varchar(max) 、nvarchar(max) 或 xml
- image 變更為 varbinary(max)
某些資料類型變更可能會導致資料變更。 例如,如果將 nchar 或 nvarchar 資料行變更為 char 或 varchar,則可能會轉換擴充字元。 如需詳細資訊,請參閱 CAST 和 CONVERT。 減少資料行的有效位數或小數位數,可能會使資料截斷。
Note
資料分割資料表之資料行的資料類型不能變更。
索引中所包含之資料行的資料類型無法變更,除非資料行是 varchar、nvarchar 或 varbinary 資料類型,且新大小等於或大於舊大小。
主索引鍵限制中包含的資料行無法從 NOT NULL 變更為 NULL。
使用 Always Encrypted (沒有安全記憶體保護區) 時,如果要修改的資料行是使用 ENCRYPTED WITH進行加密,您可以將資料類型變更為相容的資料類型 (例如 INTBIGINT為 ),但無法變更任何加密設定。
當使用具有安全記憶體保護區的 Always Encrypted 時,如果保護資料行的資料行加密金鑰 (以及新的資料行加密金鑰 (若您有變更金鑰)) 支援記憶體保護區計算 (已使用啟用記憶體保護區的資料行主要金鑰進行加密),您便可以變更任何加密設定。 如需詳細資料,請參閱具有安全記憶體保護區的 Always Encrypted。
當您修改數據行時,資料庫引擎 藉由在系統數據表中新增數據列,並將前一個數據行修改標示為卸除數據行,以追蹤每個修改。 在極少數的情況下,您修改數據行太多次,資料庫引擎 可能會達到記錄大小限制。 如果發生這種情況,您會收到錯誤 511 或 1708。 若要避免這些錯誤,請定期重建數據表上的叢集索引,或減少數據行修改的數目。
column_name
要改變、新增或卸除的資料欄名稱。 Column_name 最多為 128 個字元。 針對以 timestamp 資料類型建立的新資料行,您可以省略 column_name。 如果您沒有為 timestamp 資料類型資料行指定任何 column_name,則會使用 timestamp 這個名稱。
Note
在變更資料表中的所有現有資料行之後會新增新資料行。
[ type_schema_name。 ] type_name
所改變資料行的新資料類型,或是所新增資料行的資料類型。 您無法為資料分割資料表的現有資料行指定 type_name。 type_name 可以是下列類型之一:
- SQL Server 系統資料類型。
- 基於 SQL Server 系統資料類型的別名資料類型。 您可以使用陳述式建立
CREATE TYPE別名資料類型,然後才能在表格定義中使用它們。 - .NET Framework 使用者定義型別及其所屬的結構描述。 您可以使用陳述式建立
CREATE TYPE使用者定義類型,然後才能在表格定義中使用它們。
以下是已更改之資料行的 type_name 準則:
- 前一個資料類型必須可隱含轉換至新資料類型。
- type_name 不可以是 timestamp。
- ANSI_NULL預設值一律會開啟
ALTER COLUMNfor;如果未指定,則該欄可為 Null。 -
ANSI_PADDING填充始終ON用於ALTER COLUMN。 - 如果修改的資料行是識別欄位,new_data_type 必須是支援識別屬性的資料類型。
- 會忽略 的
SET ARITHABORT目前設定。ALTER TABLE運作方式,就像ARITHABORT設定為ON一樣。
Note
如果未指定子 COLLATE 句,變更資料行的資料類型會導致定序變更為資料庫的預設定序。
precision
所指定資料類型的有效位數。 如需有效精確度值的詳細資訊,請參閱 精確度、比例和長度。
scale
所指定資料類型的小數位數。 如需有效比例值的詳細資訊,請參閱 精確度、比例和長度。
max
只適用於 varchar、nvarchar 與 varbinary 資料類型,可用來儲存 2^31-1 位元組的字元、二進位資料與 Unicode 資料。
xml_schema_collection
適用於:SQL Server 和 Azure SQL 資料庫。
只適用於 xml 資料類型,可用來將 XML 結構描述與該類型產生關聯。 將 L 資料行鍵入結構描述集合之前,您必須先使用 CREATE XML SCHEMA COLLECTION 在資料庫中建立結構描述集合。
COLLATE <定序名稱
指定變更資料行的新定序。 若未指定,就會將資料庫的預設定序指派給資料行。 定序名稱可以是 Windows 定序名稱或 SQL 定序名稱。 如需清單和詳細資訊,請參閱 Windows 定序名稱 和 SQL Server 定序名稱。
此 COLLATE 子句只會變更 char、 varchar、 nchar 和 nvarchar 資料類型資料行的定序。 若要變更使用者定義別名資料類型資料行的定序,請使用個別 ALTER TABLE 陳述式將資料行變更為 SQL Server 系統資料類型。 然後變更其定序,並將資料行變更回別名資料類型。
ALTER COLUMN 如果存在下列一或多個條件,則無法變更定序:
-
CHECK條件約束、FOREIGN KEY條件約束或計算資料行會參考已變更的資料行。 - 任何索引、統計資料或全文檢索索引都會在資料行上建立。 如果資料行定序變更了,在變更的資料行上自動建立的統計資料就會卸除。
- 結構描述繫結的檢視或函式會參考資料行。
如需支援定序的詳細資訊,請參閱 COLLATE。
NULL |NOT NULL
指定資料行是否接受 Null 值。 不允許 Null 值的資料行只有在指定了預設值或資料表是空的時,才會新增 。ALTER TABLE 只有在您也指定 NOT NULL時,才能指定PERSISTED計算資料行。 如果新資料行允許 Null 值,且您未指定預設值,則資料表每個資料列的新資料行都會包含 Null 值。 如果新資料行允許 Null 值,且您使用新資料行新增預設定義,則可用來 WITH VALUES 將資料表中每個現有資料列的新資料行中的預設值儲存在資料行中。
如果新資料行不允許 Null 值,且資料表不是空的,您必須使用 DEFAULT 新資料行新增定義。 而且,這個新資料行會在現有資料列的各個新資料行中自動載入預設值。
您可以指定 NULL in ALTER COLUMN 以強制資料 NOT NULL 行允許空值,但限制中的 PRIMARY KEY 資料行除外。 只有在直欄不包含空值時,您才能指定 NOT NULL in ALTER COLUMN 。 在允許之前 ALTER COLUMNNOT NULL ,必須先將空值更新為某個值,例如:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR (20) NOT NULL;
當您使用 or CREATE TABLEALTER TABLE 陳述式建立或變更資料表時,資料庫和工作階段設定會影響並可能覆寫資料行定義中使用的資料類型的可空值。 請務必一律明確地將資料行定義為 NULL 非 NOT NULL 計算資料行或非計算資料行。
如果您新增具有使用者定義資料類型的資料行,務必使用與此使用者定義資料類型相同的 Null 屬性來定義此資料行。 並且,為此資料行指定預設值。 如需詳細資訊,請參閱 CREATE TABLE。
Note
如果 或 NULL 指定NOT NULL為 ,也ALTER COLUMN必須指定 new_data_type [(precision [, scale ])] 。 如果資料類型、精確度和刻度未變更,請指定目前的資料行值。
[ {ADD |DROP} ROWGUIDCOL ]
適用於:SQL Server 和 Azure SQL 資料庫。
ROWGUIDCOL指定將屬性新增至指定資料行或從指定資料行卸除。
ROWGUIDCOL 表示資料行是資料列 GUID 資料行。 每個資料表只能設定一個 uniqueidentifier 資料行作為 ROWGUIDCOL 資料行。 而且,您只能將屬性指派 ROWGUIDCOL 給 uniqueidentifier 資料行。 您無法指派 ROWGUIDCOL 給使用者定義資料類型的資料行。
ROWGUIDCOL 不會強制執行儲存在資料行中的值的唯一性,也不會自動產生插入資料表的新資料列的值。 若要為每個數據行產生唯一值,請在 NEWID() 語句中使用 NEWSEQUENTIALID() 或 INSERT 函式。 或者,將 NEWID() 或 NEWSEQUENTIALID() 函式指定為數據行的預設值。
[ {ADD |DROP} PERSISTED ]
PERSISTED指定將屬性新增至指定資料行或從指定資料行卸除。 該資料行必須是使用具決定性運算式定義的計算資料行。 對於指定為 PERSISTED的資料行,資料庫引擎會以實際方式將計算值儲存在資料表中,並在更新計算資料行相依的任何其他資料行時更新值。 藉由將計算資料行標示為 PERSISTED,您可以在決定性但不精確的運算式上定義的計算資料行上建立索引。 如需詳細資訊,請參閱 計算資料行的索引。
SET QUOTED_IDENTIFIER當您在計算資料行或索引檢視上建立或變更索引時,必須是。ON 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER。
任何用作分割資料表分割資料行的計算資料行都必須明確標示 PERSISTED。
Note
在 Fabric SQL 資料庫中,允許計算資料行,但目前不會鏡像至 Fabric OneLake。
捨棄不用於複寫
適用於:SQL Server 和 Azure SQL 資料庫。
指定當複寫代理程式執行插入作業時,識別欄位中的值會累加。 只有在 column_name 是識別欄位時,您才能指定這個子句。
SPARSE
指出此資料行是疏鬆資料行。 疏鬆資料行的儲存體會針對 Null 值最佳化。 您無法將稀疏資料行設定為 NOT NULL。 當您將數據行從疏鬆轉換成非剖析,或從非剖析轉換成疏鬆時,此選項會在命令執行期間鎖定數據表。 您可能需要使用該 REBUILD 子句來收回任何空間節省。 如需其他限制和有關稀疏資料行的詳細資訊,請參閱 使用稀疏資料行。
新增遮罩 ( FUNCTION = 'mask_function')
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
指定動態資料遮罩。 mask_function 是遮罩函式的名稱並具備適當的參數。 可用的函數有三個:
- default()
- email()
- partial()
- random()
需要 ALTER ANY MASK 許可。
若要卸除遮罩,請使用 DROP MASKED。 如需函數參數,請參閱 動態資料遮罩。
新增和放置遮罩需要 ALTER ANY MASK 許可。
WITH ( ONLINE = ON | OFF) <適用於改變資料行>
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
資料表仍可使用時,允許執行多個改變資料行動作。 預設為 OFF。 您可以在線上針對資料類型、資料行長度或有效位數、Null 屬性、疏鬆度和定序來改變資料行。
線上變更直欄可讓使用者建立和自動統計資料在作業期間 ALTER COLUMN 參考已變更的直欄,這可讓查詢照常執行。 在作業結束時會卸除參考資料行的自動統計,使用者建立的統計資料亦同時失效。 作業完成之後,使用者必須手動更新使用者產生的統計資料。 如果資料行是任何統計資料或索引的篩選運算式一部分,則您無法執行改變資料行的作業。
當線上變更直欄作業執行時,任何可能相依於該直欄的 DDL 作業 (例如建立或修改索引、檢視等) 都會遭到封鎖,或失敗並出現適當的錯誤。 此行為可確保線上改變資料行不會因作業執行時導入的相依性之故而失敗。
當非叢集索引參考變更的資料行時,不支援將資料行從
NOT NULLNULL變更為線上作業。當資料行由檢查條件約束參考,且
ALTER作業限制資料行的精確度 (ALTER或日期時間) 時,不支援線上。WAIT_AT_LOW_PRIORITY選項不能與線上改變資料行搭配使用。ALTER COLUMN ... ADD/DROP PERSISTED不支援線上改變資料行。ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION不會受到線上改變資料行的影響。已啟用變更追蹤,或是屬於合併式複寫發行者的線上改變資料行不支援改變資料表。
線上改變資料行不支援改變自或改變成 CLR 資料類型。
線上改變資料行不支援改變成具有不同於目前結構描述集合的 XML 資料類型。
線上改變資料行不會減少針對何時可以改變資料行之限制。 索引及統計等參考資料,可能會導致改變失敗。
線上改變資料行不支援同時修改多個資料行。
線上改變資料行並不會對系統版本設定的時態表產生影響。
ALTER不論為選項指定ONLINE哪個值,資料行都不會以線上身分執行。
線上改變資料行具有與線上索引重建類似的需求、限制和功能,包括:
- 當資料表包含舊版的 LOB 或 filestream 資料行或資料表具有資料行存放區索引時,不支援線上索引重建。 相同的限制適用於線上改變資料行。
- 與原始資料行和新建立的隱藏資料行相比較,要改變現有資料行需要兩倍的空間配置。
- 改變資料行線上作業期間的鎖定策略是遵循用於線上索引建立相同的鎖定模式。
WITH CHECK |WITH NOCHECK
指定資料表中的資料是否根據新新增或重新啟用FOREIGN KEYCHECK或條件約束進行驗證。 如果您未指定,則會針對新條件約束進行假設, WITH CHECK 並 WITH NOCHECK 針對重新啟用的條件約束進行假設。
如果您不想針對現有資料驗證新的 CHECK 或 FOREIGN KEY 限制,請使用 WITH NOCHECK。 除了極少數的狀況外,我們建議您不要這麼做。 新條件約束會在以後的所有資料更新中評估。 如果新增限制時抑制的任何限制違規 WITH NOCHECK ,如果它們使用不遵循限制的資料更新資料列,可能會導致未來的更新失敗。 查詢最佳化工具不會考慮已定義 WITH NOCHECK的條件約束。 使用 重新啟用 ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL這些條件約束之前,會忽略這些條件約束。 如需詳細資訊,請參閱 使用 INSERT 和 UPDATE 陳述式停用外部索引鍵條件約束。
變更索引 index_name
指定要變更或改變之 index_name 的貯體計數。
只有記憶體優化數據表支援語法 ALTER TABLE ... ADD/DROP/ALTER INDEX。
Important
如果不使用ALTER TABLE陳述式,記憶體最佳化資料表上的索引不支援陳述式 CREATE INDEX、DROP INDEX、ALTER INDEX 和 PAD_INDEX。
ADD
指定加入一個或多個資料行定義、計算資料行定義或資料表條件約束。 或者,會新增系統用於系統版本設定的資料行。 您可以對記憶體最佳化資料表新增索引。
Note
在變更資料表中的所有現有資料行之後會新增新資料行。
Important
如果不使用ALTER TABLE陳述式,記憶體最佳化資料表上的索引不支援陳述式 CREATE INDEX、DROP INDEX、ALTER INDEX 和 PAD_INDEX。
SYSTEM_TIME期間(system_start_time_column_name,system_end_time_column_name)
適用於:SQL Server 2017 (14.x) 和更新版本,以及 Azure SQL 資料庫。
指定資料行的名稱,系統會使用這個資料行來記載某一筆記錄的有效時間週期。 您可以指定現有的資料行,或建立新的資料行作為引數的一部分 ADD PERIOD FOR SYSTEM_TIME 。 設定資料類型為 datetime2 的欄,並將其定義為 NOT NULL。 如果您將期間直欄定義為 NULL,則會產生錯誤。 您可以定義 column_constraint 和/或 指定system_start_time和system_end_time欄欄 的預設值 。 請參閱下列系統版本設定範例中的範例 A,此範例示範 system_end_time 資料行如何使用預設值。
將此引數與引數搭配 SET SYSTEM_VERSIONING 使用,可將現有表格設為時態表格。 如需詳細資訊,請參閱 時態資料表 和 開始使用時態資料表。
從 SQL Server 2017 (14.x) 開始,使用者可以使用旗標標 HIDDEN 示一或兩個期間資料行,以隱含方式隱藏這些資料行,以免 SELECT * FROM <table_name> 傳回資料行的值。 根據預設,不會隱藏期間資料行。 為了方便我們使用,隱藏的資料行必須明確包含在所有會直接參考時態表的查詢中。
DROP
指定卸除一或多個資料行定義、計算資料行定義或資料表條件約束,或卸除系統將用於系統版本設定的資料行。
Note
在總帳資料表中卸除的資料行只會虛刪除。 捨棄的資料行會保留在分類帳資料表中,但會將資料行dropped_ledger_table設定sys.tables為 1。 卸除總賬數據表的總賬檢視也會藉由將 中的數據行dropped_ledger_viewsys.tables設定1為 已卸除。 卸除的總賬數據表、其歷程記錄數據表和總賬檢視會藉由新增前置詞 (MSSQL_DroppedLedgerTable、 MSSQL_DroppedLedgerHistory、 MSSQL_DroppedLedgerView) 並將 GUID 附加至原始名稱來重新命名。
約束 constraint_name
指定從資料表中移除 constraint_name。 可以列出多個條件約束。
透過查詢 sys.check_constraint、sys.default_constraints、sys.key_constraints 和 sys.foreign_keys 目錄檢視表,您可以判斷條件約束的使用者定義名稱,或系統提供的名稱。
PRIMARY KEY如果資料表上存在 XML 索引,則無法捨棄條件約束。
索引 index_name
指定從資料表中移除 index_name。
語法 ALTER TABLE ...ADD/DROP/ALTER INDEX僅支援記憶體最佳化資料表。
Important
如果不使用ALTER TABLE陳述式,記憶體最佳化資料表上的索引不支援陳述式 CREATE INDEX、DROP INDEX、ALTER INDEX 和 PAD_INDEX。
專欄 column_name
指定從資料表移除 constraint_name 或 column_name。 可以列出多個資料行。
當資料行符合下列條件時,則無法將其卸除:
- 在索引中使用,無論是作為索引鍵資料行還是作為
INCLUDE - 用於 、 、
CHECKFOREIGN KEY或UNIQUE限制。PRIMARY KEY - 與以關鍵字定義
DEFAULT的預設值相關聯,或系結至預設物件。 - 繫結至規則。
Note
卸除資料行不會回收資料行的磁碟空間。 當表格的列大小接近或已超過其限制時,您可能必須收回捨棄直欄的磁碟空間。 指您可以在資料表上建立叢集索引,或利用 ALTER INDEX 重建現有的叢集索引來回收空間。 如需有關卸除 LOB 資料類型之影響的詳細資訊,請參閱此 CSS 部落格文章 \(英文\)。
SYSTEM_TIME期間
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
捨棄系統用於系統版本設定之欄的規格。
與 <drop_clustered_constraint_option>
指定設定一個或多個卸除叢集條件約束選項。
MAXDOP = max_degree_of_parallelism
適用於:SQL Server 和 Azure SQL 資料庫。
只針對作業持續時間覆寫 max degree of parallelism 設定選項。 如需詳細資訊,請參閱 伺服器組態:平行處理原則的最大程度。
使用該 MAXDOP 選項來限制平行計劃執行中使用的處理器數目。 最大值是 64 個處理器。
max_degree_of_parallelism 可以是下列其中一個值:
1隱藏平行計畫的產生。
>1將平行索引作業所用的最大處理器數目限制為指定的數目。
0(預設)根據現行系統工作量,使用實際處理器數目或更少處理器數目。
如需詳細資訊,請參閱 設定平行索引作業。
Note
SQL Server 的所有版本都無法使用平行索引作業。 如需詳細資訊,請參閱 版本與 SQL Server 2022 支援的功能。
ONLINE = { ON |OFF } <適用於drop_clustered_constraint_option>
指定在索引作業期間,查詢和資料修改是否能夠使用基礎資料表和相關聯的索引。 預設值為 OFF。 您可以作為 REBUILD 作業執行 ONLINE 。
ON
索引作業持續期間不會保留長期資料表鎖定。 在索引作業的主要階段期間,來源資料表上只會保留 Intent 共用 (
IS) 鎖定。 此行為使得基礎資料表和索引的查詢或更新能夠繼續運作。 作業開始時,只會在短時間內保留來源物件的共用 (S) 鎖定。 作業結束時,如果正在建立非叢集索引,則會在短時間內在來源上取得 S (共用) 鎖定。 或者,在線上建立或卸除叢集索引,以及重建叢集或非叢集索引時,會取得 Sch-M (結構描述修改) 鎖定。ONLINE無法設定為ON在本機暫存資料表上建立索引時。 只可使用單一執行緒的堆積重建作業。若要執行 DDL 或
SWITCH線上索引重建,必須完成在特定表格上執行的所有作用中封鎖交易。 執行時,SWITCH或重建作業會防止新交易啟動,並可能顯著影響工作負載輸送量,並暫時延遲對基礎資料表的存取。OFF
在索引作業期間會套用資料表鎖定。 建立、重建或卸除叢集索引的離線索引作業,或重建或卸除非叢集索引的離線索引作業,會取得資料表的結構描述修改 (Sch-M) 鎖定。 此鎖定可防止所有使用者在作業持續期間存取基礎資料表。 建立非叢集索引的離線索引作業會取得資料表的共用 (S) 鎖定。 此鎖定可防止更新基礎資料表,但允許讀取作業,例如
SELECT陳述式。 允許多執行緒的堆積重建作業。如需詳細資訊,請參閱 線上索引作業的運作方式。
Note
線上索引作業並非在每個版本的 SQL Server 中都可用。 如需詳細資訊,請參閱 版本與 SQL Server 2022 支援的功能。
移至 { partition_scheme_name(column_name [ ,...n ] | filegroup |“default” }
適用於:SQL Server 和 Azure SQL 資料庫。
指定目前在叢集索引分葉層級中之資料列所要移往的位置。 資料表會移至新位置。 此選項只適用於建立叢集索引的條件約束。
Note
在此內容中, default 不是關鍵字。 它是預設檔案群組的識別碼,而且必須分隔,如 或 MOVE TO "default"。MOVE TO [default] 如果指定,則 "default" 選項 QUOTED_IDENTIFIER 必須 ON 適用於現行工作階段。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER。
{ CHECK |NOCHECK } CONSTRAINT
指定 constraint_name 為已啟用或已停用。 此選項只能與 和 FOREIGN KEY 約束一起使用CHECK。 指定時 NOCHECK ,會停用條件約束,且未來不會根據條件約束條件驗證資料行的未來插入或更新。
DEFAULT、 PRIMARY KEY和 UNIQUE 限制無法停用。
ALL
指定使用選項停用
NOCHECK所有條件約束,或使用選項啟用CHECK所有條件約束。
{ ENABLE |DISABLE } 觸發程式
指定 trigger_name 為已啟用或已停用。 觸發程序停用時,仍然會為資料表定義。 不過,當 、 INSERT或UPDATE陳述式針對資料表執行時DELETE,在重新啟用觸發程式之前,不會執行觸發程式中的動作。
ALL
指定資料表中的所有觸發程序為已啟用或已停用。
trigger_name
指定要停用或啟用的觸發程序名稱。
{ ENABLE |DISABLE } CHANGE_TRACKING
適用於:SQL Server 和 Azure SQL 資料庫。
指定資料表是要啟用還是停用變更追蹤。 預設會停用變更追蹤。
只有當資料庫啟用了變更追蹤時,才能使用此選項。 如需詳細資訊,請參閱 ALTER DATABASE SET 選項。
若要啟用變更追蹤,資料表必須具有主索引鍵。
WITH ( TRACK_COLUMNS_UPDATED = { ON |OFF }
適用於:SQL Server 和 Azure SQL 資料庫。
指定資料庫引擎是否追蹤哪些變更追蹤的資料行已更新。 預設值是 OFF。
將 [ 分割區 source_partition_number_expression ] 切換至 [ schema_name。 ] target_table [ 分割區 target_partition_number_expression ]
適用於:SQL Server 和 Azure SQL 資料庫。
利用下列其中一種方式切換資料區塊:
- 將資料表的所有資料當做分割區重新指派給已存在的分割區資料表。
- 將分割區從某一分割區資料表切換到另一分割區資料表。
- 將分割區資料表之一個分割區中的所有資料,重新指派給現有的非分割區資料表。
如果 table 是資料分割資料表,您必須指定 source_partition_number_expression。 如果 target_table 已分割,您必須指定 target_partition_number_expression。 將作為資料分割之資料表的資料重新指派給已存在資料分割資料表,或將資料分割從某一資料分割資料表切換到另一資料分割資料表時,目標資料分割必須存在,且必須為空白。
重新指派一個資料分割的資料來形成單一資料表時,目標資料表必須已經存在,且必須為空白。 來源資料表或資料分割和目標資料表或資料分割必須位於相同檔案群組。 對應的索引或索引資料分割區也必須位於相同檔案群組。 切換分割區還有許多其他限制。 table 和 target_table 不可以相同。 target_table 可以是多部分識別碼。
source_partition_number_expression 和 target_partition_number_expression 都是可以參考變數和函式的常數運算式。 其中包括使用者定義型別變數與使用者定義函數。 無法參考 Transact-SQL 運算式。
具備叢集資料行存放區索引的資料分割資料表,其行為類似資料分割堆積:
- 主索引鍵必須包含資料分割索引鍵。
- 唯一索引必須包含資料分割索引鍵。 但是,包括具有現有唯一索引資料的分割索引鍵,會變更其唯一性。
- 若要切換資料分割,所有非叢集索引都必須包括資料分割索引鍵。
如需 SWITCH 使用抄寫時的限制,請參閱 抄寫分割表格和索引。
非叢集數據行存放區索引是以 SQL Server 2016 (13.x) 之前所建置的唯讀格式,並在 V12 版之前針對 SQL 資料庫 建置。 您必須先將非叢集資料行存放區索引重建為目前的格式 (可更新),才能執行任何 PARTITION 作業。
Limitations
如果兩個資料表的分割方式相同,包括非叢集索引,且目標資料表沒有任何非叢集索引,您可能會收到 4907 錯誤。
輸出範例:
Msg 4907, Level 16, State 1, Line 38
'ALTER TABLE SWITCH' statement failed. The table 'MyDB.dbo.PrtTable1' has 4 partitions while index 'MS1' has 6 partitions.
SET ( FILESTREAM_ON = { partition_scheme_name filestream_filegroup_name | |“default” |“NULL” })
適用於:SQL Server。 Azure SQL Database 不支援 FILESTREAM。
指定 FILESTREAM 資料存放的位置。
ALTER TABLE 只有 SET FILESTREAM_ON 在資料表沒有 FILESTREAM 資料行時,子句才會成功。 您可以使用第二個 ALTER TABLE 陳述式來新增 FILESTREAM 資料行。
如果您指定 partition_scheme_name,則會套用 CREATE TABLE 的規則。 請確保資料表已針對資料列資料進行分割,且其資料分割配置所使用的資料分割函數和資料行與 FILESTREAM 資料分割配置相同。
filestream_filegroup_name 會指定 FILESTREAM 檔案群組的名稱。 檔案群組必須有一個使用 CREATE DATABASE 或 ALTER DATABASE 陳述式為檔案群組定義的檔案,否則您會收到錯誤。
"default" 指定具有屬性集的 DEFAULT FILESTREAM 檔案群組。 如果沒有 FILESTREAM 檔案群組,您會收到錯誤。
"NULL" 指定移除資料表的所有 FILESTREAM 檔案群組參考。 首先必須卸除所有的 FILESTREAM 資料行。 用來 SET FILESTREAM_ON = "NULL" 刪除與資料表相關聯的所有 FILESTREAM 資料。
SET ( SYSTEM_VERSIONING = { OFF |ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON |OFF } ] ] ] } )
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
停用或啟用資料表的系統版本設定。 若要啟用資料表的系統版本設定,系統會驗證是否符合系統版本設定的資料類型、可空值限制和主索引鍵限制需求。 系統會將系統版本化表格中每筆記錄的歷程記錄記錄在個別歷程表格中。 如果未使用引數,則 HISTORY_TABLE 此歷程表的名稱為 MSSQL_TemporalHistoryFor<primary_table_object_id>。 如果記錄數據表不存在,系統會產生符合目前數據表架構的新記錄數據表、建立兩個數據表之間的連結,並讓系統記錄數據表中目前數據表中每個記錄的歷程記錄。 如果您使用 HISTORY_TABLE 引數來建立連結,並使用現有的記錄資料表,則系統會在目前資料表和指定資料表之間建立連結。 建立現有記錄資料表的連結時,您可以選擇執行資料一致性檢查。 這個資料一致性檢查可確保現有的記錄不會重疊。 預設會執行資料一致性檢查。 在以 SYSTEM_VERSIONING = ON 子句定義的資料表上使用 PERIOD FOR SYSTEM_TIME,將現有資料表變成時態表。 如需詳細資訊,請參閱 時態表格。
HISTORY_RETENTION_PERIOD = { 無限 | 數字 { 天 |天數 |本週 |週 |月 |月數 |年份 |年 } }
適用於:SQL Server 2017 (14.x) 和 Azure SQL Database。
為時態表中的歷程記錄資料指定有限或無限保留期。 如果省略,會使用無限保留期。
DATA_DELETION
適用範圍: 「僅限」Azure SQL Edge
根據資料庫內的資料表,啟用保留原則式清除舊的或過時資料。 如需詳細資訊,請參閱啟用和停用資料保留 (機器翻譯)。 必須指定下列參數才能啟用資料保留。
FILTER_COLUMN = { column_name }
指定應該用來判斷表格中的列是否過時的資料行。 允許針對篩選資料行使用下列資料類型。
- date
- 日期時間
- datetime2
- 小日期時間
- datetime偏移
RETENTION_PERIOD = { 無限 |數字 { 日 |天數 |本週 |週 |月 |月數 |年份 |年 } }
指定資料表的保留期間原則。 保留期間是使用正整數值和日期部分單位的組合來指定。
SET ( LOCK_ESCALATION = { AUTO |TABLE |DISABLE }
適用於:SQL Server 和 Azure SQL 資料庫。
指定資料表鎖定擴大的允許方法。
AUTO
此選項允許 SQL Server 資料庫引擎選取適用於資料表結構描述的鎖定擴大細微性。
如果資料表已分割,則允許鎖定呈報至堆積或 B 樹狀結構 (HoBT) 精細度。 換句話說,允許呈報至分割區層次。 鎖定呈報至 HoBT 層級之後,鎖定稍後不會呈報至
TABLE細微性。如果資料表未分割,則會
TABLE將鎖定呈報至精細度。
TABLE
不論資料表是否已分割,鎖定擴大都會在資料表層級的資料粒度上完成。
TABLE是預設值。DISABLE
在大多數情況下都避免使用鎖定擴大, 但並非完全不允許資料表層級的鎖定。 例如,當您在可序列化隔離等級下掃描沒有任何叢集索引的資料表時,資料庫引擎必須採用資料表鎖定以保護資料完整性。
REBUILD
使用 REBUILD WITH 語法來重建整個表格,包括分割表格中的所有分割區。 如果資料表具有叢集索引,則此 REBUILD 選項會重建叢集索引。
REBUILD 可以作為作業執行 ONLINE 。
使用 REBUILD PARTITION 語法在分割表格中重建單一分割區。
分割區 = 全部
適用於:SQL Server 和 Azure SQL 資料庫。
在變更分割區壓縮設定時重建所有分割區。
REBUILD WITH ( <rebuild_option> )
所有選項都適用於具有叢集索引的資料表。 如果資料表沒有叢集索引,則只有其中一些選項會影響堆積結構。
當作業未指定 REBUILD 特定壓縮設定時,會使用分割區的目前壓縮設定。 若要傳回目前設定,請查詢 data_compression 目錄檢視表中的 sys.partitions 資料行。
如需重新編製選項的完整描述,請參閱 ALTER TABLE index_option。
DATA_COMPRESSION
適用於:SQL Server 和 Azure SQL 資料庫。
針對指定的資料表、分割區編號或分割區範圍指定資料壓縮選項。 選項如下:
NONE
資料表或指定的分割區不會壓縮。 此選項不適用於資料行存放區資料表。
排
表格或指定的分割區會使用列壓縮來壓縮。 此選項不適用於資料行存放區資料表。
頁
表格或指定的分割區會使用頁面壓縮來壓縮。 此選項不適用於資料行存放區資料表。
COLUMNSTORE
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
只適用於資料行存放區資料表。
COLUMNSTORE指定解壓縮使用選項壓縮COLUMNSTORE_ARCHIVE的分割區。 還原資料時,資料會繼續以用於所有資料行存放區資料表的資料行存放區壓縮來壓縮。COLUMNSTORE_ARCHIVE
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
只適用於資料行存放區資料表,這些資料表會與叢集資料行存放區索引一起儲存。
COLUMNSTORE_ARCHIVE進一步將指定的分割區壓縮為較小的大小。 使用此選項進行封存,或是其他需要較少儲存體且可負擔更多時間來儲存和擷取的狀況。若要同時重建多個分割區,請參閱 index_option。 如果資料表沒有叢集索引,變更資料壓縮將會重建堆積和非叢集索引。 如需壓縮的詳細資訊,請參閱 資料壓縮。
ALTER TABLE REBUILD PARTITION WITH DATA COMPRESSION = ROW或者PAGE不允許在 Microsoft Fabric 的 SQL 資料庫中使用。
XML_COMPRESSION
適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL 資料庫,以及 Azure SQL 受控執行個體。
指定資料表中任何 xml 資料類型資料行的 XML 壓縮選項。 選項如下:
ON
使用 xml 資料類型的資料行會壓縮。
OFF
使用 xml 資料類型的資料行不會壓縮。
ONLINE = { ON |OFF } <適用於single_partition_rebuild_option>
指定在索引作業期間,查詢和資料修改是否能夠使用基礎資料表的單一資料分割,以及相關聯的索引。 預設值為 OFF。 您可以作為 REBUILD 作業執行 ONLINE 。
ON
索引作業持續期間不會保留長期資料表鎖定。 在索引重建開始時,需要對資料表進行 S 鎖定,而在線上索引重建結束時,需要對資料表進行 Sch-M 鎖定。 雖然這兩個鎖定是短暫的中繼資料鎖定,但 Sch-M 鎖定必須等候所有封鎖交易完成。 在等候期間,Sch-M 鎖定會在存取相同的資料表時,封鎖此鎖定之後所有其他等候的交易。
Note
線上重新編製索引可設定
low_priority_lock_wait選項,如本節稍後所述。OFF
在索引作業期間會套用資料表鎖定。 這可防止所有使用者在作業持續期間存取基礎資料表。
column_set_name ALL_SPARSE_COLUMNS的 XML COLUMN_SET
適用於:SQL Server 和 Azure SQL 資料庫。
資料行集的名稱。 資料行集是不具類型的 XML 表示,可將資料表的所有疏鬆資料行結合到結構化輸出中。 如果資料表已包含疏鬆資料行,資料行集無法新增至該資料表中。 如需資料行集的詳細資訊,請參閱 使用資料行集。
{ ENABLE |DISABLE } FILETABLE_NAMESPACE
適用於:SQL Server。
啟用或停用 FileTable 的系統定義條件約束。 只能用於 FileTable。
SET (FILETABLE_DIRECTORY = directory_name )
適用於:SQL Server。 Azure SQL 資料庫不支援 FileTable。
指定 Windows 相容的 FileTable 目錄名稱。 在資料庫的所有 FileTable 目錄名稱之間,此名稱必須是唯一的。 不論 SQL 定序設定為何,唯一性比較不區分大小寫。 只能用於 FileTable。
REMOTE_DATA_ARCHIVE
適用於:SQL Server 2017 (14.x) 和更新版本。
啟用或停用資料表的 Stretch Database。 如需詳細資訊,請參閱 Stretch Database。
Important
Stretch Database 在 SQL Server 2022 (16.x) 及 Azure SQL 資料庫中已被取代。 資料庫引擎的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。
啟用資料表的延伸資料庫
當您透過指定 ON 來啟用資料表的 Stretch 時,您也必須指定 MIGRATION_STATE = OUTBOUND 來立即開始移轉資料或指定 MIGRATION_STATE = PAUSED 來延後移轉資料。 預設值是 MIGRATION_STATE = OUTBOUND。 如需如何為資料表啟用 Stretch 的詳細資訊,請參閱為資料表啟用 Stretch Database。
Prerequisites. 為資料表啟用 Stretch 之前,您必須在伺服器和資料庫上啟用 Stretch。 如需詳細資訊,請參閱 Enable Stretch Database for a database。
Permissions. 為資料庫或資料表啟用 Stretch 時,需要 db_owner 權限。 為資料表啟用 [延展] 也需要 ALTER 資料表的許可權。
停用資料表的延伸資料庫
當您為資料表停用 Stretch 時,有兩個選項可用於已移轉至 Azure 的遠端資料。 如需詳細資訊,請參閱停用 Stretch Database 並帶回遠端資料。
若要停用資料表的 Stretch,並將資料表的遠端資料從 Azure 複製到 SQL Server,請執行下列命令。 無法取消此命令。
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;
這項操作會產生資料傳輸成本,且無法取消。 如需詳細資訊,請參閱 資料傳輸定價詳細資料。
將所有遠端資料從 Azure 複製回 SQL Server 後,即會針對資料表停用 Stretch。
若要停用資料表的 Stretch,並放棄遠端資料,請執行下列命令。
ALTER TABLE <table_name> SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;
當您停用資料表的 Stretch Database 之後,資料移轉將會停止,而查詢結果將不再包含來自遠端資料表的結果。
停用 Stretch 並不會移除遠端資料表。 若您想要刪除遠端資料庫,則必須使用 Azure 入口網站將其卸除。
[ FILTER_PREDICATE = { null | 述詞 }]
適用於:SQL Server 2017 (14.x) 和更新版本。
您現在可以指定一個篩選述詞,以選取要從同時包含歷史資料和目前資料的資料表中移轉哪些資料列。 此述詞必須呼叫確定性內嵌資料表值函式。 如需詳細資訊,請參閱為資料表啟用 Stretch Database 和使用篩選函式選取要移轉的資料列 - Stretch Database。
Important
若您提供執行狀況不佳的篩選器述詞,資料移轉也無法順利執行。 延伸資料庫會使用運算子將 CROSS APPLY 篩選述詞套用至資料表。
若您未指定篩選器述詞,則會遷移整個資料表。
當您指定過濾器述詞時,您也必須指定 MIGRATION_STATE。
MIGRATION_STATE = { OUTBOUND |輸入 |PAUSED }
適用於:SQL Server 2017 (14.x) 和更新版本。
指定
OUTBOUND以將資料從 SQL Server 移轉至 Azure。指定
INBOUND以將資料表的遠端資料,從 Azure 複製回 SQL Server,然後停用資料表的 Stretch。 如需詳細資訊,請參閱停用 Stretch Database 並帶回遠端資料。這項操作會產生資料傳輸成本,且無法取消。
指定
PAUSED以暫停或延後資料移轉。 如需詳細資訊,請參閱暫停和繼續資料移轉 - Stretch Database。
WAIT_AT_LOW_PRIORITY
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
線上索引重建必須等候這個資料表的封鎖作業。
WAIT_AT_LOW_PRIORITY 表示線上索引重建作業會等待低優先順序鎖定,容許其他作業在線上索引建置作業等候時繼續進行。 省略選項 WAIT AT LOW PRIORITY 與 WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)相同。
MAX_DURATION = 時間 [ 分鐘 ]
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
等待時間 (以分鐘為單位) 指定的整數值,在執行 DDL 指令時,或線上索引重建鎖定會以低優先順序等待。SWITCH 如果作業在一段時間 MAX_DURATION 內遭到封鎖,則會執行其中一個 ABORT_AFTER_WAIT 動作。
MAX_DURATION 時間總是以分鐘為單位,可以省略這個詞 MINUTES。
ABORT_AFTER_WAIT = { 無 |自我 |攔截器 }
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
NONE
繼續等候一般 (標準) 優先權的鎖定。
SELF
結束目前正在執行的
SWITCH或線上索引重建 DDL 作業,而不採取任何動作。BLOCKERS
終止目前封鎖
SWITCH或線上索引重建 DDL 作業的所有使用者交易,以便作業可以繼續。需要
ALTER ANY CONNECTION許可。
如果存在
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
只有在已經存在的情況下,才有條件地卸除資料行或條件約束。
RESUMABLE = { ON |OFF}
適用於:SQL Server 2022 (16.x) 和更新版本。
指定 ALTER TABLE ADD CONSTRAINT 作業是否為可繼續的作業。 若為 ON,則新增資料表條件約束作業為可繼續的作業。 當 時 OFF,無法繼續加入數據表條件約束作業。 預設為 OFF。 選項 RESUMABLE 可當作 ALTER TABLE table_constraint 中 ALTER TABLE index_option 的一部份。
MAX_DURATION 搭配使用 RESUMABLE = ON (需要 ONLINE = ON) 時,表示在暫停之前執行可繼續線上新增限制作業的時間 (以分鐘為單位的整數值)。 如果未指定,作業會繼續直到完成為止。
如需啟用和使用可 ALTER TABLE ADD CONSTRAINT 繼續作業的詳細資訊,請參閱 可繼續新增資料表限制。
Remarks
若要加入新的資料列,請使用 INSERT。 若要移除資料列,請使用 DELETE 或 TRUNCATE TABLE。 若要變更現有資料列中的值,請使用 UPDATE。
如果程序快取中有任何參照表格的執行計劃, ALTER TABLE 則標示它們要在下次執行時重新編譯。
在 Microsoft Fabric 的 SQL 資料庫中,有些資料表功能可以建立,但不會 鏡像到 Fabric OneLake。 欲了解更多資訊,請參閱 Fabric SQL 資料庫鏡像的限制。
變更數據行的大小
您可以指定資料行資料類型的新大小,以變更資料行的長度、有效位數或小數位數。 使用 ALTER COLUMN 子句。 如果資料行中有資料存在,則新大小不得小於資料的最大大小。 此外,您無法在索引中定義資料行,除非資料行是 varchar、 nvarchar 或 varbinary 資料類型,且索引不是條件約束的 PRIMARY KEY 結果。 請參閱標題為修改資料行定義一節中的範例。
鎖定和 ALTER TABLE
您在 implement 中 ALTER TABLE 指定的變更會立即發生。 如果變更需要修改表格中的列, ALTER TABLE 則會更新列。
ALTER TABLE 取得資料表上的綱目修改 (Sch-M) 鎖定,以確保在變更期間沒有其他連線參考資料表的中繼資料,但結束時需要簡短 Sch-M 鎖定的線上索引作業除外。 在 ALTER TABLE...SWITCH 作業中,會同時在來源資料表與目標資料表上取得鎖定。 對資料表所做的修改會記錄下來,且完全可復原。 影響大型資料表中所有資料列的變更,例如卸除資料行,或在某些版本的 SQL Server 上新增 NOT NULL 具有預設值的資料行,可能需要很長的時間才能完成並產生許多記錄記錄。 執行這些ALTER TABLE陳述式時,請與影響許多列的任何 、 INSERT或UPDATE陳述式相同DELETE。
適用於 Microsoft Fabric 中的倉儲。
ALTER TABLE 不能是明確交易的一部分。
分割區切換的擴充事件 (XEvents)
下列 XEvent 與在線ALTER TABLE ... SWITCH PARTITION有關。
- lock_request_priority_state
- process_killed_by_abort_blockers
- ddl_with_wait_at_low_priority
將 NOT NULL 資料行新增為在線作業
在 SQL Server 2012 (11.x) Enterprise Edition 和更新版本中,當預設值是NOT NULL時,新增具有預設值的資料行是線上作業。 這表示不管資料表中的資料列數目為何,作業幾乎立即完成,因為作業期間不會更新資料表中的現有資料列。 相反地,預設值只會儲存在資料表的中繼資料內,且存取這些資料列的查詢會視需要查閱此值。 此行為是自動的。 除了語法之外 ADD COLUMN ,不需要其他語法即可實作線上作業。 執行階段常數是一種運算式,會在執行階段針對資料表中的每個資料列產生相同的值,不論其決定性為何。 例如,常數運算式 "My temporary data"或系統函數 GETUTCDATETIME() 是執行時期常數。 相反地,NEWID() 或 NEWSEQUENTIALID() 函式不是執行階段常數,因為系統會針對資料表中的每個資料列產生唯一值。 新增預設值不是執行階段常數的資料行一 NOT NULL 律會離線執行,並在作業期間取得獨佔 (Sch-M) 鎖定。
當現有資料列參考中繼資料內儲存的值時,如果已插入任何新資料列但並未針對資料行指定另一個值,預設值就會儲存在資料列上。 儲存在中繼資料中的預設值會在資料列更新時移至現有的資料列 (即使陳述式中未指定 UPDATE 實際資料行),或重建資料表或叢集索引也一樣。
無法在線上作業中新增 varchar(max)、nvarchar(max)、varbinary(max)、xml、text、ntext、image、hierarchyid、geometry、geography 或 CLR 使用者定義類型的資料行。 您無法在線上新增資料行,如果這樣做會導致最大可能的資料列大小超過 8,060 位元組限制。 在此情況中,資料行會以離線作業的方式加入。
平行計畫執行
在 SQL Server 2012 (11.x) Enterprise Edition 和更新版本中,用來執行單一 ALTER TABLE ADD (索引型) CONSTRAINT 或 DROP (叢集索引) CONSTRAINT 陳述式的處理器數目是由平 行處理原則的最大程度 設定選項和目前的工作負載所決定。 如果資料庫引擎偵測到系統在忙碌中,則在開始執行陳述式之前,會先自動降低作業平行原則的程度。 您可以指定 MAXDOP 選項,以手動配置用來執行陳述式的處理器數目。 如需詳細資訊,請參閱 伺服器組態:平行處理原則的最大程度。
資料分割資料表
除了執行涉及分割資料表的 SWITCH 作業之外,還用來 ALTER TABLE 變更分割資料表的資料行、條件約束和觸發程式的狀態,就像用於非分割資料表一樣。 不過,這個陳述式不可用來變更資料表本身的資料分割方式。 若要重新分割某個資料分割資料表,請使用 ALTER PARTITION SCHEME 和 ALTER PARTITION FUNCTION。 此外,您也不能變更資料分割資料表的資料行資料類型。
含有結構描述繫結檢視之資料表的限制
套用至具有綱目繫結檢視之表格上陳述式的 ALTER TABLE 限制,與修改具有簡單索引的資料表時目前套用的限制相同。 允許加入資料行。 不過,不允許移除或變更參與任何結構描述繫結檢視表的資料行。 如果陳述式需要變更結構描述繫結檢視中使用的資料行,ALTER TABLE則ALTER TABLE會失敗,且資料庫引擎會引發錯誤訊息。 如需結構描述繫結和索引檢視表的詳細資訊,請參閱 CREATE VIEW。
建立參考資料表的結構描述繫結檢視,不會影響基底資料表上觸發程序的新增或移除。
索引和 ALTER TABLE
當條件約束卸除時,建立為條件約束之一部分的索引也會卸除。 必須使用 CREATE INDEX來DROP INDEX捨棄 所建立的索引。 使用 The ALTER INDEX 陳述式來重建條件約束定義的索引部分;條件約束不需要捨棄並使用 ALTER TABLE再次新增。
若要移除某資料行,必須先移除以該資料行為基礎的所有索引和條件約束。
當您刪除建立叢集索引的條件約束時,儲存在叢集索引分葉層級中的資料列會儲存在非叢集資料表中。 您可以藉由指定 MOVE TO 選項,卸除叢集索引,並將產生的資料表移至單一交易中的另一個檔案群組或分割區配置。 此 MOVE TO 選項具有下列限制:
MOVE TO不適用於索引檢視或非叢集索引。分割區配置或檔案群組必須已經存在。
如果未指定,資料
MOVE TO表會位於與叢集索引定義的相同分割區配置或檔案群組中。
當您卸除叢集索引時,請指定選項 ONLINE = ON ,讓 DROP INDEX 交易不會封鎖基礎資料和相關聯非叢集索引的查詢和修改。
ONLINE = ON 有以下限制:
-
ONLINE = ON不適用於也已停用的叢集索引。 必須使用ONLINE = OFF來捨棄已停用的索引。 - 一次只能卸除一個索引。
-
ONLINE = ON不適用於索引檢視、非叢集索引或本機暫存資料表上的索引。 -
ONLINE = ON不適用於資料行存放區索引。
卸除叢集索引時,需要一個大小等於現有叢集索引的暫存磁碟空間。 作業完成時,會立即釋放此額外空間。
Note
下列 <drop_clustered_constraint_option> 選項會套用至資料表上的叢集索引,且無法套用至檢視或非叢集索引上的叢集索引。
複寫結構描述變更
當您在 SQL Server 發行者的已發佈資料表上執行 ALTER TABLE 時,根據預設,該變更會傳播至所有 SQL Server 訂閱者。 這項功能具有某些限制。 您可以將其停用。 如需詳細資訊,請參閱對發行集資料庫進行結構描述變更。
資料壓縮
系統資料表無法啟用壓縮。 如果表格是資料堆,則模式的 ONLINE 重建作業是單一執行緒的。 使用 OFFLINE 模式進行多執行緒堆積重建作業。 如需資料壓縮的詳細資訊,請參閱 資料壓縮。
若要評估變更壓縮狀態如何影響資料表、索引或分割區,請使用 sp_estimate_data_compression_savings 系統預存程序。
下列限制適用於分割區資料表:
- 您無法在資料表具有非對齊索引時變更單一資料分割的壓縮設定。
-
ALTER TABLE <table> REBUILD PARTITION... 語法會重建所指定的分割區。 -
ALTER TABLE <table> REBUILD WITH... 語法會重建所有分割區。
刪除 ntext 欄
使用已取代的 ntext 資料類型卸除資料行時,已刪除資料的清除會以序列化作業的形式在所有資料列上進行。 清除作業可能需要大量時間。 在具有許多資料列的資料表中卸除 ntext 資料行時,請先將 ntext 資料行更新為 NULL value,然後再卸除資料行。 您可以透過平行作業執行此選項,使其更加快速。
線上索引重建
若要執行線上索引重建的 DDL 陳述式,特定資料表上執行的所有使用中封鎖交易都必須完成。 線上索引重建啟動時,會封鎖這個資料表上準備開始執行的所有新交易。 雖然線上索引重建的鎖定期間很短,但是等候特定資料表上所有未完成之交易完成並封鎖要開始的新交易,可能會大幅影響輸送量。 這會導致工作負載速度變慢或逾時,且大幅限制對基礎資料表的存取。 此 WAIT_AT_LOW_PRIORITY 選項可讓 DBA 管理線上索引重建所需的 S 鎖定及 Sch-M 鎖定。 在這三種情況下: NONE、 SELF及 BLOCKERS,如果在等待時間 ((MAX_DURATION = n [minutes])) 期間沒有封鎖活動,則會立即執行線上索引重建,而不等待,並完成 DDL 陳述式。
相容性支援
陳述 ALTER TABLE 式僅支援由兩部分組成的 (schema.object) 表格名稱。 在 SQL Server 中,使用下列格式來指定資料表名稱會在編譯時期失敗,並顯示錯誤 117。
server.database.schema.table.database.schema.table..schema.table
在舊版中,指定 server.database.schema.table 格式會傳回錯誤 4902。 成功指定 .database.schema.table 或 ..schema.table 格式。
若要解決此問題,請移除四部分前置詞的用法。
Permissions
需要 ALTER 對表格的許可。
ALTER TABLE 權限會套用至陳述式中涉及的 ALTER TABLE SWITCH 兩個資料表。 所切換的任何資料,都會繼承目標資料表的安全性。
如果您將陳述式中 ALTER TABLE 的任何資料行定義為共用語言執行階段 (CLR) 使用者定義類型或別名資料類型, REFERENCES 則需要該類型的權限。
新增或變更更新表格 UPDATE 列的資料行需要資料表的許可權。 例如,新增 NOT NULL 具有預設值的資料行,或在資料表不是空白時新增身分資料行。
Examples
本文中的程式碼範例會使用 或AdventureWorks2025AdventureWorksDW2025範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案首頁下載。
| Category | 代表性語法元素 |
|---|---|
| 加入資料行和條件約束 |
ADD; PRIMARY KEY 具有索引選項、稀疏列和列集 |
| 卸除資料行和條件約束 | DROP |
| 修改資料行定義 | 變更資料類型;更改列大小;排序 |
| 修改資料表定義 |
DATA_COMPRESSION; SWITCH PARTITION; LOCK ESCALATION;變更追蹤 |
| 停用和啟用條件約束與觸發程序 |
CHECK;NO CHECK; ENABLE TRIGGERDISABLE TRIGGER |
| 線上操作 | ONLINE |
| 系統版本設定 | SYSTEM_VERSIONING |
新增數據行和條件約束
本節中的範例示範如何將資料行和條件約束加入至資料表。
A. 新增數據行
下列範例會新增允許 Null 值的資料行,且沒有透過定義提供的 DEFAULT 值。 在新欄中,每一列都有 NULL。
CREATE TABLE dbo.doc_exa (column_a INT);
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR (20) NULL;
GO
B. 新增具有條件約束的數據行
下列範例會加入一個含有 UNIQUE 條件約束的新資料行。
CREATE TABLE dbo.doc_exc (column_a INT);
GO
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR (20) NULL
CONSTRAINT exb_unique UNIQUE;
GO
EXECUTE sp_help doc_exc;
GO
DROP TABLE dbo.doc_exc;
GO
C. 將未驗證的 CHECK 條件約束新增至現有的數據行
下列範例將條件約束加入至資料表中的現有資料行。 該資料行含有違反該條件約束的值。 因此,WITH NOCHECK 可用來防止根據現有的資料列來驗證條件約束,並允許加入條件約束。
CREATE TABLE dbo.doc_exd (column_a INT);
GO
INSERT INTO dbo.doc_exd VALUES (-1);
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1);
GO
EXECUTE sp_help doc_exd;
GO
DROP TABLE dbo.doc_exd;
GO
D. 將 DEFAULT 條件約束新增至現有的數據行
下列範例會建立具有兩個資料行的資料表,並將值插入第一資料行,而另一資料行會保留 NULL。 然後再將 DEFAULT 條件約束加入至第二個資料行。 若要確認已套用預設值,請在第一個資料行中插入其他值,然後查詢資料表。
CREATE TABLE dbo.doc_exz
(
column_a INT,
column_b INT
);
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (7);
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (10);
GO
SELECT * FROM dbo.doc_exz;
GO
DROP TABLE dbo.doc_exz;
GO
E. 使用條件約束新增數個數據行
下列範例會加入數個資料行,這些資料行含有利用新資料行定義的條件約束。 第一個新資料行有 IDENTITY 屬性。 資料表中的每一個資料列在識別欄位中都有新的累加值。
CREATE TABLE dbo.doc_exe
(
column_a INT
CONSTRAINT column_a_un UNIQUE
);
GO
ALTER TABLE dbo.doc_exe
-- Add a PRIMARY KEY identity column.
ADD column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,
-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk FOREIGN KEY REFERENCES doc_exe (column_a),
-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR (16) NULL
CONSTRAINT column_d_chk CHECK (column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
OR column_d LIKE '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),
-- Add a nonnull column with a default.
column_e DECIMAL (3, 3)
CONSTRAINT column_e_default DEFAULT .081;
GO
EXECUTE sp_help doc_exe;
GO
DROP TABLE dbo.doc_exe;
GO
F. 新增具有預設值的可為 Null 數據行
下列範例會加入含有 DEFAULT 定義且可為 Null 的資料行,並利用 WITH VALUES 為資料表中的每一個現有資料列提供值。 如果未使用,則 WITH VALUES 每一列都會在新資料行中具有值 NULL 。
CREATE TABLE dbo.doc_exf (column_a INT);
GO
INSERT INTO dbo.doc_exf VALUES (1);
GO
ALTER TABLE dbo.doc_exf
ADD AddDate SMALLDATETIME
CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES NULL;
GO
DROP TABLE dbo.doc_exf;
GO
G. 使用索引或數據壓縮選項建立 PRIMARY KEY 條件約束
下列範例會建立 PRIMARY KEY 條件約束 PK_TransactionHistoryArchive_TransactionID ,並設定選項 FILLFACTOR、 ONLINE和 PAD_INDEX。 產生的叢集索引與條件約束具有相同的名稱。
適用於:SQL Server 和 Azure SQL 資料庫。
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO
此類似範例會在套用叢集主索引鍵時,套用頁面壓縮。
USE AdventureWorks2022;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID
PRIMARY KEY CLUSTERED (TransactionID) WITH (DATA_COMPRESSION = PAGE);
GO
H. 新增疏鬆數據行
下列範例示範如何在資料表 T1 中加入及修改疏鬆資料行。 建立資料表 T1 的程式碼如下。
CREATE TABLE T1
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) SPARSE NULL,
C3 INT SPARSE NULL,
C4 INT
);
GO
若要加入其他的疏鬆資料行 C5,請執行下列陳述式。
ALTER TABLE T1
ADD C5 CHAR (100) SPARSE NULL;
GO
若要將 C4 非疏鬆資料行轉換成疏鬆資料行,請執行下列陳述式。
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE;
GO
若要將 C4 疏鬆資料行轉換成非疏鬆資料行,請執行下列陳述式。
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
I. 新增數據行集
下列範例示範如何將資料行加入至資料表 T2。 如果資料表已包含疏鬆資料行,就無法在該資料表中新增資料行集。 建立資料表 T2 的程式碼如下。
CREATE TABLE T2
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
下列三個陳述式會新增名為 CS 的資料行集,然後將資料行 C2 和 C3 修改為 SPARSE。
ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
GO
ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE;
GO
ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE;
GO
J. 新增加密的數據行
下列陳述式會加入名為 PromotionCode 的加密資料行。
ALTER TABLE Customers
ADD PromotionCode NVARCHAR (100)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
);
K. 新增具有可繼續作業的主鍵
在資料行 (a) 上新增叢集主索引鍵的可繼續 ALTER TABLE 作業,MAX_DURATION 為 240 分鐘。
ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);
卸除數據行和條件約束
本節中的範例示範如何卸除資料行和條件約束。
A. 卸除數據行或數據行
第一個範例會修改資料表來移除資料行。 第二個範例會移除多個資料行。
CREATE TABLE dbo.doc_exb
(
column_a INT,
column_b VARCHAR (20) NULL,
column_c DATETIME,
column_d INT
);
GO
-- Remove a single column.
ALTER TABLE dbo.doc_exb DROP COLUMN column_b;
GO
-- Remove multiple columns.
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;
B. 卸除條件約束和數據行
第一個範例會從資料表中移除 UNIQUE 條件約束。 第二個範例會移除兩個條件約束與單一資料行。
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE
);
GO
-- Example 1. Remove a single constraint.
ALTER TABLE dbo.doc_exc DROP my_constraint;
GO
DROP TABLE dbo.doc_exc;
GO
CREATE TABLE dbo.doc_exc
(
column_a INT NOT NULL
CONSTRAINT my_constraint UNIQUE,
column_b INT NOT NULL
CONSTRAINT my_pk_constraint PRIMARY KEY
);
GO
-- Example 2. Remove two constraints and one column
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.
ALTER TABLE dbo.doc_exc
DROP CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b;
GO
C. 在 ONLINE 模式中卸除 PRIMARY KEY 條件約束
下列範例會 PRIMARY KEY 刪除選項設定 ONLINE 為 ON的條件約束。
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
D. 新增和卸除 FOREIGN KEY 條件約束
下列範例會建立資料表 ContactBackup,然後改變該資料表,方式是先加入一個參考 FOREIGN KEY 資料表的 Person.Person 條件約束,再卸除 FOREIGN KEY 條件約束。
CREATE TABLE Person.ContactBackup (ContactID INT);
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBackup_Contact
FOREIGN KEY (ContactID) REFERENCES Person.Person (BusinessEntityID);
GO
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBackup_Contact;
GO
DROP TABLE Person.ContactBackup;
改變數據行定義
A. 變更資料行的資料類型
下列範例會將資料表的資料行從 INT 變更為 DECIMAL。
CREATE TABLE dbo.doc_exy (column_a INT);
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2);
GO
DROP TABLE dbo.doc_exy;
GO
B. 變更數據行的大小
下列範例會增加 varchar 資料行的大小,以及 decimal 資料行的有效位數和小數位數。 因為資料行包含資料,所以資料行大小只能增加。 另請注意,col_a 會定義於唯一索引中。 的 col_a 大小仍然可以增加,因為資料類型是 varchar ,而且索引不是條件約束的 PRIMARY KEY 結果。
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy
(
col_a VARCHAR (5) UNIQUE NOT NULL,
col_b DECIMAL (4, 2)
);
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name,
TYPE_NAME(system_type_id),
max_length,
precision,
scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a VARCHAR (25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b DECIMAL (10, 4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999);
GO
-- Verify the current column size.
SELECT name,
TYPE_NAME(system_type_id),
max_length,
precision,
scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
C. 變更數據行定序
下列範例將示範如何變更資料行的定序。 首先,資料表是包含預設使用者定序的已建立資料表。
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
接著,將資料行 C2 定序變更為 Latin1_General_BIN。 即使資料類型未變更,仍為必要。
ALTER TABLE T3
ALTER COLUMN C2 VARCHAR (50) COLLATE Latin1_General_BIN;
GO
D. 加密數據行
下列範例示範如何使用具有安全記憶體保護區的 Always Encrypted 來加密資料行。
首先,會建立不含任何加密資料行的資料表。
CREATE TABLE T3
(
C1 INT PRIMARY KEY,
C2 VARCHAR (50) NULL,
C3 INT NULL,
C4 INT
);
GO
接著,資料行 'C2' 會使用名為 CEK1 的資料行加密金鑰,以及隨機加密進行加密。 若要讓下列陳述式成功執行:
- 資料行加密金鑰必須已啟用記憶體保護區。 這表示,它必須使用允許記憶體保護區計算的資料行主要金鑰 (CMK) 進行加密。
- 目標 SQL Server 執行個體必須支援具有安全記憶體保護區的 Always Encrypted。
- 陳述式必須是透過為具有安全記憶體保護區 Always Encrypted 設定的連線發出,並使用支援的用戶端驅動程式。
- 呼叫應用程式必須能夠存取 CMK,以保護
CEK1。
ALTER TABLE T3 ALTER COLUMN C2 VARCHAR (50) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = [CEK1],
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
) NULL;
GO
改變數據表定義
本節中的範例示範如何修改資料表的定義。
A. 修改數據表以變更壓縮
下列範例會變更非分割區資料表的壓縮。 堆積或叢集索引會重建。 如果資料表是資料堆,則會重建所有非叢集索引。
ALTER TABLE T1 REBUILD
WITH (DATA_COMPRESSION = PAGE);
下列範例會變更分割區資料表的壓縮。
REBUILD PARTITION = 1 語法只會造成分割區號碼 1 的重建。
適用於:SQL Server。
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = NONE);
GO
使用下列替代語法的相同作業會造成資料表內所有分割區的重建。
適用於:SQL Server。
ALTER TABLE PartitionTable1 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS (1));
如需其他資料壓縮範例,請參閱 資料壓縮。
B. 修改數據行存放區數據表以變更封存壓縮
下列範例藉由套用其他壓縮演算法來進一步壓縮資料行存放區資料表的分割區。 此壓縮會縮小資料表,但是也會增加儲存和擷取所需的時間。 這對於封存,或是需要較少空間而且可負擔更多時間來儲存和擷取的狀況很實用。
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO
下列範例會解壓縮使用 option 壓縮 COLUMNSTORE_ARCHIVE 的資料行存放區資料表分割區。 還原資料時,資料會繼續以用於所有資料行存放區資料表的資料行存放區壓縮來壓縮。
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
ALTER TABLE PartitionTable1 REBUILD PARTITION = 1
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
C. 切換數據表之間的分割區
下列範例會建立分割區資料表,並假設資料庫中已經建立分割區配置 myRangePS1。 接著會建立一個非分割區資料表,其結構與分割區資料表相同,並且與資料表 PARTITION 2 的 PartitionTable 位於相同的檔案群組上。 然後,資料表 PARTITION 2 之 PartitionTable 的資料就會切換到資料表 NonPartitionTable 中。
CREATE TABLE PartitionTable
(
col1 INT,
col2 CHAR (10)
) ON myRangePS1 (col1);
GO
CREATE TABLE NonPartitionTable
(
col1 INT,
col2 CHAR (10)
) ON test2fg;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable;
GO
D. 允許分割數據表的鎖定擴大
下列範例會在分割區資料表上啟用分割區層級的鎖定擴大。 如果資料表未分割,則會在層級 TABLE 設定鎖定呈報。
適用於:SQL Server 和 Azure SQL 資料庫。
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
GO
E. 在數據表上設定變更追蹤
下列範例會啟用 Person.Person 資料表上的變更追蹤。
適用於:SQL Server 和 Azure SQL 資料庫。
USE AdventureWorks2022;
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING;
下列範例會啟用變更追蹤,並為變更期間更新的資料行啟用追蹤。
適用於:SQL Server。
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
下列範例會停用 Person.Person 資料表上的變更追蹤。
適用於:SQL Server 和 Azure SQL 資料庫。
USE AdventureWorks2022;
GO
ALTER TABLE Person.Person DISABLE CHANGE_TRACKING;
停用和啟用條件約束和觸發程式
A. 停用並重新啟用條件約束
下列範例會停用限制資料中所接受之薪資的條件約束。
NOCHECK CONSTRAINT 若與 ALTER TABLE 搭配使用,可以停用條件約束,並允許插入通常會違反條件約束的值。
CHECK CONSTRAINT 可重新啟用條件約束。
CREATE TABLE dbo.cnst_example
(
id INT NOT NULL,
name VARCHAR (10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1, 'Joe Brown', 65000);
INSERT INTO dbo.cnst_example VALUES (2, 'Mary Smith', 75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3, 'Pat Jones', 105000);
-- Re-enable the constraint and try another insert; this fails.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4, 'Eric James', 110000);
B. 停用並重新啟用觸發程式
下列範例會使用 DISABLE TRIGGER 的 ALTER TABLE 選項停用觸發程序,並允許通常會違反此觸發程序規定的插入作業。 接著會再使用 ENABLE TRIGGER 重新啟用此觸發程序。
CREATE TABLE dbo.trig_example
(
id INT,
name VARCHAR (12),
salary MONEY
);
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1
ON dbo.trig_example
FOR INSERT
AS IF (SELECT COUNT(*)
FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
PRINT 'TRIG1 Error: you attempted to insert a salary > $100,000';
ROLLBACK;
END
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1, 'Pat Smith', 100001);
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2, 'Chuck Jones', 100001);
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3, 'Mary Booth', 100001);
GO
線上操作
A. 使用低優先順序等候選項的線上索引重建
下列範例示範如何執行指定低優先順序等候選項的線上索引重建。
適用於:SQL Server 2014 (12.x) 和更新版本,以及 Azure SQL 資料庫。
ALTER TABLE T1 REBUILD WITH (
PAD_INDEX = ON,
ONLINE = ON (
WAIT_AT_LOW_PRIORITY (MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)
)
);
B. 線上改變資料行
下列範例顯示如何使用選項 ONLINE 執行變更資料行作業。
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
CREATE TABLE dbo.doc_exy (column_a INT);
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10);
GO
ALTER TABLE dbo.doc_exy
ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);
GO
EXECUTE sp_help doc_exy;
DROP TABLE dbo.doc_exy;
GO
系統版本設定
下列四個範例可協助您熟悉使用系統版本設定的語法。 如需其他協助,請參閱開始使用 系統版本設定的時態資料表。
適用於:SQL Server 2016 (13.x) 和更新版本,以及 Azure SQL 資料庫。
A. 將系統版本設定加入現有的資料表
下列範例會示範如何將系統版本設定加入現有的資料表,並建立未來的記錄資料表。 這個範例假設目前有一個稱為 InsurancePolicy 且已定義主索引鍵的資料表。 此範例會為系統版本設定填入新建立的期間資料行,且因為開始時間與結束時間不能為 Null,因此會使用預設值。 此範例使用子 HIDDEN 句來確保不會影響與現行資料表互動的現有應用程式。 它也會使用 HISTORY_RETENTION_PERIOD 僅在 SQL Database 上可用的 。
--Alter non-temporal table to define periods for system versioning
ALTER TABLE InsurancePolicy
ADD ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN
DEFAULT SYSUTCDATETIME() NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN
DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59.99999999') NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);
--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy SET (
SYSTEM_VERSIONING = ON (
HISTORY_RETENTION_PERIOD=1 YEAR
)
);
B. 移轉現有解決方案以使用系統版本設定
下列範例會示範如何從一種使用觸發程序來模擬時態性支援的解決方案,移轉至系統版本設定。 此範例假設有現有的解決方案使用 ProjectTask 資料表和 ProjectTaskHistory 現有解決方案的資料表,其 Changed Date 期間使用 and Revised Date 資料行,這些期間資料行不使用 datetime2 資料類型,而且 ProjectTask 資料表已定義主索引鍵。
-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;
-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTask ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] DATETIME2 NOT NULL;
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] DATETIME2 NOT NULL;
-- Add SYSTEM_TIME period and set system versioning with linking two existing tables
-- (a certain set of data checks happen in the background)
ALTER TABLE ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date]);
ALTER TABLE ProjectTask SET (
SYSTEM_VERSIONING = ON (
HISTORY_TABLE=dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK=ON
)
);
C. 停用並重新啟用系統版本設定以變更數據表架構
這個範例示範如何停用 Department 資料表上的系統版本設定、 加入資料行,然後重新啟用系統版本設定。 若要修改資料表結構描述,必須停用系統版本設定。 在交易中執行這些步驟,只更新資料表結構描述而不更新這兩個資料表,這樣可以讓 DBA 在重新啟用系統版本設定時不執行資料一致性檢查,還能改善效能。 執行某些作業時並不需要停用系統版本設定,例如建立統計資料、切換資料分割或者將壓縮套用到一或兩個資料表。
BEGIN TRAN
/* Takes schema lock on both tables */
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF) ;
/* expand table schema for temporal table */
ALTER TABLE Department
ADD Col5 int NOT NULL DEFAULT 0 ;
/* Expand table schema for history table */
ALTER TABLE DepartmentHistory
ADD Col5 int NOT NULL DEFAULT 0 ;
/* Re-establish versioning again*/
ALTER TABLE Department
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory,
DATA_CONSISTENCY_CHECK = OFF)) ;
COMMIT
D. 拿掉系統版本控制
這個範例示範如何從 Department 資料表徹底移除系統版本設定以及卸除 DepartmentHistory 資料表。 您可能也要視情況卸除系統用來記錄系統版本設定資訊的期間資料行。 已啟用系統版本設定時,您無法卸除 Department 或 DepartmentHistory 資料表。
ALTER TABLE Department
SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE Department
DROP PERIOD FOR SYSTEM_TIME;
DROP TABLE DepartmentHistory;
範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
下列範例 A 至 C 都會使用 FactResellerSales 資料庫中的 資料表。
A. 判斷資料表是否已分割
下列查詢會在資料表 FactResellerSales 已分割時,傳回一個或多個資料列。 如果資料表未分割,則不會傳回任何資料列。
SELECT *
FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
AND t.name = 'FactResellerSales';
B. 判斷分割數據表的界限值
下列查詢會針對 FactResellerSales 資料表中的每一個分割區傳回界限值。
SELECT t.name AS TableName,
i.name AS IndexName,
p.partition_number,
p.partition_id,
i.data_space_id,
f.function_id,
f.type_desc,
r.boundary_id,
r.value AS BoundaryValue
FROM sys.tables AS t
INNER JOIN sys.indexes AS i
ON t.object_id = i.object_id
INNER JOIN sys.partitions AS p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.partition_schemes AS s
ON i.data_space_id = s.data_space_id
INNER JOIN sys.partition_functions AS f
ON s.function_id = f.function_id
LEFT OUTER JOIN sys.partition_range_values AS r
ON f.function_id = r.function_id
AND r.boundary_id = p.partition_number
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
ORDER BY p.partition_number;
C. 判斷資料分割資料表的分割資料行
下列查詢會傳回資料表的 FactResellerSales 分割資料行名稱。
SELECT t.object_id AS Object_ID,
t.name AS TableName,
ic.column_id AS PartitioningColumnID,
c.name AS PartitioningColumnName
FROM sys.tables AS t
INNER JOIN sys.indexes AS i
ON t.object_id = i.object_id
INNER JOIN sys.columns AS c
ON t.object_id = c.object_id
INNER JOIN sys.partition_schemes AS ps
ON ps.data_space_id = i.data_space_id
INNER JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id
AND ic.index_id = i.index_id
AND ic.partition_ordinal > 0
WHERE t.name = 'FactResellerSales'
AND i.type <= 1
AND c.column_id = ic.column_id;
D. 合併兩個分割區
下列範例會將兩個資料分割合併到一個資料表。
Customer 資料表的定義如下:
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 100)
)
);
下列命令會結合 10 到 25 的資料分割界限。
ALTER TABLE Customer MERGE RANGE (10);
資料表的新的 DDL 是:
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 25, 50, 100)
)
);
E. 分割分割區
下列範例會分割資料表上的資料分割。
Customer 資料表有以下 DDL:
DROP TABLE Customer;
CREATE TABLE Customer
(
id INT NOT NULL,
lastName VARCHAR (20),
orderCount INT,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderCount RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 100)
)
);
下列命令會建立新的分割區而且被 75 這個值所限制,介於 50 到 100 之間。
ALTER TABLE Customer SPLIT RANGE (75);
資料表的新的 DDL 是:
CREATE TABLE Customer (
id INT NOT NULL,
lastName VARCHAR(20),
orderCount INT,
orderDate DATE)
WITH DISTRIBUTION = HASH(id),
PARTITION ( orderCount (RANGE LEFT
FOR VALUES (1, 5, 10, 25, 50, 75, 100))) ;
F. 使用 SWITCH 將分割區移至記錄資料表
下列範例會將 Orders 資料表某一資料分割中的資料移至 OrdersHistory 資料表的某一資料分割。
Orders 資料表有以下 DDL:
CREATE TABLE Orders
(
id INT,
city VARCHAR (25),
lastUpdateDate DATE,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderDate RANGE RIGHT
FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01')
)
);
在這個範例中,Orders 資料表有下列資料分割。 每個分割區都包含資料。
| Partition | 有數據嗎? | 邊界範圍 |
|---|---|---|
| 1 | Yes | OrderDate < '2004-01-01' |
| 2 | Yes | '2004-01-01' <= OrderDate < '2005-01-01' |
| 3 | Yes | '2005-01-01' <= OrderDate< '2006-01-01' |
| 4 | Yes | '2006-01-01'<= OrderDate < '2007-01-01' |
| 5 | Yes | '2007-01-01' <= OrderDate |
- 分割區 1 (有資料):
OrderDate < '2004-01-01' - 分割區 2 (有資料):
'2004-01-01' <= OrderDate < '2005-01-01' - 分割區 3 (有資料):
'2005-01-01' <= OrderDate< '2006-01-01' - 分割區 4 (有資料):
'2006-01-01'<= OrderDate < '2007-01-01' - 分割區 5 (有資料):
'2007-01-01' <= OrderDate
OrdersHistory 資料表有下列 DDL,其中資料行和資料行名稱都與 Orders 資料表相同。 二者散列分佈在 id 資料行。
CREATE TABLE OrdersHistory
(
id INT,
city VARCHAR (25),
lastUpdateDate DATE,
orderDate DATE
)
WITH (
DISTRIBUTION = HASH(id),
PARTITION(orderDate RANGE RIGHT
FOR VALUES ('2004-01-01')
)
);
雖然資料行和資料行名稱必須相同,但資料分割界限不需要相同。 在此範例中,OrdersHistory 資料表有下列兩個資料分割而且都是空的:
- 分割區 1 (無資料):
OrderDate < '2004-01-01' - 分割區 2 (空白):
'2004-01-01' <= OrderDate
針對前面兩個資料表,下列命令會將所有 OrderDate < '2004-01-01' 的資料列,從 Orders 資料表移至 OrdersHistory 資料表。
ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;
因此,Orders 中的第一個資料分割是空白的,而且 OrdersHistory 中的第一個資料分割包含資料。 資料表現在會出現,如下所示:
Orders 資料表
- 分割區 1 (空白):
OrderDate < '2004-01-01' - 分割區 2 (有資料):
'2004-01-01' <= OrderDate < '2005-01-01' - 分割區 3 (有資料):
'2005-01-01' <= OrderDate< '2006-01-01' - 分割區 4 (有資料):
'2006-01-01'<= OrderDate < '2007-01-01' - 分割區 5 (有資料):
'2007-01-01' <= OrderDate
OrdersHistory 資料表
- 分割區 1 (有資料):
OrderDate < '2004-01-01' - 分割區 2 (空白):
'2004-01-01' <= OrderDate
若要清理Orders資料表,您可以透過合併分割區12來移除空白分割區,如下所示:
ALTER TABLE Orders MERGE RANGE ('2004-01-01');
合併之後,Orders 資料表有下列資料分割:
Orders 資料表
- 分割區 1 (有資料):
OrderDate < '2005-01-01' - 分割區 2 (有資料):
'2005-01-01' <= OrderDate< '2006-01-01' - 分割區 3 (有資料):
'2006-01-01'<= OrderDate < '2007-01-01' - 分割區 4 (有資料):
'2007-01-01' <= OrderDate
假設又過了一年,您已準備好封存 2005 年。 您可以按照以下方法分割空白資料分割,以在 OrdersHistory 資料表為 2005 年配置一個空白資料分割:
ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');
分割之後,OrdersHistory 資料表會有以下資料分割:
OrdersHistory 資料表
- 分割區 1 (有資料):
OrderDate < '2004-01-01' - 分割區 2 (空白):
'2004-01-01' < '2005-01-01' - 分區 3(空):
'2005-01-01' <= OrderDate