Definizione e modifica di un filtro di join tra articoli di mergeDefine and Modify a Join Filter Between Merge Articles

In questo argomento viene descritto come definire e modificare un filtro di join tra articoli di merge in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to define and modify a join filter between merge articles in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. La replica di tipo merge supporta i filtri di join, solitamente utilizzati in combinazione con filtri con parametri per estendere il partizionamento della tabella ad altri articoli correlati.Merge replication supports join filters, which are typically used in conjunction with parameterized filters to extend table partitioning to other related table articles.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Limitazioni e restrizioni Limitations and Restrictions

  • Per creare un filtro di join, la pubblicazione deve contenere almeno due tabelle correlate.To create a join filter, a publication must contain at least two related tables. Dal momento che i filtri join rappresentano un'estensione dei filtri di riga, è necessario definire prima un filtro di riga in una tabella da estendere con un join a un'altra tabella.A join filter extends a row filter; therefore you must define a row filter on one table before you can extend the filter with a join to another table. Dopo aver definito un filtro di join, è possibile estenderlo con un altro filtro di join se la pubblicazione contiene ulteriori tabelle correlate.After one join filter is defined, you can extend this join filter with another join filter if the publication contains additional related tables.

  • Se si aggiunge, modifica o elimina un filtro di join dopo che sono state inizializzate sottoscrizioni per la pubblicazione, è necessario generare un nuovo snapshot e reinizializzare tutte le sottoscrizioni in seguito alla modifica.If you add, modify, or delete a join filter after subscriptions to the publication have been initialized, you must generate a new snapshot and reinitialize all subscriptions after making the change. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.For more information about requirements for property changes, see Change Publication and Article Properties.

Indicazioni Recommendations

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Definire, modificare ed eliminare filtri join nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione>.Define, modify, and delete join filters on the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box. Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

Per definire un filtro di joinTo define a join filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro di riga o un filtro di join esistente nel riquadro Tabelle filtrate.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select an existing row filter or join filter in the Filtered Tables pane.

  2. Fare clic su Aggiungie quindi su Aggiungi join per estendere il filtro selezionato.Click Add, and then click Add Join to Extend the Selected Filter.

  3. Creare l'istruzione per il join. Selezionare Per compilare l'istruzione verrà utilizzato il generatore o L'istruzione per il join verrà scritta manualmente.Create the join statement: select either Use the builder to create the statement or Write the join the statement manually.

    • Se si sceglie di utilizzare il generatore, utilizzare le colonne della griglia, ovveroCongiunzione, Colonna tabella filtrata, Operatoree Colonna tabella unita in join, per compilare un'istruzione per il join.If you select to use the builder, use the columns in the grid (Conjunction, Filtered table column, Operator, and Joined table column) to build a join statement.

      In tutte le colonne della griglia è disponibile una casella combinata a discesa, che consente di selezionare due colonne e un operatore (=, <>, <=, <, >=, >e like).Each column in the grid contains a drop-down combo box, allowing you to select two columns and an operator (=, <>, <=, <, >=, >, and like). I risultati vengono visualizzati nell'area di testo Anteprima .The results are displayed in the Preview text area. Se il join è associato a più di due colonne, selezionare una congiunzione (AND oppure OR) dalla colonna Congiunzione e quindi immettere altre due colonne e un operatore.If the join involves more than one pair of columns, select a conjunction (AND or OR) from the Conjunction column, and then enter two more columns and an operator.

    • Se si sceglie di scrivere manualmente l'istruzione per il join, digitarla nell'area di testo Istruzione per il join .If you select to write the statement manually, write the join statement in the Join statement text area. Utilizzare le caselle di riepilogo Colonne tabella filtrata e Colonne tabella unita in join per trascinare le colonne nell'area di testo Istruzione per il join .Use the Filtered table columns list box and the Joined table columns list box to drag and drop columns to the Join statement text area.

    • L'istruzione per il join completa sarà simile alla seguente:The complete join statement would appear like:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]  
      

      Per la clausola JOIN è necessario utilizzare nomi composti da due parti, in quanto la denominazione a tre e quattro parti non è supportata.The JOIN clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. Specificare le opzioni per il join:Specify join options:

    • Se la colonna nella quale viene eseguito il join della tabella filtrata, ovvero la tabella padre, è univoca, selezionare Chiave univoca.If the column on which you join in the filtered table (the parent table) is unique, select Unique key.

      Attenzione

      Selezionando questa opzione si indica che la relazione tra la tabella padre e le tabelle figlio in un filtro join è uno-a-uno o uno-a-molti.Selecting this option indicates that the relationship between the child and parent tables in a join filter is one to one or one to many. Utilizzare questa opzione solo se esiste un vincolo nella colonna di join della tabella figlio che garantisce l'univocità.Only select this option if you have a constraint on the joining column in the child table that guarantees uniqueness. Se l'opzione è impostata in modo errato può impedire la convergenza dei dati.If the option is set incorrectly, non-convergence of data can occur.

    • Per impostazione predefinita, durante la sincronizzazione la replica di tipo merge elabora le modifiche riga per riga.By default, merge replication processes changes on a row-by-row basis during synchronization. Per elaborare come singola unità modiche correlate presenti sia in righe della tabella filtrata sia della tabella unita in join, selezionare Record logico ( MicrosoftMicrosoft SQL Server 2005SQL Server 2005 e versioni successive).To have related changes in rows of both the filtered table and the joined table processed as a unit, select Logical record ( MicrosoftMicrosoft SQL Server 2005SQL Server 2005 and later versions only). Questa opzione è disponibile solo se sono soddisfatti i requisiti relativi all'utilizzo dei record logici negli articoli e nelle pubblicazioni.This option is available only if the article and publication requirements for using logical records are met. Per altre informazioni, vedere la sezione "Considerazioni sull'utilizzo di record logici" in Raggruppare modifiche alle righe correlate con record logici.For more information see the section "Considerations for Using Logical Records" in Group Changes to Related Rows with Logical Records.

  5. Fare clic su OK.Click OK.

  6. Se è visualizzata la finestra di dialogo Proprietà pubblicazione - <Pubblicazione> fare clic su OK per salvare e chiudere la finestra di dialogo.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

