2015-04-30 3 views
5

Je copie des tables à partir de la base de données Source_Test de la base de données Source_Test.Comment copier les tables base sur le nom du schéma dans Microsoft.SqlServer.Management.Smo.Transfer

En utilisant Microsoft.SqlServer.Management.Smo.Transfer.

des copies de toutes les tables Il from Source_Test to Destination_Test

Mais je veux des tables ayant schéma 'TestSchema'.

Le principal problème est, il copie toutes les tables ayant dbo schema. Même j'ai mis this.CopyAllTables = false; encore il le copie. Comment le limiter. J'avais essayé suivante:

public class CopyTable : Transfer, ISchemaCopy 
{ 
    private void CopyTables() 
    { 
     this.CopyAllTables = false; 
     var server = new Server(new ServerConnection(connection)); 
     var script = this.ScriptTransfer().Cast<string>(); 
    } 
} 

Répondre

0

Je pense que le code ci-dessous ne pas ce que vous essayez d'atteindre. S'il est configuré pour copier des tables à partir d'un seul schéma en fournissant un nom de schéma, il ajoutera uniquement les tables de ce schéma pour la copie. L'élément clé est la création d'une collection de tables que vous souhaitez copier et l'ajout explicite de cette collection à ObjectList. N'oubliez pas de changer le ServerName et le DatabaseName à quelque chose de réel.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 

/* Needs references to: 
* 
* System.Data 
* Microsoft.SqlServer.ConnectionInfo 
* Microsoft.SqlServer.Management.Sdk.Sfc 
* Microsoft.SqlServer.Smo 
* Microsoft.SqlServer.SmoExtended 
*/ 

namespace CopyTablesExample 
{ 
    class Program 
    { 
     public class CopyTables : Transfer 
     { 
      public string SchemaName { get; set; } 
      public string DatabaseName { get; set; } 
      public string ServerName { get; set; } 


      public IEnumerable<string> GetScript() 
      { 
       //This is what we will return 
       IEnumerable<string> scriptStrings = null; 

       if (this.DatabaseName == null) { 
        throw new Exception("DatabaseName property not set."); 
       } 

       if (this.ServerName == null) { 
        throw new Exception("ServerName property not set."); 
       } 

       var server = new Server(new ServerConnection(ServerName)); 
       this.Database = server.Databases[this.DatabaseName]; 

       //Turn off all objects. Below we will start turning on what we want. 
       //You may wish to add more object types. 
       this.CopyAllObjects = false; 

       if (this.SchemaName == null) { 
        //No schema means all tables 
        this.CopyAllTables = true; 
       } 
       else { 
        //A specific schema means all tables from that schema 
        this.CopyAllTables = false; 
        //We only want to copy tables in a specific schema. 
        List<Table> tablesToCopy = new List<Table>(); 
        foreach (Table t in this.Database.Tables) { 
         if (t.Schema.Equals(this.SchemaName)) { 
          tablesToCopy.Add(t); 
         } 
        } 

        //Add specifically the tables we want which are from the schema we want 
        this.ObjectList.AddRange(tablesToCopy); 
       } 

       try { 
        scriptStrings = this.ScriptTransfer().Cast<string>(); 
       } 
       catch (Exception ex) { 
        Console.WriteLine("We got an exception."); 
        throw; 
       } 
       return scriptStrings; 
      } 
     } 

     static void Main(String[] Args) 
     { 
      //Only set a SchemaName in line below, when you want to restrict yourself to copying that schema's tables. 
      CopyTables ct = new CopyTables() { ServerName = "xyz", DatabaseName = "abc", SchemaName = "junk" } ; 
      var copyTablesScript = ct.GetScript(); 

      //For validation, display the script as generated 
      foreach (var item in copyTablesScript) { 
       Console.WriteLine(item); 
      } 
      var discard = Console.ReadKey(); 
     } 
    } 
}