sp_table_validation (Transact-SQL)

適用於:SQL Server

傳回數據表或索引檢視表的數據列計數或總和檢查碼資訊,或比較所提供的數據列計數或總和檢查碼資訊與指定的數據表或索引檢視表。 這個預存程式會在發行集資料庫的發行者端和訂閱資料庫的訂閱者端執行。

注意

sp_table_validation Oracle 發行者不支援。

Transact-SQL 語法慣例

語法

sp_table_validation [ @table = ] 'table'
    [ , [ @expected_rowcount = ] type_of_check_requested OUTPUT ]
    [ , [ @expected_checksum = ] expected_checksum OUTPUT ]
    [ , [ @rowcount_only = ] rowcount_only ]
    [ , [ @owner = ] 'owner' ]
    [ , [ @full_or_fast = ] full_or_fast ]
    [ , [ @shutdown_agent = ] shutdown_agent ]
    [ , [ @table_name = ] 'table_name' ]
    [ , [ @column_list = ] 'column_list' ]
[ ; ]

引數

[ @table = ] 'table'

資料表的名稱。 tablesysname,沒有預設值。

[ @expected_rowcount = ] expected_rowcount OUTPUT

指定是否要傳回數據表中預期的數據列數目。 @expected_rowcount 為 int,預設值為 NULL。 如果為 NULL,則會以輸出參數的形式傳回實際的數據列計數。 如果提供值,則會根據實際數據列計數檢查該值,以識別任何差異。

[ @expected_checksum = ] expected_checksum OUTPUT

指定是否要傳回數據表的預期總和檢查碼。 @expected_checksum為數值,預設值為 NULL。 如果為 NULL,則會以輸出參數的形式傳回實際的總和檢查碼。 如果提供值,則會根據實際的總和檢查碼檢查該值,以識別任何差異。

[ @rowcount_only = ] type_of_check_requested

指定要執行的總和檢查碼或數據列計數類型。 @rowcount_only為 smallint,預設值為 1

如果 0為 ,請執行數據列計數和 SQL Server 7.0 相容的總和檢查碼。

如果 1為 ,則只執行數據列計數檢查。

如果 2為 ,請執行數據列計數和二進位總和檢查碼。

[ @owner = ] 'owner'

數據表擁有者的名稱。 @owner為 sysname,預設值為 NULL

[ @full_or_fast = ] full_or_fast

用來計算數據列計數的方法。 @full_or_fast是 tinyint,預設值2,而且可以是下列其中一個值。

Description
0 使用 COUNT*進行完整計數。
1 從執行快速計數 sysindexes.rows。 中的 sysindexes 計算數據列比計算實際數據表中的數據列快得多。 不過,由於 sysindexes 更新延遲,因此數據列計數可能不正確。
2 (預設值) 先嘗試快速方法,進行條件式快速計數。 如果快速方法顯示差異,則會還原為完整方法。 如果 expected_rowcount 為 NULL,而且預存程式正用來取得值,則一律會使用 full COUNT(*)

[ @shutdown_agent = ] shutdown_agent

如果 散發代理程式 正在執行 sp_table_validation,則指定 散發代理程式 是否應該在驗證完成時立即關閉。 @shutdown_agent為 bit,預設值為 0。 如果 0為 ,則復寫代理程式不會關閉。 如果 1為 ,則會引發錯誤 20578,併發出復寫代理程式關閉的訊號。 當使用者直接執行時 sp_table_validation ,會忽略此參數。

[ @table_name = ] 'table_name'

用於輸出訊息之檢視的數據表名稱。 table_name為 sysname,預設值為 @table

[ @column_list = ] 'column_list'

檢查碼函式中應該使用的數據行清單。 column_list為 nvarchar(4000),預設值為 NULL。 啟用合併發行項的驗證,以指定排除計算和時間戳數據行的數據行清單。

傳回碼值

如果執行總和檢查碼驗證,且預期的總和檢查碼等於數據表中的總和檢查碼, sp_table_validation 則會傳回數據表通過總和檢查碼驗證的訊息。 否則,它會傳回訊息,指出數據表可能未同步處理,並報告預期與實際數據列數目之間的差異。

如果執行數據列計數驗證,且預期的數據列數目等於數據表中的數位, sp_table_validation 則傳回數據表通過數據列計數驗證的訊息。 否則,它會傳回訊息,指出數據表可能未同步處理,並報告預期與實際數據列數目之間的差異。

備註

sp_table_validation 用於所有類型的複寫。 sp_table_validation Oracle 發行者不支援。

總和檢查碼會在頁面上的整個數據列影像上計算 32 位循環備援檢查 (CRC)。 它不會選擇性地檢查數據行,而且無法在數據表的檢視或垂直分割區上運作。 此外,總和檢查碼會略過文字影像數據行的內容(根據設計)。

執行總和檢查碼時,兩部伺服器之間的數據表結構必須相同;也就是說,數據表必須具有相同順序、相同數據類型和長度的相同數據行,以及相同的 NULL/NOT NULL 條件。 例如,如果發行者執行 CREATE TABLE,則為 ALTER TABLE 來新增數據行,但在訂閱者端套用的腳本是簡單的 CREATE 數據表,則結構不相同。 如果您不確定這兩個數據表的結構相同,請查看 syscolumns 並確認每個數據表中的位移都相同。

如果使用字元模式 bcp ,浮點值可能會產生總和檢查碼差異,如果發行集有非 SQL Server 訂閱者,則為這種情況。 這些是由於在轉換字元模式與字元模式時,精確度的次要和不可避免的差異。

權限

若要執行 sp_table_validation,您必須對要驗證的數據表具有 SELECT 許可權。