Per modificare un filtro joinTo modify a join filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Modifica.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Edit.

  2. Nella finestra di dialogo Modifica join modificare il filtro.In the Edit Join dialog box, modify the filter.

  3. Fare clic su OK.Click OK.

Per eliminare un filtro joinTo delete a join filter

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Elimina.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Delete. Se il filtro di join eliminato è esteso da altri join, anch'essi verranno eliminati.If the join filter you delete is itself extended by other joins, those joins will also be deleted.

Utilizzo di Transact-SQL Using Transact-SQL

Tali procedure indicano un filtro con parametri su un articolo padre con filtri di join tra questo articolo e gli articoli figlio correlati.These procedures show a parameterized filter on a parent article with join filters between this article and related child articles. I filtri join possono essere definiti e modificati a livello di programmazione tramite le stored procedure di replica.Join filters can be defined and modified programmatically using replication stored procedures.

Per definire un filtro join per estendere un filtro di articolo agli articoli correlati in una pubblicazione di tipo mergeTo define a join filter to extend an article filter to related articles in a merge publication

  1. Definire il filtro per l'articolo da unire in join, ovvero l'articolo padre.Define the filtering for the article being joined to, which is also known as the parent article.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL) per definire uno o più articoli correlati, noti anche come articoli figlio, per la pubblicazione.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL) to define one or more related articles, which are also known as child articles, for the publication. Per altre informazioni, vedere Define an Article.For more information, see Define an Article.

  3. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergefilter (Transact-SQL).At the Publisher on the publication database, execute sp_addmergefilter (Transact-SQL). Specificare @publication, un nome univoco per il filtro per @filtername, il nome dell'articolo figlio creato nel passaggio 2 per @article, il nome dell'articolo padre da unire in join per @join_articlenamee uno dei valori seguenti per @join_unique_key:Specify @publication, a unique name for this filter for @filtername, the name of the child article created in step 2 for @article, the name of the parent article being joined to for @join_articlename, and one of the following values for @join_unique_key:

    • 0 : indica un join molti-a-uno o molti-a-molti tra gli articoli padre e figlio.0 - indicates a many-to-one or many-to-many join between the parent and child articles.

    • 1 : indica un join uno-a-uno o uno-a-molti tra gli articoli padre e figlio.1 - indicates a one-to-one or one-to-many join between the parent and child articles.

      In questo modo viene definito un filtro join tra i due articoli.This defines a join filter between the two articles.

    Attenzione

    Impostare @join_unique_key su 1 solo se l'univocità è garantita da un vincolo nella colonna unita tramite join nella tabella sottostante per l'articolo padre.Only set @join_unique_key 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, è possibile che si verifichi la non convergenza dei dati.If @join_unique_key is set to 1 incorrectly, non-convergence of data may occur.

Esempi (Transact-SQL) Examples (Transact-SQL)

In questo esempio viene definito un articolo per una pubblicazione di tipo merge, in cui all'articolo della tabella SalesOrderDetail viene applicato un filtro sulla tabella SalesOrderHeader , che presenta essa stessa un filtro di riga statico.This example defines an article for a merge publication, where the SalesOrderDetail table article is filtered against the SalesOrderHeader table that is itself filtered using a static row filter. Per altre informazioni, vedere Define and Modify a Static Row Filter.For more information, see Define and Modify a Static Row Filter.

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

In questo esempio viene definito un gruppo di articoli di una pubblicazione di tipo merge in cui agli articoli è applicata una serie di filtri di join sulla tabella Employee , che presenta essa stessa un filtro di riga con parametri sul valore HOST_NAME nella colonna LoginID .This example defines a group of articles in a merge publication where the articles are filtered with a series of join filters against the Employee table that is itself filtered using a parameterized row filter on the value of HOST_NAME in the LoginID column. Per altre informazioni, vedere Define and Modify a Parameterized Row Filter for a Merge Article.For more information, see Define and Modify a Parameterized Row Filter for a Merge Article.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2012];

-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2012.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

Vedere ancheSee Also

Filtri di join Join Filters
Filtri di riga con parametri Parameterized Row Filters
Modificare le proprietà di pubblicazioni e articoli Change Publication and Article Properties
Filtrare i dati pubblicati per la replica di tipo merge Filter Published Data for Merge Replication
Procedura: Definire e modificare un filtro di join tra articoli di merge (SQL Server Management Studio) How to: Define and Modify a Join Filter Between Merge Articles (SQL Server Management Studio)
Concetti di base relativi alle stored procedure del sistema di replica Replication System Stored Procedures Concepts
Definire una relazione tra record logici degli articoli di tabelle di merge Define a Logical Record Relationship Between Merge Table Articles
Definire e modificare un filtro di riga con parametri per un articolo di merge Define and Modify a Parameterized Row Filter for a Merge Article