sp_addmergefilter (Transact-SQL)sp_addmergefilter (Transact-SQL)

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database (Managed Instance uniquement) nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure SQL Data Warehouse noParallel Data Warehouse

Ajoute un nouveau filtre de fusion pour créer une partition basée sur une jointure avec une autre table.Adds a new merge filter to create a partition based on a join with another table. Cette procédure stockée est exécutée sur le serveur de publication dans la base de données de publication.This stored procedure is executed at the Publisher on the publication database.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

  
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 ]  

ArgumentsArguments

[ @publication = ] 'publication'Nom de la publication dans laquelle le filtre de fusion est ajouté.[ @publication = ] 'publication' Is the name of the publication in which the merge filter is being added. publication est de type sysname, sans valeur par défaut.publication is sysname, with no default.

[ @article = ] 'article'Nom de l’article sur lequel le filtre de fusion est ajouté.[ @article = ] 'article' Is the name of the article on which the merge filter is being added. article est de type sysnameet n’a pas de valeur par défaut.article is sysname, with no default.

[ @filtername = ] 'filtername'Nom du filtre.[ @filtername = ] 'filtername' Is the name of the filter. FilterName est un paramètre obligatoire.filtername is a required parameter. FilterNameest de type sysname, sans valeur par défaut.filternameis sysname, with no default.

[ @join_articlename = ] 'join_articlename'Article parent auquel l’article enfant, spécifié par l’article, doit être joint à l’aide de la clause join spécifiée par join_filterclause, afin de déterminer les lignes de l’article enfant qui répondent au critère de filtre du filtre de fusion.[ @join_articlename = ] 'join_articlename' Is the parent article to which the child article, specified by article, must be joined using the join clause specified by join_filterclause, in order to determine the rows in the child article that meet the filter criterion of the merge filter. join_articlename est de type sysname, sans valeur par défaut.join_articlename is sysname, with no default. L’article doit figurer dans la publication donnée par publication.The article must be in the publication given by publication.

[ @join_filterclause = ] join_filterclauseClause de jointure qui doit être utilisée pour joindre l’article enfant spécifié par l'article et l’article parent spécifié par join_article, afin de déterminer les lignes qualifiant le filtre de fusion.[ @join_filterclause = ] join_filterclause Is the join clause that must be used to join the child article specified by articleand parent article specified by join_article, in order to determine the rows qualifying the merge filter. join_filterclause est de type nvarchar (1000) .join_filterclause is nvarchar(1000).

[ @join_unique_key = ] join_unique_keySpécifie si la jointure entre l'article enfant et l’article parent join_articleest un-à-plusieurs, un-à-un, plusieurs-à-un ou plusieurs-à-plusieurs.[ @join_unique_key = ] join_unique_key Specifies if the join between child article articleand parent article join_articleis one-to-many, one-to-one, many-to-one, or many-to-many. join_unique_key est de type int, avec 0 comme valeur par défaut.join_unique_key is int, with a default of 0. 0 indique une jointure plusieurs-à-un ou plusieurs-à-plusieurs.0 indicates a many-to-one or many-to-many join. 1 indique une jointure un-à-un ou un-à-plusieurs.1 indicates a one-to-one or one-to-many join. Cette valeur est 1 lorsque les colonnes de jointure forment une clé unique dans join_article, ou si join_filterclause est entre une clé étrangère dans l’article et une clé primaire dans join_article.This value is 1 when the joining columns form a unique key in join_article, or if join_filterclause is between a foreign key in article and a primary key in join_article.

Attention

N’affectez la valeur 1 à ce paramètre que si vous avez une contrainte sur la colonne de jointure dans la table sous-jacente pour l’article parent qui garantit l’unicité.Only set this parameter to 1 if you have a constraint on the joining column in the underlying table for the parent article that guarantees uniqueness. Si join_unique_key a la valeur 1 de manière incorrecte, la non-convergence des données peut se produire.If join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

[ @force_invalidate_snapshot = ] force_invalidate_snapshotConfirme que l’action entreprise par cette procédure stockée peut invalider un instantané existant.[ @force_invalidate_snapshot = ] force_invalidate_snapshot Acknowledges that the action taken by this stored procedure may invalidate an existing snapshot. force_invalidate_snapshot est un bit, avec 0comme valeur par défaut.force_invalidate_snapshot is a bit, with a default 0.

0 indique que les modifications apportées à l’article de fusion n’entraînent pas la non-validité de l’instantané.0 specifies that changes to the merge article will not cause the snapshot to be invalid. Si la procédure stockée détecte que la modification requiert un nouvel instantané, une erreur est générée et aucune modification n'est effectuée.If the stored procedure detects that the change does require a new snapshot, an error will occur and no changes will be made.

1 indique que les modifications apportées à l’article de fusion peuvent entraîner la non-validité de l’instantané, et s’il existe des abonnements qui nécessitent un nouvel instantané, accorde l’autorisation de marquer l’instantané existant comme obsolète et de générer un nouvel instantané.1 specifies that changes to the merge article may cause the snapshot to be invalid, and if there are existing subscriptions that would require a new snapshot, gives permission for the existing snapshot to be marked as obsolete and a new snapshot generated.

[ @force_reinit_subscription = ] force_reinit_subscriptionConfirme que l’action entreprise par cette procédure stockée peut nécessiter la réinitialisation des abonnements existants.[ @force_reinit_subscription = ] force_reinit_subscription Acknowledges that the action taken by this stored procedure may require existing subscriptions to be reinitialized. force_reinit_subscription est un bit, avec 0 comme valeur par défaut.force_reinit_subscription is a bit, with a default of 0.

