cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

針對在指定之 LSN 範圍內變更的每個來源資料列,各傳回一個淨變更資料列。也就是說,當來源資料列在 LSN 範圍中具有多個變更時,此函數就會傳回單一資料列,其中反映資料列的最終內容。例如,如果某個交易在來源資料表中插入資料列,而且 LSN 範圍內的後續交易更新該資料列中的一或多個資料行,則此函數只會傳回一個資料列,其中包括更新的資料行值。

當來源資料表啟用變更資料擷取並指定了淨追蹤時,就會建立此列舉函數。若要啟用淨追蹤,來源資料表必須具有主索引鍵或唯一的索引。函數名稱衍生自並採用 cdc.fn_cdc_get_net_changes_capture_instance 格式,其中 capture_instance 是當來源資料表啟用變更資料擷取時,針對擷取執行個體所指定的值。 如需詳細資訊,請參閱<sys.sp_cdc_enable_table (Transact-SQL)>。

主題連結圖示Transact-SQL 語法慣例

語法

cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )

<row_filter_option> ::=
{ all
 | all with mask
 | all with merge
}

引數

  • from_lsn
    LSN,代表要包含在結果集之 LSN 範圍的低端點。from_lsn 是 binary(10)。

    只有位於 cdc.[capture_instance]_CT 變更資料表而且 __$start_lsn 中的值大於或等於 from_lsn 的資料列才會包含在結果集中。

  • to_lsn
    LSN,代表要包含在結果集之 LSN 範圍的高端點。to_lsn 是 binary(10)。

    只有位於 cdc.[capture_instance]_CT 變更資料表而且 __$start_lsn 中的值小於或等於 from_lsn 或等於 to_lsn 的資料列才會包含在結果集中。

  • <row_filter_option> ::= { all | all with mask | all with merge }
    管理結果集中傳回之中繼資料資料行以及資料列內容的選項。可以是下列其中一個選項:

    • all
      在中繼資料資料行 __$start_lsn 和 __$operation 中傳回資料列最終變更的 LSN 以及套用資料列所需的作業。資料行 __$update_mask 一律為 NULL。

    • all with mask
      在中繼資料資料行 __$start_lsn 和 __$operation 中傳回資料列最終變更的 LSN 以及套用資料列所需的作業。此外,當更新作業傳回 (__$operation = 4) 時,於更新中修改的擷取資料行就會在 __$update_mask 傳回的值中標示。

    • all with merge
      在中繼資料資料行 __$start_lsn 中傳回資料列最終變更的 LSN。資料行 __$operation 將具有後面其中一個值:1 代表刪除,而 5 則表示套用變更所需的作業是插入或更新。資料行 __$update_mask 一律為 NULL。

      由於針對指定變更判斷精確作業的邏輯會增加查詢的複雜性,所以這個選項會設計成在足以表示套用變更所需的作業是插入或更新時改善查詢效能,但是不一定要明確區分這兩者。在可直接使用合併作業的目標環境 (例如 SQL Server 2008 環境) 中,這個選項最具吸引力。

傳回的資料表

資料行名稱

資料類型

描述

__$start_lsn

binary(10)

與變更之認可交易相關聯的 LSN。

在相同交易中認可的所有變更都會共用相同的認可 LSN。例如,如果來源資料表上的更新作業修改了兩個資料列中的兩個資料行,此變更資料表將會包含四個資料列,而且每個資料列都包含相同的 __$start_lsn 值。

__$seqval

binary(10)

用來排序交易內資料列變更的序列值。

__$operation

int

識別將變更資料的資料列套用至目標資料來源所需的資料操作語言 (DML) 作業。

如果 row_filter_option 參數的値為 all 或 all with mask,則此資料行中的値可能為下列其中一個値:

1 = 刪除

2 = 插入

4 = 更新

如果 row_filter_option 參數的値為 all with merge,則此資料行中的値可能為下列其中一個値:

1 = 刪除

5 = 插入或更新

5 的値代表不知道資料列是已經存在而只需要更新,或是資料列目前尚未存在而必須加以插入。

__$update_mask

varbinary(128)

位元遮罩,其中含有對應至針對擷取執行個體所識別之每個擷取資料行的位元。當 __$operation = 1 或 2 時,這個值會將所有定義的位元都設定為 1。當 __$operation = 3 或 4,只有對應至已變更資料行的位元才會設定為 1。

<擷取的來源資料表資料行>

變化

這個函數所傳回的其餘資料行都是建立擷取執行個體時,在來源資料表中識別成擷取資料行的資料行。如果擷取的資料行清單中沒有指定任何資料行,就會傳回來源資料表中的所有資料行。

權限

需要系統管理員 (sysadmin) 固定伺服器角色或 db_owner 固定資料庫角色中的成員資格。若為所有其他使用者,則需要來源資料表中所有擷取資料行的 SELECT 權限,而且如果定義了擷取執行個體的控制角色,便需要該資料庫角色的成員資格。當呼叫者沒有檢視來源資料的權限時,此函數就會傳回錯誤 208 (無效的物件名稱)。

備註

如果指定的 LSN 範圍不在擷取執行個體的變更追蹤時間表內,此函數就會傳回錯誤 208 (無效的物件名稱)。

範例

下列範例會使用 cdc.fn_cdc_get_net_changes_HR_Department 函數來回報在特定的時間間隔內,對 HumanResources.Department 來源資料表所做的淨變更。

首先,GETDATE 函數是用來標示時間間隔的開頭。在許多 DML 陳述式都套用至來源資料表之後,系統就會再次呼叫 GETDATE 函數來識別時間間隔的結尾。然後,系統會使用 sys.fn_cdc_map_time_to_lsn 函數,將時間間隔對應至 LSN 值所限定的變更資料擷取查詢範圍。最後,系統會查詢 cdc.fn_cdc_get_net_changes_HR_Department 函數,以便針對時間間隔取得來源資料表的淨變更。請注意,先插入後刪除的資料列不會顯示在此函數所傳回的結果集中。這是因為在查詢視窗中先加入後刪除的資料列不會在該間隔內於來源資料表上產生任何淨變更。您必須先執行<sys.sp_cdc_enable_table (Transact-SQL)>中的範例 B,然後再執行這個範例。

USE AdventureWorks;
GO
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE() -1;
-- DML statements to produce changes in the HumanResources.Department table.
INSERT INTO HumanResources.Department (Name, GroupName)
VALUES (N'MyDept', N'MyNewGroup');

UPDATE HumanResources.Department
SET GroupName = N'Resource Control'
WHERE GroupName = N'Inventory Management';

DELETE FROM HumanResources.Department
WHERE Name = N'MyDept';

-- Obtain the end of the time interval.
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);

-- Return the net changes occurring within the query window.
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');