CHANGETABLE (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

傳回資料表的變更追蹤資訊。 您可以使用這個語句傳回資料表的所有變更,或針對特定資料列變更追蹤資訊。

Transact-SQL 語法慣例

語法

CHANGETABLE (  
    { CHANGES <table_name> , <last_sync_version> 
    | VERSION <table_name> , <primary_key_values> } 
    , [ FORCESEEK ] 
    )  
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )  
  
<primary_key_values> ::=  
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )  

引數

變更 table_name last_sync_version
傳回自 last_sync_version 指定版本後,已發生之資料表之所有變更的追蹤資訊。

table_name
這是要取得追蹤變更的使用者定義資料表。 資料表上必須啟用變更追蹤。 您可以使用一、二、三部分或四部分的資料表名稱。 資料表名稱可以是資料表的同義字。

last_sync_version
可為 Null 的 Bigint 純量值。 運算式 會導致語法錯誤。 如果值為 Null,則會傳回所有追蹤的變更。 當它取得變更時,呼叫端應用程式必須指定需要變更的點。 last_sync_version 會指定該點。 函式會傳回自該版本以來已變更之所有資料列的資訊。 應用程式正在查詢,以接收版本大於 last_sync_version 的變更。 一般而言,在取得變更之前,應用程式會呼叫 CHANGE_TRACKING_CURRENT_VERSION() 以取得下次需要變更時將使用的版本。 因此,應用程式不需要解譯或瞭解實際值。 由於 呼叫端應用程式會取得last_sync_version ,因此應用程式必須保存值。 如果應用程式遺失此值,則必須重新初始化資料。 last_sync_version應該經過驗證,以確保它不是太舊,因為某些或所有變更資訊可能已根據針對資料庫設定的保留期間進行清除。 如需詳細資訊,請參閱 CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) ALTER DATABASE SET 選項 (Transact-SQL)

VERSION table_name , { primary_key_values }
傳回指定資料列的最新變更追蹤資訊。 主鍵值必須識別資料列。 primary_key_values 識別主鍵資料行,並指定值。 主鍵資料行名稱可以依任何順序指定。

table_name
這是要取得變更追蹤資訊的使用者定義資料表。 資料表上必須啟用變更追蹤。 您可以使用一、二、三部分或四部分的資料表名稱。 資料表名稱可以是資料表的同義字。

column_name
指定主鍵資料行或資料行的名稱。 您可以依任何順序指定多個資料行名稱。

value
這是主鍵的值。 如果有多個主鍵資料行,則必須以與資料行出現在 column_name 清單中的順序相同來指定值。

[ FORCESEEK ]
適用于: SQL Server (從 SQL Server 2016 (13.x) SP2 CU16、SQL Server 2017 (14.x) CU24 和 SQL Server 2019 (15.x) CU11 開始)、Azure SQL Database 和 Azure SQL 受控實例

選擇性參數,強制使用搜尋作業來存取 table_name 。 在某些情況下,很少的資料列已變更,掃描工作仍可用來存取 table_name 。 如果掃描工作造成效能問題,請使用 FORCESEEK 參數。

[AS] table_alias [ ( column_alias [ ,... n ] ] ]
提供 CHANGETABLE 所傳回結果的名稱。

table_alias
這是 CHANGETABLE 所傳回之資料表的別名名稱。 table_alias是必要的,而且必須是有效的 識別碼

column_alias
這是 CHANGETABLE 所傳回之資料行的選擇性資料行別名或資料行別名清單。 這可讓資料行名稱自訂,以防結果中有重複的名稱。

傳回型別

table

傳回值

CHANGETABLE 變更

指定 CHANGES 時,會傳回具有下列資料行的零個或多個資料列。

資料行名稱 資料類型 描述
SYS_CHANGE_VERSION bigint 與資料列上次變更相關聯的版本值
SYS_CHANGE_CREATION_VERSION bigint 與上次插入作業相關聯的版本值。
SYS_CHANGE_OPERATION Nchar(1) 指定變更的類型:

U = 更新

I = 插入

D = 刪除
SYS_CHANGE_COLUMNS Varbinary(4100) 列出自last_sync_version之後已變更的資料行(基準)。 請注意,計算資料行永遠不會列為已變更。

當下列任一條件成立時,此值為 Null:

未啟用資料行變更追蹤。

作業是插入或刪除作業。

所有非主要索引鍵資料行都會在一個作業中更新。 這個二進位值不應該直接解譯。 相反地,若要解譯它,請使用 CHANGE_TRACKING_IS_COLUMN_IN_MASK()
SYS_CHANGE_CONTEXT varbinary(128) 變更您可以選擇性地指定的內容資訊,方法是使用 WITH 子句做為 INSERT、UPDATE 或 DELETE 子句的一部分。
<主鍵資料行值> 與使用者資料表資料行相同 追蹤資料表的主鍵值。 這些值可唯一識別使用者資料表中的每個資料列。

CHANGETABLE VERSION

