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

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)noDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Aggiunge un nuovo filtro di merge per la creazione di una partizione in base a un join con un'altra tabella.Adds a new merge filter to create a partition based on a join with another table. Questa stored procedure viene eseguita nel database di pubblicazione del server di pubblicazione.This stored procedure is executed at the Publisher on the publication database.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax


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 ]  

ArgomentiArguments

[ @publication= ] 'pubblicazione'[ @publication= ] 'publication'
Nome della pubblicazione nella quale viene aggiunto il filtro di merge.Is the name of the publication in which the merge filter is being added. pubblicazione è sysname, non prevede alcun valore predefinito.publication is sysname, with no default.

[ @article= ] 'articolo'[ @article= ] 'article'
Nome dell'articolo nel quale viene aggiunto il filtro di merge.Is the name of the article on which the merge filter is being added. articolo è sysname, non prevede alcun valore predefinito.article is sysname, with no default.

[ @filtername= ] 'filtername'[ @filtername= ] 'filtername'
Nome del filtro.Is the name of the filter. FilterName è un parametro obbligatorio.filtername is a required parameter. FilterNameè sysname, non prevede alcun valore predefinito.filternameis sysname, with no default.

[ @join_articlename= ] 'join_articlename'[ @join_articlename= ] 'join_articlename'
Articolo padre al quale l'articolo figlio specificato da articolo, deve essere unito tramite la clausola join specificata da join_filterclauseper determinare le righe dell'articolo figlio che soddisfano il criterio di filtro del filtro di merge.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 è sysname, non prevede alcun valore predefinito.join_articlename is sysname, with no default. L'articolo deve essere incluso nella pubblicazione specificata da pubblicazione.The article must be in the publication given by publication.

[ @join_filterclause= ] join_filterclause[ @join_filterclause= ] join_filterclause
Clausola join che deve essere utilizzata per unire l'articolo figlio specificato da articoloe l'articolo padre specificato da join_articleper determinare le righe che soddisfano il filtro di merge.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 è nvarchar (1000).join_filterclause is nvarchar(1000).

[ @join_unique_key= ] join_unique_key[ @join_unique_key= ] join_unique_key
Specifica se il join tra l'articolo figlio articoloe l'articolo padre join_articleè uno-a-molti, uno a uno, molti-a-uno o molti-a-molti.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 è int, con un valore predefinito è 0.join_unique_key is int, with a default of 0. 0 indica un join molti-a-uno o molti-a-molti.0 indicates a many-to-one or many-to-many join. 1 indica un join uno a uno o uno-a-molti.1 indicates a one-to-one or one-to-many join. Questo valore è 1 quando le colonne di join formano una chiave univoca in join_article, o se join_filterclause tra una chiave esterna in articolo e una chiave primaria in 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.

Attenzione

Impostare questo parametro solo 1 se si dispone di un vincolo nella colonna di join della tabella sottostante per l'articolo padre che garantisce l'univocità.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. Se join_unique_key è impostato su 1 in modo errato, si verifichi la non convergenza dei dati.If join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

[ @force_invalidate_snapshot= ] force_invalidate_snapshot[ @force_invalidate_snapshot= ] force_invalidate_snapshot
Segnala che l'azione eseguita da questa stored procedure potrebbe invalidare uno snapshot esistente.Acknowledges that the action taken by this stored procedure may invalidate an existing snapshot. force_invalidate_snapshot è un bit, con valore predefinito è 0.force_invalidate_snapshot is a bit, with a default 0.

0 specifica che le modifiche apportate all'articolo di merge non provocherà lo snapshot.0 specifies that changes to the merge article will not cause the snapshot to be invalid. Se la stored procedure rileva che la modifica richiede un nuovo snapshot, viene generato un errore e non viene apportata alcuna modifica.If the stored procedure detects that the change does require a new snapshot, an error will occur and no changes will be made.

1 specifica che le modifiche apportate all'articolo di merge potrebbero invalidare lo snapshot potrebbe non essere valido e se sono disponibili sottoscrizioni che richiedono un nuovo snapshot, consente lo snapshot esistente deve essere contrassegnato come obsoleto e di un nuovo snapshot generato.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_subscription[ @force_reinit_subscription= ] force_reinit_subscription
Segnala che l'azione eseguita dalla stored procedure potrebbe richiedere la reinizializzazione delle sottoscrizioni esistenti.Acknowledges that the action taken by this stored procedure may require existing subscriptions to be reinitialized. force_reinit_subscription è un bit, con un valore predefinito è 0.force_reinit_subscription is a bit, with a default of 0.

