Vorgehensweise: Erstellen eines Snapshots für Mergepublikationen mit parametrisierten Filtern (Replikationsprogrammierung mit Transact-SQL)

Zur Erstellung eines Snapshots für Veröffentlichungen mit parametrisierten Filtern müssen Sie zunächst einen Standardsnapshot (Schemasnapshot) erstellen, der alle veröffentlichten Daten und die Abonnentenmetadaten für das Abonnement enthält. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL). Nachdem Sie den Schemasnapshot erstellt haben, können Sie den Teil des Snapshots generieren, der die abonnentenspezifische Partition der veröffentlichten Daten enthält.

Mithilfe von gespeicherten Prozeduren und dem Snapshot-Agent können Sie:

  • Abonnenten erlauben, Snapshotgenerierung und -anwendung beim erstmaligen Synchronisieren anzufordern.

  • Snapshots für jede Partition vorabgenerieren.

  • Manuell einen Snapshot für jeden Abonnenten generieren.

    Sicherheitshinweis   Benutzer sollten nach Möglichkeit dazu aufgefordert werden, Sicherheitsanmeldeinformationen zur Laufzeit anzugeben. Wenn Anmeldeinformationen in einer Skriptdatei gespeichert werden müssen, muss die Datei geschützt werden, um unberechtigte Zugriffe zu verhindern.

So erstellen Sie eine Veröffentlichung, die es Abonnenten ermöglicht, die Generierung und Übermittlung von Snapshots zu initiieren

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergepublication (Transact-SQL) aus. Geben Sie die folgenden Parameter an:

    • Den Namen der Veröffentlichung für @publication.

    • Den Wert true für @allow_subscriber_initiated_snapshot, wodurch es Abonnenten ermöglicht wird, den Snapshotprozess zu initiieren.

    • (Optional) Für @max_concurrent_dynamic_snapshots die Anzahl dynamischer Snapshotprozesse, die gleichzeitig ausgeführt werden können. Wird die maximale Anzahl von Prozessen ausgeführt, wenn ein Abonnent versucht, einen Snapshot zu generieren, wird der Prozess in eine Warteschlange eingefügt. Standardmäßig gibt es für die Anzahl gleichzeitig ausgeführter Prozesse keine Beschränkung.

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 verwendeten Veröffentlichungsnamen für @publication und die Microsoft Windows-Anmeldeinformationen, unter denen der Replikationssnapshot-Agent ausgeführt wird, für @job_name und @job_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem den Wert 0 für @publisher_security_mode und die MicrosoftSQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Snapshot-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie ein Anfangssnapshot generiert und ein benutzerdefinierter Zeitplan für den Snapshot-Agent definiert wird, finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

    SicherheitshinweisSicherheitshinweis

     Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter einschließlich job_login und job_password bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Verschlüsseln von Verbindungen zu SQL Server.

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für einen oder mehrere Artikel angeben. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel (Replikationsprogrammierung mit Transact-SQL).

  4. Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfung oder die logische Datensatzbeziehung zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln (Replikationsprogrammierung mit Transact-SQL).

  5. Wenn der Merge-Agent den Snapshot zur Initialisierung des Abonnenten anfordert, wird der Snapshot für die anfordernde Partition des Abonnements automatisch generiert.

So erstellen Sie eine Veröffentlichung, und generieren vorab Snapshots oder aktualisieren sie automatisch

  1. Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Veröffentlichung zu erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer Veröffentlichung (Replikationsprogrammierung mit Transact-SQL).

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 verwendeten Veröffentlichungsnamen für @publication und die Windows-Anmeldeinformationen, unter denen der Snapshot-Agent ausgeführt wird, für @job_name und @job_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem den Wert 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Snapshot-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie ein Anfangssnapshot generiert und ein benutzerdefinierter Zeitplan für den Snapshot-Agent definiert wird, finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

    SicherheitshinweisSicherheitshinweis

     Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter einschließlich job_login und job_password bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Verschlüsseln von Verbindungen zu SQL Server.

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für einen Artikel angeben. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel (Replikationsprogrammierung mit Transact-SQL).

  4. Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfung oder die logische Datensatzbeziehung zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln (Replikationsprogrammierung mit Transact-SQL).

  5. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_helpmergepublication (Transact-SQL) aus, wobei Sie für @publication den in Schritt 1 verwendeten Wert angeben. Achten Sie auf den Wert von snapshot_jobid im Resultset.

  6. Konvertieren Sie den in Schritt 5 ermittelten Wert von snapshot_jobid in uniqueidentifier.

  7. Führen Sie auf dem Verleger für die msdb-Datenbank sp_start_job (Transact-SQL) aus, wobei Sie den in Schritt 1 konvertierten Wert für @job_id angeben.

  8. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergepartition (Transact-SQL) aus. Geben Sie den Namen der Veröffentlichung aus Schritt 1 für @publication und den zur Definition der Partition verwendeten Wert entweder für @suser_sname, wenn SUSER_SNAME (Transact-SQL) in der Filterklausel verwendet wird, oder für @host_name an, wenn HOST_NAME (Transact-SQL) in der Filterklausel verwendet wird.

  9. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_adddynamicsnapshot_job (Transact-SQL) aus. Geben Sie den Namen der Veröffentlichung aus Schritt 1 für @publication, den Wert aus Schritt 8 für @suser_sname oder @host_name sowie einen Zeitplan für den Auftrag an. Dadurch wird der Auftrag erstellt, der den parametrisierten Snapshot für die angegebene Partition generiert. Weitere Informationen finden Sie unter Vorgehensweise: Synchronisierungszeitpläne (Replikationsprogrammierung mit Transact-SQL).

    HinweisHinweis

    Dieser Auftrag wird mit dem gleichen Windows-Konto ausgeführt wie der in Schritt 2 definierte Anfangs-Snapshotauftrag. Um den parametrisierten Snapshotauftrag und seine zugehörige Datenpartition zu entfernen, führen Sie sp_dropdynamicsnapshot_job (Transact-SQL) aus.

  10. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_helpmergepartition (Transact-SQL) aus, und geben Sie den Wert aus Schritt 1 für @publication und den Wert @suser_sname oder @host_name aus Schritt 8 an. Achten Sie auf den Wert von dynamic_snapshot_jobid im Resultset.

  11. Führen Sie auf dem Verteiler für die msdb-Datenbank sp_start_job (Transact-SQL) aus, wobei Sie den in Schritt 9 ermittelten Wert für @job_id angeben. Dadurch wird der parametrisierte Snapshotauftrag für die Partition gestartet.

  12. Wiederholen Sie die Schritte 8 bis 11, um für jedes Abonnement einen partitionierten Snapshot zu generieren.