0 indique que les modifications apportées à l’article de fusion n’entraînent pas la réinitialisation de l’abonnement.0 specifies that changes to the merge article will not cause the subscription to be reinitialized. Si la procédure stockée détecte que la modification requiert la réinitialisation des abonnements, une erreur est générée et aucune modification n'est effectuée.If the stored procedure detects that the change would require subscriptions to be reinitialized, an error will occur and no changes will be made.

1 indique que les modifications apportées à l’article de fusion entraînent la réinitialisation des abonnements existants et autorisent la réinitialisation de l’abonnement.1 specifies that changes to the merge article will cause existing subscriptions to be reinitialized, and gives permission for the subscription reinitialization to occur.

[ @filter_type = ] filter_typeSpécifie le type de filtre ajouté.[ @filter_type = ] filter_type Specifies the type of filter being added. filter_type est de type tinyintet peut prendre l’une des valeurs suivantes.filter_type is tinyint, and can be one of the following values.

ValueValue DescriptionDescription
11 Filtre de jointure uniquement.Join filter only. Requis pour prendre SQL Server CompactSQL Server Compact en charge les abonnés.Required to support SQL Server CompactSQL Server Compact Subscribers.
22 Uniquement relation logique.Logical record relationship only.
33 Filtre de jointure et relation logique.Both join filter and logical record relationship.

Pour plus d’informations, consultez Regrouper les modifications apportées à des lignes connexes à l’aide d’enregistrements logiques.For more information, see Group Changes to Related Rows with Logical Records.

Valeurs des codes de retourReturn Code Values

0 (succès) ou 1 (échec)0 (success) or 1 (failure)

NotesRemarks

sp_addmergefilter est utilisé dans la réplication de fusion.sp_addmergefilter is used in merge replication.

sp_addmergefilter peut uniquement être utilisé avec des Articles de table.sp_addmergefilter can only be used with table articles. Les articles de vue et de vue indexée ne sont pas pris en charge.View and indexed view articles are not supported.

Vous pouvez également l'utiliser pour ajouter une relation logique entre deux articles qui peuvent ou non avoir un filtre de jointure entre eux.This procedure can also be used to add a logical relationship between two articles that may or may not have a join filter between them. filter_type est utilisé pour spécifier si le filtre de fusion ajouté est un filtre de jointure, une relation logique ou les deux.filter_type is used to specify if the merge filter being added is a join filter, a logical relation, or both.

Pour utiliser des enregistrements logiques, la publication et les articles doivent répondre à certaines conditions.To use logical records, the publication and articles must meet a number of requirements. Pour plus d’informations, consultez Regrouper les modifications apportées à des lignes connexes à l’aide d’enregistrements logiques.For more information, see Group Changes to Related Rows with Logical Records.

Cette option est généralement utilisée pour un article qui fait référence à une clé étrangère dans une table de clés primaires publiée, et lorsque la table de clés primaires a un filtre défini dans cet article.Typically, this option is used for an article that has a foreign key reference to a published primary key table, and the primary key table has a filter defined in its article. Le sous-ensemble de lignes de clés primaires est utilisé pour déterminer les lignes de clés étrangères répliquées côté abonné.The subset of primary key rows is used to determine the foreign key rows that are replicated to the Subscriber.

Vous ne pouvez pas ajouter de filtre de jointure entre deux articles publiés, lorsque les tables source des deux articles partagent le même nom d'objet de table.You cannot add a join filter between two published articles when the source tables for both articles share the same table object name. Dans ce cas, la création du filtre de jointure échouera même si les deux tables sont détenues par des schémas différents et ont des noms d'article unique.In such a case, even if both tables are owned by different schemas and have unique article names, creation of the join filter will fail.

Lorsqu'un filtre de lignes paramétrable et un filtre de jointure sont tous deux utilisés sur un article de table, la réplication détermine si une ligne appartient à une partition de l'abonné.When both a parameterized row filter and a join filter are used on a table article, replication determines whether a row belongs in a Subscriber's partition. Pour ce faire, il évalue la fonction de filtrage ou le filtre de jointure (à l’aide de l’opérateur or ), au lieu d’évaluer l’intersection des deux conditions (à l’aide de l’opérateur and ).It does so by evaluating either the filtering function or the join filter (using the OR operator), rather than evaluating the intersection of the two conditions (using the AND operator).

ExempleExample

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

AutorisationsPermissions

Seuls les membres du rôle serveur fixe sysadmin ou du rôle de base de données fixe db_owner peuvent exécuter sp_addmergefilter.Only members of the sysadmin fixed server role or db_owner fixed database role can execute sp_addmergefilter.

Voir aussiSee Also

Define an Article Define an Article
Définir et modifier un filtre de jointure entre des articles de fusion Define and Modify a Join Filter Between Merge Articles
Filtres de jointure Join Filters
sp_changemergefilter (Transact-SQL) sp_changemergefilter (Transact-SQL)
sp_dropmergefilter (Transact-SQL) sp_dropmergefilter (Transact-SQL)
sp_helpmergefilter (Transact-SQL) sp_helpmergefilter (Transact-SQL)
Procédures stockées de réplication (Transact-SQL)Replication Stored Procedures (Transact-SQL)