【问题标题】:Copy data of each table from server A to server B dynamically using SSIS使用 SSIS 将每个表的数据从服务器 A 动态复制到服务器 B
【发布时间】:2019-02-22 16:53:23
【问题描述】:

我的任务是在 SSIS 中创建工作流,它将每个表的数据从服务器 A 复制到服务器 B 中的相同表中。现在,我已经停止从 A 服务器获取数据并复制它到服务器 B。到目前为止,我已经创建了工作流程,步骤如下:

  1. 从 Excel 文件中读取数据,其中放置了要处理的表的名称
  2. 在目标数据库(服务器 B)中插入此行以备将来使用
  3. 在将上述步骤连接到下一个对象的控制流中 - 执行 SQL 任务,其中我将所有加载的名称从表中提取到名为“GlobalListOfTables”的全局项目变量中。
  4. 创建了另一个变量“localTable”,我在其中存储了“GlobalListOfTables”变量/集的每一行,我稍后会在“FOR LOOP”中使用它。

这里我已经停下来了,我想做的是:

  1. 在这个 LOOP 中,使用创建的“localTable”变量从每个表的源服务器获取所有数据,然后将这些数据插入到目标服务器中与“localTable”变量中相同的表名中。

最后一点 5 让我有点困惑,因为表格会彼此不同,所以没有一种表格敲击模式。

有人可以告诉我在 SSIS 中我应该如何做以及我应该从可用列表中采取哪些控制来实现第 5 点?

【问题讨论】:

  • 在我看来,SSIS 可能是适合这项工作的错误工具。您是否研究过复制?
  • 你需要复制数据库对象吗?对吗?
  • 这是课堂作业还是工作场所作业?我问是因为在工作场所,依靠 Excel 工作表而不是系统表将是一个坏主意,并且使用 SSIS 来完成这项任务也是一个坏主意,所以这将带你走向一个方向。如果这是一项课堂作业,那么这些就是你所坚持的规则,我们可以专注于让错误的工具完成你需要它们做的事情。
  • 最好的方法是将数据库从服务器 A 恢复到 B。您可以在 Ssis 包中编写一个简单的 sql 查询来执行此操作。然后您可以安排该包运行并且您拥有数据在目标服务器数据库的表中,但架构和数据库是相同的。如果您尝试使用不同的表方案插入一个全新的数据库,那么祝您好运。您需要向我们提供详细信息,例如表方案列所有这些内容。您还可以链接服务器并使用 sql 查询将其插入和调度为 sql 作业

标签: sql-server ssis etl


【解决方案1】:

传输数据库任务和传输 SQL Server 对象任务

如果您希望将所有数据从一个数据库复制到另一个数据库,您应该参考Transfer Database TaskTransfer SQL Server Objects Task

基于Transfer Database Task official documentation

传输数据库任务在两个 SQL Server 实例之间传输 SQL Server 数据库。与仅通过复制来传输 SQL Server 对象的其他任务相比,传输数据库任务可以复制或移动数据库。此任务还可用于在同一服务器内复制数据库。

另外,基于Transfer SQL Server Objects Task official documentation

传输 SQL Server 对象任务在 SQL Server 实例之间传输 SQL Server 数据库中的一种或多种类型的对象。例如,任务可以复制表和存储过程。根据用作源的 SQL Server 版本,可以复制不同类型的对象。例如,只有 SQL Server 数据库包含模式和用户定义的聚合。

详细文章

有很多文章描述了如何处理这些任务以及所有可用选项,例如:

【讨论】:

  • 您就在这里,但我需要使用表格列表动态执行此操作。对我有用的解决方案在上面,但也感谢。
【解决方案2】:

您可以使用脚本任务中的 C# SMO 对象来执行动态表列表的传输。不需要 SSIS 循环。 SSIS 对象变量 (GlobalListOfTables) 需要包含在脚本任务的 ReadOnlyVariables 字段中。除了下面列出的之外,请确保将 Microsoft.SqlServer.SmoExtended 和 Microsoft.SqlServer.ConnectionInfo 引用添加到脚本任务。

using System.Data;
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Generic;
using System.Data.OleDb;



       string databaseName = "DatabaseName";
       List<string> tableNames = new List<string>();
       DataTable dt = new DataTable();
       OleDbDataAdapter dataAdapter = new OleDbDataAdapter();

        //get table names from SSIS object variable
       dataAdapter.Fill(dt, Dts.Variables["User::SourceServerName"].Value);

        //populate list
        foreach (DataRow dr in dt.Rows)
        {
          tableNames.Add(dr[0].ToString());
        }

        //create source server object
        Server srcServ = new Server(@"SourceServerName");
        srcServ.ConnectionContext.LoginSecure = true;
        srcServ.ConnectionContext.StatementTimeout = 600;
        srcServ.ConnectionContext.Connect();

        //define source database as smo object
        Database sourceDatabase = srcServ.Databases["SourceDatabaseName"];

        Transfer transfer = new Transfer();
        transfer.Database = sourceDatabase;

        //set destination server and database
        transfer.DestinationServer = @"DestinationServerName";
        transfer.DestinationDatabase = databaseName;

        //overwrite objects if they exist
        transfer.DropDestinationObjectsFirst = true;

        transfer.CopyAllObjects = false;
        transfer.CopySchema = true;

        //include data
        transfer.CopyData = true;

        foreach (Table t in sourceDatabase.Tables)
        {   
            //extract table names that were originally in SSIS object variable and avoid system objects
            if (tableNames.Contains(t.Name) && !t.IsSystemObject)
            {
                transfer.ObjectList.Add(t);
            }
        }
        //transfer objects
         transfer.TransferData();

【讨论】:

  • 这段代码看起来很不错,很有前途。我需要检查一下,如果它适用于我的情况,请告诉您@userfl89。感谢您提供此代码。
  • 我已将您的脚本放入我的工作流程中。似乎可以正常工作,但我遇到了一个问题。当我运行此工作流程时,此脚本按进程输入并永远运行而不会结束传输。用于测试的表不是那么大 - 只有 1000 行。我加入了脚本,如果传输完成但它没有显示“作业完成”。你知道这里有什么问题吗?
  • 脚本正在运行,但它没有将数据传输到目标表。之后表格是空的
  • 您是否将 Transfer 对象的 CopyData 属性设置为 true(在 foreach 循环的正上方)?它在一张桌子上运行了很长时间?当我测试它时,用几张类似大小的表运行它并不需要很长时间,大约 10 秒左右。服务器上是否存在资源争用?另外,它是否正确连接到两台服务器?我在时间上遇到了类似的问题,但是一旦正确创建了服务器连接(即 ConnectionContext、DestinationServer 设置),它就解决了。
  • 我之前在传输数据时没有遇到任何问题,但为了确认我刚刚复制/粘贴了我在上面发布的代码并且所有行都已传输,包括一个比你大得多的表重新测试。您可能已经检查过了,但是源表在传输时是否有数据,并且在您的代码中设置属性/方法的顺序与我提交的相同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2021-06-03
  • 1970-01-01
  • 2021-10-11
  • 2023-03-16
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多