sp_addmergefilter (Transact-SQL)

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

加入新的合併篩選條件,以根據與另一個數據表的聯結建立分割區。 這個預存程式會在發行集資料庫的發行者端執行。

Transact-SQL 語法慣例

語法

sp_addmergefilter
    [ @publication = ] N'publication'
    , [ @article = ] N'article'
    , [ @filtername = ] N'filtername'
    , [ @join_articlename = ] N'join_articlename'
    , [ @join_filterclause = ] N'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 = ] N'publication'

要加入合併篩選的發行集名稱。 @publication為 sysname,沒有預設值。

[ @article = ] N'article'

要加入合併篩選之發行項的名稱。 @article為 sysname,沒有預設值。

[ @filtername = ] N'filtername'

篩選的名稱。 @filtername是必要參數。 @filtername為 sysname,沒有預設值。

[ @join_articlename = ] N'join_articlename'

子發行項@article指定的 父發行項必須使用@join_filterclause 指定的聯結子句來聯結,以判斷符合合併篩選準則篩選準則之子發行項中的資料列。 @join_articlename為 sysname ,沒有預設值。 發行項必須位於@publication 指定的發行集中。

[ @join_filterclause = ] N'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 表示一對一或一對多聯結。

1 聯結資料行在 @join_article 形成唯一索引鍵時,或者 如果@join_filterclause 是在 @article 中的 外鍵與@join_article 的主 鍵之間。

警告

只有在父發行項的父發行項的聯結資料行上有一個條件約束,且保證唯一性時,才將此參數 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 ,而且可以是下列其中一個值。

Description
1 僅聯結篩選準則。 支援 SQL Server Compact 訂閱者的必要專案。
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.EmployeeID = 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

權限

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