我有一个主表,其中包含源名称(例如:CSV 文件名)和目标名称(例如:Sql 表名称),因为我知道源和目标; SSIS 中有什么方法可以动态地将文件从源加载到目标吗?我不想在 SSIS 中创建 50-60 个数据加载我们还有其他更好的方法吗?
我的桌子看起来像这样
Source Destination
File1.csv dbo.Table1
File2.csv dbo.Table2
File3.csv dbo.Table3
注意:- 每个文件的架构可能有所不同
请建议一个可以节省大量精力的最佳方法
这是我的 C# 脚本任务中的代码,它将获取您从 SQL 任务填充的数据集并输出到对象数据类型。您可以传递任何您想要的数据集,它会动态地为您创建一个 .csv 文件。注意:您必须小心处理非常大的数据集,因为它会耗尽内存。
这是通过在 SSIS ReadOnlyVariables 中传递 2 个变量来实现的: 用户::文件导出名称和路径,用户::ObjDataToSaveToExportFile
FileExportNameAndPath - 是要将文件导出到的完整路径以及文件名/扩展名。您可以使用表达式生成器和其他变量在循环中将其创建为您想要的任何内容(将表名放入变量中并解析日期以将其添加到您的文件名中(如果需要)。
ObjDataToSaveToExportFile 是您在上一步中使用 Execte SQL 任务填充的对象变量(无论您想要在 .csv 文件中生成什么查询和数据)。在此步骤中,您必须使输出为变量、完整结果集,并且变量为:ObjDataToSaveToExportFile
如果您使用这些相同的变量名称,您只需在不同的包之间复制/粘贴此 C# 脚本任务,而无需编辑脚本任务。
这是文件中的代码:ScriptMain.cs
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Text;
using System.Data.OleDb; // this is to convert he object from SSIS to a data table
//using System.Text;
namespace ST_a8a7451a5662418eb87a1394e40bef29
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
bool IncludeHeaders = true;
string FileNameAndPath = Dts.Variables["User::FileExportNameAndPath"].Value.ToString();
// this gets the data object and sets ti to a data table
OleDbDataAdapter A = new OleDbDataAdapter();
System.Data.DataTable dt = new System.Data.DataTable();
A.Fill(dt, Dts.Variables["User::ObjDataToSaveToExportFile"].Value);
// for test data
//DataTable sourceTable = GetTestData();
DataTable sourceTable = dt;
//using (StreamWriter writer = new StreamWriter("C:\\Temp\\dump.csv")) {
using (StreamWriter writer = new StreamWriter(FileNameAndPath))
{
// this calls the class in another file
ConvertToCSV.WriteDataTable(sourceTable, writer, IncludeHeaders);
}
Dts.TaskResult = (int)ScriptResults.Success;
}// end main
public DataTable GetTestData()
{
DataTable sourceTable = new DataTable();
sourceTable.Columns.AddRange(new DataColumn[] {
new DataColumn("ID", typeof(Guid)),
new DataColumn("Date", typeof(DateTime)),
new DataColumn("StringValue", typeof(string)),
new DataColumn("NumberValue", typeof(int)),
new DataColumn("BooleanValue", typeof(bool))
});
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String1", 100, true);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String2", 200, false);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String3", 300, true);
return sourceTable;
}// end get teest data
public static class Extensions
{
public static string ToCSV(DataTable table)
{
var result = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(table.Columns[i].ColumnName);
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(row[i].ToString());
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
}
return result.ToString();
}
}
#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}// end class
}// end namespace
我的项目中有第二个文件,名为:ConvertToCSV.cs,其中的代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
namespace ST_a8a7451a5662418eb87a1394e40bef29
{
class ConvertToCSV
{
public static void WriteDataTable(DataTable sourceTable, TextWriter writer, bool includeHeaders)
{
if (includeHeaders) {
IEnumerable<String> headerValues = sourceTable.Columns
.OfType<DataColumn>()
.Select(column => QuoteValue(column.ColumnName));
writer.WriteLine(String.Join(",", headerValues));
}
IEnumerable<String> items = null;
foreach (DataRow row in sourceTable.Rows) {
items = row.ItemArray.Select(o => QuoteValue(o.ToString()));
writer.WriteLine(String.Join(",", items));
}
writer.Flush();
}// end Write Data Table
// this function adds quotes around the strings for text qualified values
private static string QuoteValue(string value)
{
return String.Concat("\"",
value.Replace("\"", "\"\""), "\"");
}
}
}