Procédure : créer une capture instantanée pour une publication de fusion avec des filtres paramétrables (programmation Transact-SQL de la réplication)

Lors de la génération de captures instantanées pour des publications à l'aide de filtres paramétrables, vous devez commencer par générer une capture instantanée standard, ou schéma, qui contient l'ensemble des données publiées, ainsi que les métadonnées de l'Abonné pour l'abonnement. Pour plus d'informations, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication). Après avoir créé la capture instantanée de schéma, vous pouvez générer la capture instantanée qui contient la partition des données publiées spécifique à l'Abonné.

À l'aide des procédures stockées et de l'Agent de capture instantanée, vous pouvez :

  • autoriser les Abonnés à demander la génération et l'application d'une capture instantanée lors de leur première synchronisation ;

  • prégénérer des captures instantanées pour chaque partition ;

  • générer manuellement une capture instantanée pour chaque Abonné.

    Remarque relative à la sécurité  Si possible, demandez aux utilisateurs de fournir les informations d'identification de sécurité au moment de l'exécution. Si vous devez stocker ces informations dans un fichier de script, vous devez sécuriser ce fichier pour empêcher tout accès non autorisé.

Pour créer une publication qui permet aux Abonnés d'initialiser la génération et la remise de captures instantanées

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergepublication (Transact-SQL). Spécifiez les paramètres suivants :

    • Le nom de la publication pour @publication.

    • La valeur true pour @allow_subscriber_initiated_snapshot, qui permet aux Abonnés d'initialiser le processus de capture instantanée.

    • (Facultatif) Le nombre de processus de capture instantanée dynamique qui peuvent s'exécuter simultanément pour @max_concurrent_dynamic_snapshots. Si le nombre maximal de processus en cours d'exécution est atteint et si un Abonné essaie de générer une capture instantanée, le processus est placé en file d'attente. Par défaut, le nombre de processus simultanés est illimité.

  2. Sur le serveur de publication, exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez le nom de publication utilisé à l'étape 1 pour @publication et les informations d'identification Microsoft Windows sous lesquelles l'Agent de capture instantanée de réplication s'exécute pour @job_login et @password. Si l'agent doit utiliser l'authentification SQL Server lors de la connexion au serveur de publication, vous devez aussi spécifier la valeur 0 pour @publisher_security_mode et les informations de connexion Microsoft SQL Server pour @publisher_login et @publisher_password. Un travail de l'Agent de capture instantanée est alors créé pour la publication. Pour plus d'informations sur la génération d'une capture instantanée initiale et la définition d'une planification personnalisée pour l'Agent de capture instantanée, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

    Remarque relative à la sécuritéRemarque relative à la sécurité

     Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées en texte brut au serveur de distribution. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'exécuter cette procédure stockée. Pour plus d'informations, consultez Chiffrement des connexions à SQL Server.

  3. Exécutez sp_addmergearticle (Transact-SQL) pour ajouter des articles à la publication. Cette procédure stockée doit être exécutée une fois pour chaque article de la publication. Lorsque vous utilisez des filtres paramétrables, vous devez spécifier un filtrage des lignes paramétrable pour un ou plusieurs articles à l'aide du paramètre @subset_filterclause. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication).

  4. Si d'autres articles doivent être filtrés sur la base du filtrage des lignes paramétrable, exécutez sp_addmergefilter (Transact-SQL) pour définir la relation de jointure ou d'enregistrements logiques entre les articles. Cette procédure stockée doit être exécutée une fois pour chaque relation en cours de définition. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

  5. Lorsque l'Agent de fusion demande à la capture instantanée d'initialiser l'Abonné, la capture instantanée de la partition de l'abonnement demandeur est générée automatiquement.