So erstellen Sie eine Veröffentlichung und für jede Partition manuell Snapshots

  1. Führen Sie sp_addmergepublication (Transact-SQL) aus, um die Veröffentlichung zu erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer Veröffentlichung (Replikationsprogrammierung mit Transact-SQL).

  2. Führen Sie auf dem Verleger sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie den in Schritt 1 verwendeten Veröffentlichungsnamen für @publication und die Windows-Anmeldeinformationen, unter denen der Snapshot-Agent ausgeführt wird, für @job_name und @job_password an. Wenn der Agent zum Herstellen der Verbindung mit dem Verleger die SQL Server-Authentifizierung verwendet, müssen Sie zudem den Wert 0 für @publisher_security_mode und die SQL Server-Anmeldeinformationen für @publisher_login und @publisher_password angeben. Dadurch wird ein Snapshot-Agentauftrag für die Veröffentlichung erstellt. Weitere Informationen dazu, wie ein Anfangssnapshot generiert und ein benutzerdefinierter Zeitplan für den Snapshot-Agent definiert wird, finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

    SicherheitshinweisSicherheitshinweis

     Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter einschließlich job_login und job_password bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Verschlüsseln von Verbindungen zu SQL Server.

  3. Führen Sie sp_addmergearticle (Transact-SQL) aus, um der Veröffentlichung Artikel hinzuzufügen. Diese gespeicherte Prozedur muss einmal für jeden Artikel in der Veröffentlichung ausgeführt werden. Wenn Sie parametrisierte Filter verwenden, müssen Sie mithilfe des Parameters @subset_filterclause einen parametrisierten Filter für zumindest einen Artikel angeben. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel (Replikationsprogrammierung mit Transact-SQL).

  4. Werden andere Artikel basierend auf dem parametrisierten Zeilenfilter gefiltert, dann führen Sie sp_addmergefilter (Transact-SQL) aus, um die Verknüpfung oder die logische Datensatzbeziehung zwischen Artikeln zu definieren. Diese gespeicherte Prozedur muss einmal für jede zu definierende Beziehung ausgeführt werden. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln (Replikationsprogrammierung mit Transact-SQL).

  5. Starten Sie den Snapshotauftrag oder führen Sie den Replikationssnapshot-Agent von der Eingabeaufforderung aus, um das Standard-Snapshotschema und andere Dateien zu erzeugen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

  6. Führen Sie den Replikationssnapshot-Agent erneut von der Eingabeaufforderung aus, um BCP-Dateien (Massenkopierdateien) zu erstellen, wobei Sie den Speicherort des partionierten Snapshots für -DynamicSnapshotLocation und eine oder beide der folgenden Eigenschaften zur Definition der Partition angeben:

  7. Wiederholen Sie Schritt 8, um für jedes Abonnement einen partitionierten Snapshot zu generieren.

  8. Führen Sie den Merge-Agent für jedes Abonnement aus, um den partitionierten Anfangssnapshot auf die Abonnenten anzuwenden, wobei Sie die folgenden Eigenschaften angeben:

    • -Hostname - der zur Definition der Partition verwendete Wert, wenn der tatsächliche Wert von HOST_NAME überschrieben wurde.

    • -DynamicSnapshotLocation - der Speicherort des dynamischen Snapshots für diese Partition.

HinweisHinweis