0 indica che le modifiche apportate all'articolo di merge non comportano la reinizializzazione della sottoscrizione.0 specifies that changes to the merge article will not cause the subscription to be reinitialized. Se la stored procedure rileva che la modifica richiede la reinizializzazione delle sottoscrizioni, viene generato un errore e non viene apportata alcuna modifica.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 indica che le modifiche apportate all'articolo di merge comportano la reinizializzazione delle sottoscrizioni esistenti e concede l'autorizzazione per la reinizializzazione della sottoscrizione.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_type[ @filter_type= ] filter_type
Specifica il tipo di filtro da aggiungere.Specifies the type of filter being added. filter_type è tinyint, e può essere uno dei valori seguenti.filter_type is tinyint, and can be one of the following values.

ValoreValue DescrizioneDescription
11 Solo filtro di join.Join filter only. Necessario per supportare SQL Server CompactSQL Server Compact sottoscrittori.Required to support SQL Server CompactSQL Server Compact Subscribers.
22 Solo relazione tra record logici.Logical record relationship only.
33 Filtro di join e relazione tra record logici.Both join filter and logical record relationship.

Per altre informazioni, vedere Raggruppare modifiche alle righe correlate con record logici.For more information, see Group Changes to Related Rows with Logical Records.

Valori restituitiReturn Code Values

0 (esito positivo) o 1 (errore)0 (success) or 1 (failure)

OsservazioniRemarks

sp_addmergefilter viene utilizzata nella replica di tipo merge.sp_addmergefilter is used in merge replication.

sp_addmergefilter può essere utilizzato solo con gli articoli di tabella.sp_addmergefilter can only be used with table articles. Gli articoli di vista e di vista indicizzata non sono supportati.View and indexed view articles are not supported.

Questa procedura può inoltre essere utilizzata per aggiungere una relazione logica tra due articoli che possono essere uniti o meno tramite un filtro di join.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 viene utilizzata per specificare se il filtro di merge viene aggiunto è un filtro di join, una relazione logica oppure entrambi.filter_type is used to specify if the merge filter being added is a join filter, a logical relation, or both.

Per utilizzare record logici, è necessario che la pubblicazione e gli articoli soddisfino alcuni requisiti.To use logical records, the publication and articles must meet a number of requirements. Per altre informazioni, vedere Raggruppare modifiche alle righe correlate con record logici.For more information, see Group Changes to Related Rows with Logical Records.

Questa opzione viene generalmente utilizzata per gli articoli che includono un riferimento di chiave esterna a una chiave primaria su una tabella pubblicata e tale tabella include un filtro definito nell'articolo corrispondente.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. Il subset di righe della chiave primaria viene utilizzato per determinare le righe di chiave esterna da replicare nel Sottoscrittore.The subset of primary key rows is used to determine the foreign key rows that are replicated to the Subscriber.

Non è possibile aggiungere un filtro di join tra due articoli pubblicati se le tabelle di origine per entrambi gli articoli condividono lo stesso nome di oggetto tabella.You cannot add a join filter between two published articles when the source tables for both articles share the same table object name. In questo caso, anche se entrambe le tabelle appartengono a schemi diversi e sono caratterizzate da nomi di articolo univoci, la creazione del filtro di join avrà esito negativo.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.

In caso di utilizzo di un filtro di riga con parametri e un filtro di join in un articolo di tabella, la replica determina se una riga appartiene a una partizione del SottoscrittoreWhen 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. Ciò avviene tramite la valutazione della funzione di filtro o il filtro di join (utilizzando la OR operatore), anziché la valutazione dell'intersezione delle due condizioni (utilizzando la AND operatore).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).

EsempioExample

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

PermissionsPermissions

Solo i membri del sysadmin ruolo predefinito del server o db_owner ruolo predefinito del database possono eseguire sp_addmergefilter.Only members of the sysadmin fixed server role or db_owner fixed database role can execute sp_addmergefilter.

Vedere ancheSee Also

Define an Article Define an Article
Definire e modificare un filtro di Join tra articoli di Merge Define and Modify a Join Filter Between Merge Articles
Join Filters 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)
Stored procedure per la replica (Transact-SQL)Replication Stored Procedures (Transact-SQL)