sp_addmergefilter (Transact-SQL)

加入合併篩選,依據與其他資料表的聯結,建立資料分割。這個預存程序執行於發行集資料庫的發行者端。

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

語法

sp_addmergefilter [ @publication = ] 'publication' 
        , [ @article = ] 'article' 
        , [ @filtername = ] 'filtername' 
        , [ @join_articlename = ] 'join_articlename' 
        , [ @join_filterclause = ] join_filterclause
    [ , [ @join_unique_key = ] join_unique_key ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
    [ , [ @filter_type = ] filter_type ]

引數

  • [@publication= ] 'publication'
    這是加入合併篩選時所在發行集的名稱。publication 是 sysname,沒有預設值。

  • [@article= ] 'article'
    這是加入合併篩選時所在發行項的名稱。article 是 sysname,沒有預設值。

  • [@filtername= ] 'filtername'
    這是篩選的名稱。filtername 是必要參數。filtername 是 sysname,沒有預設值。

  • [@join_articlename= ] 'join_articlename'
    這是子發行項的父發行項,由 article 指定,必須利用 join_filterclause 指定的聯結子句來聯結,以判斷子發行項中符合合併篩選之篩選準則的資料列。join_articlename 是 sysname,沒有預設值。發行項必須位在 publication 所提供的發行集中。

  • [@join_filterclause= ] join_filterclause
    這是一個聯結子句,必須利用它來聯結 article 和 join_article 指定的父發行項,以判斷符合合併篩選資格的資料列。join_filterclause 是 nvarchar(1000)

  • [@join_unique_key= ] join_unique_key
    指定子發行項 article 與父發行項 join_article 之間的聯結是一對多、一對一、多對一或多對多。join_unique_key 是 int,預設值是 0。0 表示多對一或多對多聯結。1 表示一對一或一對多聯結。如果聯結資料行形成 join_article 中的唯一索引鍵,或 join_filterclause 介於 article 中的外部索引鍵與 join_article 中的主索引鍵之間,這個值是 1

    警告注意事項注意

    如果保證唯一性的父發行項之基礎資料表中的聯結資料行上有條件約束,請只將這個參數設為 1。若未將 join_unique_key 正確設定為 1,可能會發生資料無法聚合。

  • [@force_invalidate_snapshot= ] force_invalidate_snapshot
    認可這個預存程序所採取的動作可能會導致現有的快照集無效。force_invalidate_snapshot 是 bit,預設值是 0

    0 指定合併發行項的變更不會使快照集失效。如果預存程序偵測到變更需要新的快照集,就會發生錯誤,且不會進行任何變更。

    1 指定合併發行項的變更可能使快照集失效,如果有現有的訂閱需要新的快照集,便提供要標示為已棄用之現有快照集的權限,此時會產生新的快照集。

  • [@force_reinit_subscription= ] force_reinit_subscription
    認可這個預存程序所採取的動作可能需要重新初始化現有的訂閱。force_reinit_subscription 是 bit,預設值是 0。

    0 指定合併發行項的變更不會使訂閱重新初始化。如果預存程序偵測到變更需要重新初始化訂閱,就會發生錯誤,且不會進行任何變更。

    1 指定合併發行項的變更會使現有的訂閱重新初始化,且會提供發生訂閱重新初始化的權限。

  • [@filter_type= ] filter_type
    指定要加入的篩選類型。filter_type 是 tinyint,它可以是下列值之一。

    描述

    1

    僅聯結篩選。支援 SQL Server Compact 3.5 SP2 訂閱者需要這個值。

    2

    僅邏輯記錄關聯性。

    3

    聯結篩選和邏輯記錄關聯性。

    如需詳細資訊,請參閱<使用邏輯記錄分組相關資料列的變更>。

傳回碼值

0 (成功) 或 1 (失敗)

備註

sp_addmergefilter 用於合併式複寫中。

sp_addmergefilter 只能用於資料表發行項。不支援檢視和索引檢視發行項。

這個程序也可用來加入兩個相互之間可能有也可能沒有聯結篩選的發行項之間的邏輯關聯性。filter_type 可用來指定所加入的合併篩選是聯結篩選及 (或) 邏輯關聯性。

若要使用邏輯記錄,發行集和發行項必須符合許多需求。如需詳細資訊,請參閱<使用邏輯記錄分組相關資料列的變更>。

通常,這個選項用於一個有已發行主索引鍵資料表之外部索引鍵參考的發行項,且主索引鍵資料表在它的發行項中定義了篩選。主索引鍵資料列的子集可用來決定抄寫至訂閱者的外部索引鍵資料列。

當兩個發行項的來源資料表共用相同的資料表物件名稱時,您無法在這兩個已發行的發行項之間加入聯結篩選。在這種情況下,即使兩個資料表為不同結構描述所擁有,且具有唯一的發行項名稱,聯結篩選的建立作業仍會失敗。

當參數化資料列篩選器和聯結篩選都用於資料表發行項上時,複寫會判斷資料列是否屬於訂閱者的資料分割。它是藉由評估篩選函數或聯結篩選 (使用 OR 運算子) 來作判斷的,而不是藉由評估兩個條件的交集 (使用 AND 運算子)。

範例

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

權限

只有系統管理員 (sysadmin) 固定伺服器角色或 db_owner 固定資料庫角色的成員,才能夠執行 sp_addmergefilter