我的任务是在SSIS中创建工作流,它将在工作流中将每个表的数据从服务器A复制到服务器B的相同表中.现在,我已停止从A服务器获取数据并将其复制到服务器的步骤B.到目前为止,我已经创建了工作流程,其步骤如下:
>从放置有要处理表名称的Excel文件中读取数据
>将此行插入目标数据库(服务器B)中以备将来使用
>在以上步骤中连接到下一个对象的控制流中-执行SQL任务,在该任务中,我将从表中获取的所有已加载名称都命名为名为“ GlobalListOfTables”的全局项目变量.
>创建了另一个变量“ localTable”,在其中存储“ GlobalListOfTables”变量/集合的每一行,稍后将在“ FOR LOOP”中使用它.
在这里,我已停止,我想做的是:
>在此LOOP中,使用创建的“ localTable”变量从每个表的源服务器获取所有数据,然后将所有数据插入到目标服务器中,并将其插入与“ localTable”变量相同的表名中.
最后一点5让我有些困惑,因为桌子之间会有所不同,因此没有任何一种桌子打孔的模式.
有人可以让我知道如何在SSIS中进行操作,以及应该从可用列表中采取哪种控制措施以达到第5点?
最佳答案
您可以使用脚本任务中的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 tableNames = new List();
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();