Wie man zwei databaseen auf zwei verschiedenen servern zusammenführt?

Ich habe zwei verschiedene databaseen, der Client ist von einer .MDF file an einen .\SQLEXPRESS server angeschlossen. Der Master läuft auf einem server auf einem anderen Computer namens COMPUTER_NAME .

Ich möchte diese mit C # zusammenführen, um eine .SQL file .SQL . Ich füge meinen Code unten als reference ein, aber im Grunde ist mein Problem das, wenn ich eine Verbindung zum server herstelle

  string sqlConnectionString = @"server=.\SQLEXPRESS; Trusted_Connection=True"; 

Dann finde ich die database auf COMPUTER_NAME . Und wenn ich benutze

  string sqlConnectionString = @"server=COMPUTER_NAME; Trusted_Connection=True"; 

Es wird nach meiner .MDF file auf dem C: Laufwerk von COMPUTER_NAME suchen, nicht auf dem lokalen Rechner.

Wie kann ich eine Verbindung zu diesen beiden databaseen auf verschiedenen servern herstellen?

Zusätzliche Information:

Das SQL-Skript, das ich verwende. Das funktionierte perfekt zurück, wenn beide databaseen auf dem gleichen server waren, aber das kann ich nicht mehr machen.

 CREATE DATABASE ClientDB ON (Filename = 'C:\Clayton.mdf') , (Filename = 'C:\Clayton_log.ldf') FOR ATTACH; -- update the client from the master MERGE [ClientDB].[dbo].[table] trgt using [MasterDB].[dbo].[table] src ON trgt.id = src.id WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if master row is newer UPDATE SET trgt.[info] = src.[info], ... -- update the client WHEN NOT matched BY source -- delete rows added by client THEN DELETE WHEN NOT matched BY target -- insert rows added by master THEN INSERT ( [info], ... ) VALUES (src.[info], ... ); -- close all connections to database ALTER DATABASE ClientDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- detach database EXEC sp_detach_db 'ClientDB', 'true'; 

Und ich laufe es mit C # wie folgt:

  string sqlConnectionString = @"server=.\SQLEXPRESS; Trusted_Connection=True"; string script = File.ReadAllText(Environment.CurrentDirectory + @"\MergeTotal.sql"); SqlConnection conn = new SqlConnection(sqlConnectionString); IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase); conn.Open(); foreach (string commandString in commandStrings) { if (commandString.Trim() != "") { using (var command = new SqlCommand(commandString, conn)) { command.ExecuteNonQuery(); } } } 

Es ist mir egal, ob der gesamte process in der .SQL oder in C# passiert, solange er den gewünschten Effekt hat.

Vielen Dank im Voraus für Anleitungen oder Empfehlungen.

Die Verknüpfung der server würde Ihnen helfen, gleichzeitig auf die data zuzugreifen, wenn dies die Voraussetzung ist. Wenn Sie schauen, um data zusammen zu merge, aber ich würde vorschlagen, dass Sie auschecken sp_generate_merge , um die data in ein Merge-Skript für Sie zu ziehen (sehr praktisch für das Verschieben von data). Siehe auch meine Frage zum Erstellen von Zusammenführungsdaten hier .

Okay, ich musste das ganze .MDF Ding komplett .MDF . Anstatt die database von einem .MDF und neu zu befestigen, .MDF ich gerade die database ein.

Hier ist mein Code zur Initialisierung der lokalen database auf dem Tablet:

 CREATE DATABASE LocalClaytonDB ON (Filename = 'C:\ProgramData\Clayton\Clayton.mdf') , (Filename = 'C:\ProgramData\Clayton\Clayton_log.ldf') FOR ATTACH; GO EXEC sp_addlinkedserver @server='server' 

Hier ist mein Code, um die beiden databaseen zu synchronisieren:

 -- update the client from the master MERGE [LocalClaytonDB].[dbo].[tableName] trgt using [server].[Clayton].[dbo].[tableName] src ON trgt.id = src.id WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if the master has a row newer than the client -- update the client UPDATE SET trgt.[allColumns] = src.[allColumns], trgt.[id] = src.[id], trgt.[lastmodified] = src.[lastmodified] -- delete any rows added by a client WHEN NOT matched BY source THEN DELETE -- insert any rows added by the master WHEN NOT matched BY target THEN INSERT ( [allColumns], [id], [lastmodified]) VALUES (src. [allColumns], src.[id], src.[lastmodified]); -- now we update the master from the client -- Note: -- because the serverDB is a linked server -- we can't use another MERGE statement, otherwise -- we get the error: "The target of a MERGE statement -- cannot be a remote table, a remote view, or a view over remote tables." UPDATE serverDB SET [allColumns] = [localDB].[allColumns], [id] = [localDB].[id], [lastmodified] = [localDB].[lastmodified] FROM [server].[Clayton].[dbo].[tableName] serverDB INNER JOIN [LocalClaytonDB].[dbo].[tableName] localDB -- update where the id is the same but the client is newer than the master ON serverDB.id = localDB.id AND localDB.lastmodified >= serverDB.lastmodified