Weitere Informationen zur Programmierung von Replikations-Agents finden Sie unter Ausführbare Konzepte für die Programmierung von Replikations-Agents.

Beispiel

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Abonnenten den Snapshotgenerierungsprozess initiieren. Die Werte für @job_login und @job_password werden mithilfe von Skriptvariablen übergeben.

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

-- Enable AdventureWorks 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 AdventureWorks.', 
  @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].[EmployeeID] = [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

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Partition jedes Abonnenten durch Ausführung von sp_addmergepartition definiert wird, und der gefilterte Snapshotauftrag durch Ausführung von sp_adddynamicsnapshot_job unter Angabe der Partitionierungsinformationen erstellt wird. Die Werte für @job_login und @job_password werden mithilfe von Skriptvariablen übergeben.

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

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

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- 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 customer 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].[EmployeeID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

PRINT '*** Waiting for the initial snapshot.';
GO

-- Create a temporary table to store the filtered data snapshot 
-- job information.
CREATE TABLE #temp (id int,
    job_name sysname,
    job_id uniqueidentifier,
    dynamic_filter_login sysname NULL,
    dynamic_filter_hostname sysname NULL,
    dynamic_snapshot_location nvarchar(255),
    frequency_type int, 
    frequency_interval int, 
    frequency_subday_type int,
    frequency_subday_interval int, 
    frequency_relative_interval int, 
    frequency_recurrence_factor int, 
    active_start_date int, 
    active_end_date int, 
    active_start_time int, 
    active_end_time int
)

-- Create each snapshot for a partition 
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';

WHILE NOT EXISTS(SELECT * FROM sysmergepublications 
    WHERE [name] = @publication 
    AND snapshot_ready = 1)
BEGIN
    WAITFOR DELAY '00:00:05'
END

-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition 
  @publication = @publication,
  @host_name = @hostname;

-- Create the filtered data snapshot job, and use the returned 
-- information to start the job.
EXEC sp_adddynamicsnapshot_job 
  @publication = @publication,
  @host_name = @hostname;

INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
    dynamic_filter_hostname, dynamic_snapshot_location,
    frequency_type, frequency_interval, frequency_subday_type,
    frequency_subday_interval, frequency_relative_interval, 
    frequency_recurrence_factor, active_start_date, active_end_date, 
    active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;

SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);

EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO

In diesem Beispiel wird eine Mergeveröffentlichung mit parametrisierten Filtern erstellt, bei der die Partition und der gefilterte Snapshotauftrag jedes Abonnenten durch Angabe der Partitionierungsinformationen erstellt wird. Ein Abonnent gibt die Partitionierungsinformationen mithilfe von Befehlszeilenparametern an, wenn die Replikations-Agents manuell ausgeführt werden. In diesem Beispiel wird davon ausgegangen, dass auch ein Abonnement für die Veröffentlichung erstellt wurde.

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

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

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- 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 customer 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].[EmployeeID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO
REM Line breaks are added to improve readability. 
REM In a batch file, commands must be made in a single line.
REM Run the Snapshot agent from the command line to generate the standard snapshot 
REM schema and other files. 
SET DistPub=%computername%
SET PubDB=AdventureWorks 
SET PubName=AdvWorksSalesPersonMerge

"C:\Program Files\Microsoft SQL Server\100\COM\SNAPSHOT.EXE" -Publication %PubName%  
-Publisher %DistPub% -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2  
-OutputVerboseLevel 1  -DistributorSecurityMode 1

PAUSE
REM Run the Snapshot agent from the command line, this time to generate 
REM the bulk copy (.bcp) data for each Subscriber partition.  
SET DistPub=%computername%
SET PubDB=AdventureWorks 
SET PubName=AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando

MD %SnapshotDir%

"C:\Program Files\Microsoft SQL Server\100\COM\SNAPSHOT.EXE" -Publication %PubName%  
-Publisher %DistPub%  -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2  
-OutputVerboseLevel 1  -DistributorSecurityMode 1  -DynamicFilterHostName "adventure-works\Fernando"  
-DynamicSnapshotLocation %SnapshotDir%

PAUSE
REM Run the Merge Agent for each subscription to apply the partitioned 
REM snapshot for each Subscriber.  
SET Publisher = %computername%
SET Subscriber = %computername%
SET PubDB = AdventureWorks 
SET SubDB = AdventureWorksReplica 
SET PubName = AdvWorksSalesPersonMerge 
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando

"C:\Program Files\Microsoft SQL Server\100\COM\REPLMERG.EXE" -Publisher  %Publisher%  
-Subscriber  %Subscriber%  -Distributor %Publisher%  -PublisherDB %PubDB%  
-SubscriberDB %SubDB% -Publication %PubName%  -PublisherSecurityMode 1  -OutputVerboseLevel 3  
-Output -SubscriberSecurityMode 1  -SubscriptionType 3 -DistributorSecurityMode 1  
-Hostname "adventure-works\Fernando"  -DynamicSnapshotLocation %SnapshotDir%

PAUSE