Pour créer une publication et prégénérer ou actualiser automatiquement des captures instantanées

  1. Exécutez sp_addmergepublication (Transact-SQL) pour créer la publication. Pour plus d'informations, consultez Procédure : créer une publication (programmation Transact-SQL de la réplication).

  2. Sur le serveur de publication, exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez le nom de publication utilisé à l'étape 1 pour @publication et les informations d'identification Windows sous lesquelles l'Agent de capture instantanée s'exécute pour @job_login et @password. Si l'agent doit utiliser l'authentification SQL Server lors de la connexion au serveur de publication, vous devez aussi spécifier la valeur 0 pour @publisher_security_mode et les informations de connexion SQL Server pour @publisher_login et @publisher_password. Un travail de l'Agent de capture instantanée est alors créé pour la publication. Pour plus d'informations sur la génération d'une capture instantanée initiale et la définition d'une planification personnalisée pour l'Agent de capture instantanée, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

    Remarque relative à la sécuritéRemarque relative à la sécurité

     Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées en texte brut au serveur de distribution. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'exécuter cette procédure stockée. Pour plus d'informations, consultez Chiffrement des connexions à SQL Server.

  3. Exécutez sp_addmergearticle (Transact-SQL) pour ajouter des articles à la publication. Cette procédure stockée doit être exécutée une fois pour chaque article de la publication. Lorsque vous utilisez des filtres paramétrables, vous devez spécifier un filtrage des lignes paramétrable pour un article à l'aide du paramètre @subset_filterclause. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication).

  4. Si d'autres articles doivent être filtrés sur la base du filtrage des lignes paramétrable, exécutez sp_addmergefilter (Transact-SQL) pour définir la relation de jointure ou d'enregistrements logiques entre les articles. Cette procédure stockée doit être exécutée une fois pour chaque relation en cours de définition. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

  5. Dans la base de données de publication sur le serveur de publication, exécutez sp_helpmergepublication (Transact-SQL), en spécifiant la valeur de @publication définie à l'étape 1. Notez la valeur du snapshot_jobid dans le jeu de résultats.

  6. Convertissez la valeur du snapshot_jobid obtenue à l'étape 5 en uniqueidentifier.

  7. Dans la base de données msdb sur le serveur de publication, exécutez sp_start_job (Transact-SQL), en spécifiant la valeur convertie obtenue à l'étape 6 pour @job_id.

  8. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergepartition (Transact-SQL). Spécifiez le nom de la publication définie à l'étape 1 pour @publication et la valeur utilisée pour définir la partition pour @suser_sname si SUSER_SNAME (Transact-SQL) est utilisé dans la clause de filtre ou pour @host_name si HOST_NAME (Transact-SQL) est utilisé dans la clause de filtre.

  9. Dans la base de données de publication sur le serveur de publication, exécutez sp_adddynamicsnapshot_job (Transact-SQL). Spécifiez le nom de la publication définie à l'étape 1 pour @publication, la valeur de @suser_sname ou @host_name définie à l'étape 8 et une planification pour le travail. Le travail qui génère la capture instantanée paramétrable pour la partition spécifiée est ainsi créée. Pour plus d'informations, consultez Procédure : spécifier des planifications de synchronisation (programmation Transact-SQL de la réplication).

    Notes

    Ce travail s'exécute à l'aide du même compte Windows que le travail de capture instantanée initial défini à l'étape 2. Pour supprimer le travail de capture instantanée paramétrable et sa partition de données associée, exécutez sp_dropdynamicsnapshot_job (Transact-SQL).

  10. Dans la base de données de publication sur le serveur de publication, exécutez sp_helpmergepartition (Transact-SQL) en spécifiant la valeur de @publication définie à l'étape 1 et la valeur de @suser_sname ou @host_name définie à l'étape 8. Notez la valeur du dynamic_snapshot_jobid dans le jeu de résultats.

  11. Dans la base de données msdb sur le serveur de distribution, exécutez sp_start_job (Transact-SQL), en spécifiant la valeur obtenue à l'étape 9 pour @job_id. Le travail de capture instantanée paramétrable de la partition est alors démarré.

  12. Répétez les étapes 8 à 11 pour générer une capture instantanée partitionnée pour chaque abonnement.