指定 VERSION 時,會傳回一個具有下列資料行的資料列。

資料行名稱 資料類型 描述
SYS_CHANGE_VERSION bigint 與資料列相關聯的目前變更版本值。

如果變更的期間未超過變更追蹤保留期限,或啟用變更追蹤之後,資料列尚未變更,則值為 Null。
SYS_CHANGE_CONTEXT varbinary(128) 變更您可以選擇性地指定的內容資訊,方法是使用 WITH 子句做為 INSERT、UPDATE 或 DELETE 子句的一部分。
<主鍵資料行值> 與使用者資料表資料行相同 追蹤資料表的主鍵值。 這些值可唯一識別使用者資料表中的每個資料列。

備註

CHANGETABLE 函式通常用於查詢的 FROM 子句中,就像是資料表一樣。

CHANGETABLE(CHANGES...)

若要取得新或修改之資料列的資料列,請使用主鍵資料行,將結果集聯結至使用者資料表。 使用者資料表中已變更的每個資料列只會傳回一個資料列,即使自 last_sync_version 值之後 ,相同的資料列也發生了多次變更。

主鍵資料行變更永遠不會標示為更新。 如果主鍵值變更,則會將其視為刪除舊值和插入新值。

如果您刪除資料列,然後插入具有舊主鍵的資料列,該變更會被視為資料列中所有資料行的更新。

SYS_CHANGE_COLUMNS 資料行傳 SYS_CHANGE_OPERATION 回的值會相對於指定的基準 (last_sync_version)。 例如,如果在 版本進行插入作業,並在 版本 1015 進行更新作業,而且如果基準 last_sync_version 12 ,則會報告更新。 如果last_sync_version 值為 8 ,則會報告插入。 SYS_CHANGE_COLUMNS 永遠不會將計算資料行回報為已更新。

一般而言,會追蹤在使用者資料表中插入、更新或刪除資料的所有作業,包括 MERGE 語句。

不會追蹤影響使用者資料表資料的下列作業:

  • UPDATETEXT執行 語句。 此語句已被取代,並將在未來的 SQL Server 版本中移除。 不過,會追蹤使用 .WRITE UPDATE 語句的 子句所做的變更。

  • 使用 TRUNCATE TABLE 刪除資料列。 截斷資料表時,與資料表相關聯的變更追蹤版本資訊會重設,就好像資料表上剛啟用變更追蹤一樣。 用戶端應用程式應該一律驗證其上次同步處理的版本。 如果資料表已截斷,驗證就會失敗。

CHANGETABLE(VERSION...)

如果指定不存在的主鍵,則會傳回空的結果集。

如果變更未超過保留期間(例如,清除已移除變更資訊),或自從資料表啟用變更追蹤之後,資料列從未變更過,則 的值 SYS_CHANGE_VERSION 可能是 Null。

權限

SELECT需要主鍵資料行的許可權,以及 VIEW CHANGE TRACKING table_name > 值所 < 指定之資料表的許可權,才能取得變更追蹤資訊。

範例

A. 傳回資料的初始同步處理資料列

下列範例示範如何取得資料表資料的初始同步處理資料。 查詢會傳回所有資料列資料及其相關聯的版本。 然後,您可以將此資料插入或新增至將包含同步處理資料的系統。

-- Get all current rows with associated version  
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT  
FROM Employees AS e  
CROSS APPLY CHANGETABLE   
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;  

B. 列出自特定版本以來所做的所有變更

下列範例會列出自指定版本 @last_sync_version) () 以來資料表中所做的所有變更。 [Emp ID] 和 SSN 是複合主鍵中的資料行。

DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT [Emp ID], SSN,  
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,  
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;  

C. 取得同步處理的所有已變更資料

下列範例示範如何取得已變更的所有資料。 此查詢會將變更追蹤資訊與使用者資料表聯結,以便傳回使用者資料表資訊。 LEFT OUTER JOIN會使用 ,以便針對已刪除的資料列傳回資料列。

-- Get all changes (inserts, updates, deletes)  
DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,  
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c  
    LEFT OUTER JOIN Employees AS e  
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;  

D. 使用 CHANGETABLE 偵測衝突(VERSION...)

下列範例示範只有在上次同步處理之後的資料列尚未變更時,才更新資料列。 使用 取得 CHANGETABLE 特定資料列的版本號碼。 如果資料列已更新,則不會進行變更,而且查詢會傳回資料列最近變更的相關資訊。

-- @last_sync_version must be set to a valid value  
UPDATE  
    SalesLT.Product  
SET  
    ListPrice = @new_listprice  
FROM  
    SalesLT.Product AS P  
WHERE  
    ProductID = @product_id AND  
    @last_sync_version >= ISNULL (  
        (SELECT CT.SYS_CHANGE_VERSION FROM   
            CHANGETABLE(VERSION SalesLT.Product,  
            (ProductID), (P.ProductID)) AS CT),  
        0);  

另請參閱

變更追蹤函數 (Transact-SQL)
追蹤資料變更 (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)