【问题标题】:Copying table from one SQL Server to another将表从一个 SQL Server 复制到另一个
【发布时间】:2013-06-12 10:31:09
【问题描述】:

我正在尝试使用 SQL Server 管理对象 (SMO)、Transfer 类创建表的副本(没有数据,只有架构)。我唯一没有弄清楚的是,当服务器位于不同的主机上时,如何指定要复制到的服务器。就我而言,我想从 10.1.2.x 复制到 10.1.2.y。有什么办法可以指定,还是这个类不支持?

也许有更好的 C# 解决方案?

static void CreateTableFromTable(string fromConnection, string toConnection, string dbName, string tablename, bool copyData = false)
{
    Server fromServer = new Server(new ServerConnection(new SqlConnection(fromConnection)));
    Database db = fromServer.Databases[dbName];

    Transfer transfer = new Transfer(db);
    transfer.CopyAllObjects = false;
    transfer.DropDestinationObjectsFirst = false;
    transfer.CopySchema = false;   //Database schema? Or Table schema? I DO NOT want to overwrite the db schema
    transfer.CopyData = copyData;
    transfer.DestinationServer = "?";
    transfer.DestinationDatabase = dbName;
    transfer.Options.IncludeIfNotExists = true;
    transfer.ObjectList.Add(db.Tables[tablename]);

    transfer.TransferData();
}

【问题讨论】:

    标签: c# sql-server smo


    【解决方案1】:

    您是否尝试过导入和导出数据向导,甚至使用 SQL server 2005/8 和 Mysql /MysqlWorkbench 中的表数据、命令行或 GUI 导入。

    【讨论】:

      【解决方案2】:

      我不确定您是否找到了其他解决方案 - 或者让这个解决方案有效。如果你没有 SMO Scripter object 可能值得一看。

      这个 MSDN 示例可能会有所帮助。您可以编写所需的表和依赖项脚本,然后打开与目标数据库的连接并执行脚本。

      static void Main(string[] args)
      {
          Server sourceServer = new Server("server");
          String dbName = "database"; 
      
          // Connect to the local, default instance of SQL Server. 
      
          // Reference the database.  
          Database db = sourceServer.Databases[dbName];
      
          // Define a Scripter object and set the required scripting options. 
          Scripter scripter = new Scripter(sourceServer);
          scripter.Options.ScriptDrops = false;
          scripter.Options.WithDependencies = true;
          scripter.Options.Indexes = true;   // To include indexes
          scripter.Options.DriAllConstraints = true;   // to include referential constraints in the script
      
          // Iterate through the tables in database and script each one. Display the script.   
          foreach (Table tb in db.Tables)
          {
              // check if the table is not a system table
              if (tb.IsSystemObject == false)
              {
                  Console.WriteLine("-- Scripting for table " + tb.Name);
      
                  // Generating script for table tb
                  System.Collections.Specialized.StringCollection sc = scripter.Script(new Urn[] { tb.Urn });
                  foreach (string st in sc)
                  {
                      //ado.net to destination 
                      Console.WriteLine(st);//SqlCommand.ExecuteNonQuery();
                  }
                  Console.WriteLine("--");
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        您是否尝试使用SELECT ... INTO 语句?

        例如:

        SELECT * INTO DestDatabase.TableName FROM SourceDatabase.TableName
        

        如果您不想复制数据,只需添加一个不返回任何内容的条件,例如:WHERE Id = 0

        【讨论】:

        • 您将如何指定包含数据库的服务器的 IP 地址?
        • 把它放在
        • 怎么样?这不像我可以输入 SELECT * INTO DestDatabase.TableName FROM 10.1.2.1.SourceDatabase.TableName
        • 使用 [] 。例如:[10.1.2.1].[DB].[Table]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多