sp_addmergefilter (Transact-SQL)

Gilt für:SQL ServerAzure SQL Managed Instance

Fügt einen neuen Mergefilter hinzu, um eine Partition auf der Basis eines Joins mit einer anderen Tabelle zu erstellen. Diese gespeicherte Prozedur wird im Publisher in der Publikationsdatenbank ausgeführt.

Transact-SQL-Syntaxkonventionen

Syntax

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 ]
[ ; ]

Argumente

[ @publication = ] N'Publikation'

Der Name der Publikation, in der der Seriendruckfilter hinzugefügt wird. @publication ist "sysname" ohne Standard.

[ @article = ] N'article'

Der Name des Artikels, zu dem der Seriendruckfilter hinzugefügt wird. @article ist "sysname" ohne Standard.

[ @filtername = ] N'filtername'

Der Name des Filters. @filtername ist ein erforderlicher Parameter. @filtername ist "sysname" ohne Standard.

[ @join_articlename = ] N'join_articlename'

Der übergeordnete Artikel, dem der untergeordnete Artikel, der durch @article angegeben wurde, muss mithilfe der durch @join_filterclause angegebenen Verknüpfungsklausel verknüpft werden, um die Zeilen im untergeordneten Artikel zu bestimmen, die dem Filterkriterium des Seriendruckfilters entsprechen. @join_articlename ist "sysname" ohne Standard. Der Artikel muss in der von @publication gegebenen Veröffentlichung sein.

[ @join_filterclause = ] N'join_filterclause'

Die Verknüpfungsklausel, die zum Verknüpfen des untergeordneten Artikels verwendet werden muss, der durch @articleund übergeordneten Artikel angegeben wird, der durch @join_article angegeben wird, um die Zeilen zu bestimmen, die den Seriendruckfilter qualifizieren. @join_filterclause ist nvarchar(1000), ohne Standard.

[ @join_unique_key = ] join_unique_key

Gibt an, ob die Verknüpfung zwischen untergeordnetem Artikel @article und übergeordnetem Artikel @join_article 1:n, 1:1, n:1 oder n:n ist. @join_unique_key ist int mit einem Standardwert von 0.

  • 0 gibt eine n:1- oder n:n-Verknüpfung an.

  • 1 gibt eine 1:1- oder 1:n-Verknüpfung an.

Dieser Wert ist 1 der Fall, wenn die Verknüpfungsspalten einen eindeutigen Schlüssel in @join_article bilden oder wenn @join_filterclause zwischen einem Fremdschlüssel in @article und einem Primärschlüssel in @join_article liegt.

Achtung

Legen Sie diesen Parameter nur fest, 1 wenn Sie eine Einschränkung für die Verknüpfungsspalte in der zugrunde liegenden Tabelle für den übergeordneten Artikel haben, der die Eindeutigkeit garantiert. Wenn @join_unique_key falsch festgelegt 1 ist, kann die Nichtkonvergenz von Daten auftreten.

[ @force_invalidate_snapshot = ] force_invalidate_Momentaufnahme

Erkennt an, dass die von dieser gespeicherten Prozedur ausgeführte Aktion möglicherweise eine vorhandene Momentaufnahme ungültig macht. @force_invalidate_Momentaufnahme ist bit, mit einem Standardwert von 0.

  • 0Gibt an, dass Änderungen am Seriendruckartikel nicht dazu führen, dass die Momentaufnahme ungültig sind. Wenn die gespeicherte Prozedur erkennt, dass die Änderungen eine neue Momentaufnahme erfordern, tritt ein Fehler auf und es werden keine Änderungen vorgenommen.

  • 1Gibt an, dass Änderungen am Seriendruckartikel dazu führen können, dass die Momentaufnahme ungültig sind, und wenn vorhandene Abonnements vorhanden sind, die eine neue Momentaufnahme erfordern, erteilen Sie die Berechtigung, dass die vorhandene Momentaufnahme als veraltet gekennzeichnet und eine neue Momentaufnahme generiert wird.

[ @force_reinit_subscription = ] force_reinit_subscription

Bestätigt, dass die von dieser gespeicherten Prozedur ausgeführte Aktion möglicherweise das erneute Initialisieren von vorhandenen Abonnements erfordert. @force_reinit_subscription ist bit, mit einem Standardwert von 0.

  • 0 Gibt an, dass Änderungen am Seriendruckartikel nicht dazu führen, dass das Abonnement erneut initialisiert wird. Wenn die gespeicherte Prozedur erkennt, dass die Änderung abonnements erneut initialisiert werden muss, tritt ein Fehler auf, und es werden keine Änderungen vorgenommen.

  • 1 Gibt an, dass Änderungen am Seriendruckartikel dazu führen, dass vorhandene Abonnements erneut initialisiert werden, und erteilt die Berechtigung für die Erneute Initialisierung des Abonnements.

[ @filter_type = ] filter_type

Gibt den Typ des Filters an, der hinzugefügt wird. @filter_type ist winzig und kann einer der folgenden Werte sein.

Wert Beschreibung
1 Nur Joinfilter. Erforderlich, um SQL Server Compact-Abonnenten zu unterstützen.
2 Nur logische Datensatzbeziehung.
3 Sowohl Joinfilter als auch logische Datensatzbeziehung.

Weitere Informationen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

Rückgabecodewerte

0 (Erfolg) oder 1 (Fehler).

Hinweise

sp_addmergefilter wird in der Seriendruckreplikation verwendet.

sp_addmergefilter kann nur mit Tabellenartikeln verwendet werden. Ansichts- und indizierte Ansichtsartikel werden nicht unterstützt.

Dieses Verfahren kann auch verwendet werden, um eine logische Beziehung zwischen zwei Artikeln hinzuzufügen, die möglicherweise einen Verknüpfungsfilter dazwischen haben. @filter_type wird verwendet, um anzugeben, ob der hinzugefügte Zusammenführungsfilter ein Verknüpfungsfilter, eine logische Beziehung oder beides ist.

Um logische Datensätze zu verwenden, müssen die Publikation und die Artikel mehrere Anforderungen erfüllen. Weitere Informationen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

In der Regel wird diese Option für einen Artikel verwendet, der einen Fremdschlüsselverweis auf eine veröffentlichte Primärschlüsseltabelle darstellt, und die Primärschlüsseltabelle verfügt über einen filter, der in seinem Artikel definiert ist. Mithilfe der Teilmenge von Primärschlüsselzeilen werden die Fremdschlüsselzeilen ermittelt, die auf den Abonnenten repliziert werden.

Sie können keinen Verknüpfungsfilter zwischen zwei veröffentlichten Artikeln hinzufügen, wenn die Quelltabellen für beide Artikel denselben Tabellenobjektnamen verwenden. In einem solchen Fall schlägt die Erstellung des Verknüpfungsfilters fehl, auch wenn beide Tabellen unterschiedliche Schemas besitzen und eindeutige Artikelnamen aufweisen.

Werden sowohl ein parametrisierter Zeilenfilter als auch ein Joinfilter für einen Tabellenartikel verwendet, ermittelt die Replikation, ob eine Zeile der Partition eines Abonnenten angehört. Dies geschieht, indem entweder die Filterfunktion oder der Verknüpfungsfilter (mit dem OPERATOR OR ) ausgewertet wird, anstatt die Schnittmenge der beiden Bedingungen (mit dem AND-Operator ) zu bewerten.

Beispiele

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

Berechtigungen

Nur Mitglieder der festen Serverrolle sysadmin oder db_owner feste Datenbankrolle können ausgeführt werden sp_addmergefilter.