Pour créer une publication et créer manuellement des captures instantanées pour chaque partition

  1. Exécutez sp_addmergepublication (Transact-SQL) pour créer la publication. Pour plus d'informations, consultez Procédure : créer une publication (programmation Transact-SQL de la réplication).

  2. Sur le serveur de publication, exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez le nom de publication utilisé à l'étape 1 pour @publication et les informations d'identification Windows sous lesquelles l'Agent de capture instantanée s'exécute pour @job_login et @password. Si l'agent doit utiliser l'authentification SQL Server lors de la connexion au serveur de publication, vous devez aussi spécifier la valeur 0 pour @publisher_security_mode et les informations de connexion SQL Server pour @publisher_login et @publisher_password. Un travail de l'Agent de capture instantanée est alors créé pour la publication. Pour plus d'informations sur la génération d'une capture instantanée initiale et la définition d'une planification personnalisée pour l'Agent de capture instantanée, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

    Remarque relative à la sécuritéRemarque relative à la sécurité

     Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées en texte brut au serveur de distribution. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'exécuter cette procédure stockée. Pour plus d'informations, consultez Chiffrement des connexions à SQL Server.

  3. Exécutez sp_addmergearticle (Transact-SQL) pour ajouter des articles à la publication. Cette procédure stockée doit être exécutée une fois pour chaque article de la publication. Lorsque vous utilisez des filtres paramétrables, vous devez spécifier un filtrage des lignes paramétrable pour au moins un article à l'aide du paramètre @subset_filterclause. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication).

  4. Si d'autres articles doivent être filtrés sur la base du filtrage des lignes paramétrable, exécutez sp_addmergefilter (Transact-SQL) pour définir la relation de jointure ou d'enregistrements logiques entre les articles. Cette procédure stockée doit être exécutée une fois pour chaque relation en cours de définition. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

  5. Démarrez le travail de capture instantané ou exécutez l'Agent de capture instantanée des réplications à partir de l'invite de commandes pour générer le schéma de capture instantanée standard et d'autres fichiers. Pour plus d'informations, consultez Procédure : créer la capture instantanée initiale (programmation Transact-SQL de la réplication).

  6. Exécutez de nouveau l'Agent de capture instantanée des réplications à partir de l'invite de commandes pour générer des fichiers de copie en bloc (.bcp), en spécifiant l'emplacement de la capture instantanée partitionnée pour - DynamicSnapshotLocation et une des propriétés suivantes ou les deux qui définissent la partition :

  7. Répétez l'étape 6 pour générer une capture instantanée partitionnée pour chaque abonnement.

  8. Exécutez l'Agent de fusion pour chaque abonnement afin d'appliquer la capture instantanée partitionnée initiale aux Abonnés, en spécifiant les propriétés suivantes :

    • -Hostname - la valeur utilisée pour définir la partition si la valeur réelle de HOST_NAME est remplacée.

    • - DynamicSnapshotLocation - l'emplacement de la capture instantanée dynamique pour cette partition.

Notes

Pour plus d'informations sur la programmation des agents de réplication, consultez Concepts des exécutables de l'agent de réplication.

Exemple

Cet exemple crée une publication de fusion avec des filtres paramétrables dans laquelle les Abonnés initialisent le processus de génération de capture instantanée. Les valeurs de @job_login et @job_password sont passées à l'aide de variables de script.

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

-- Enable AdventureWorks2008R2 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 AdventureWorks2008R2.', 
  @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

Cet exemple crée une publication à l'aide d'un filtre paramétrable dans laquelle la partition de chaque Abonné est définie en exécutant sp_addmergepartition et le travail de capture instantanée filtrée est créé en exécutant sp_adddynamicsnapshot_job et en passant les informations de partitionnement. Les valeurs de @job_login et @job_password sont passées à l'aide de variables de script.

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

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

Cet exemple crée une publication à l'aide d'un filtre paramétrable dans laquelle la partition de données et le travail de capture instantanée filtrée de chaque Abonné doivent être créés en fournissant les informations de partitionnement. Un Abonné fournit des informations de partitionnement à l'aide de paramètres de ligne de commande lors de l'exécution manuelle des agents de réplication. Cet exemple suppose qu'un abonnement à la publication a également été créé.

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

-- Enable AdventureWorks2008R2 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 AdventureWorks2008R2.', 
  @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].[BusinessEntityID] = [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=AdventureWorks2008R2 
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=AdventureWorks2008R2 
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 = AdventureWorks2008R2 
SET SubDB = AdventureWorks2008R2Replica 
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