【发布时间】:2017-02-25 02:02:04
【问题描述】:
我目前正在创建一个 SSIS,它将从数据库中收集数据并将其输出到单个逗号分隔的平面文件中。该文件将包含订单详细信息 文件格式为
Order#1 details (51 columns)
Order#1 header (62 columns)
Order#2 details (51 columns)
Order#2 header (62 columns)
etc...
订单标题有 62 列,订单详情有 51 列。我需要将它输出到一个平面文件,我遇到了一个问题,因为 SSIS 不处理不同的列。有人可以帮我吗,鉴于我的源是带有查询的 OLEDB 源,我如何创建脚本组件以输出到文件。
当前包如下所示:
- 获取所有订单的列表。将 orderid 作为变量传递。
- for 循环容器遍历每个 orderid,运行数据任务流以获取订单的订单详细信息。运行数据任务以获取订单标题。 我只是遇到了将每一行输出到平面文件的问题。
如果有人能提供帮助,我们将不胜感激。我已经为此苦苦挣扎了一个星期。如果有人可以让我从脚本组件代码的外观开始,我将不胜感激。
我已经添加了到目前为止的内容: http://imgur.com/a/yTxfH
这就是我的脚本的样子:
public void Main()
{
// TODO: Add your code here
DataTable RecordType300 = new DataTable();
DataTable RecordType210 = new DataTable();
DataTable RecordType220 = new DataTable();
DataTable RecordType200 = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(RecordType300, Dts.Variables["User:rec_type300"].Value);
adapter.Fill(RecordType210, Dts.Variables["User::rec_type_210"].Value);
adapter.Fill(RecordType220, Dts.Variables["User::rec_type_220"].Value);
adapter.Fill(RecordType200, Dts.Variables["User::rec_type200"].Value);
using (StreamWriter outfile = new StreamWriter("C:\\myoutput.csv"))
{
for (var i = 0; i < RecordType300.Rows.Count; i++)
{
var detailFields = RecordType300.Rows[i].ItemArray.Select(field => field.ToString()).ToArray();
// var poBillFields = RecordType210.Rows[i].ItemArray.Select(field => field.ToString()).ToArray();
// var poShipFields = RecordType220.Rows[i].ItemArray.Select(field => field.ToString()).ToArray();
// var poHeaderFields = RecordType200.Rows[i].ItemArray.Select(field => field.ToString()).ToArray();
outfile.WriteLine(String.Join(",", detailFields));
// outfile.WriteLine(string.Join(",", poBillFields));
// outfile.WriteLine(string.Join(",", poShipFields));
// outfile.WriteLine(string.Join(",", poHeaderFields));
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
但每次我运行它时,它都会出错。我在这里错过了什么吗?另外,我将如何在开始时创建一个文件只有 1 次。这意味着每次运行这个包时,它都会创建一个带有日期戳的文件,并每次都附加到它上面。下次运行包时,它将创建一个带有新日期戳的新文件,并根据订单号附加每个订单详细信息。
【问题讨论】:
-
我认为你的剧本想法是正确的。考虑将标题和详细信息中的结果放入两个单独的数据表中。请参阅此链接作为如何填充和迭代它们的示例。 stackoverflow.com/a/14103080
-
@Sorrell。目前我确实有两个单独的数据表。我遇到的问题实际上是创建脚本。
-
对于不完整的文件,通常的解决方法是将数据导出为 one 列,该列恰好包含一堆以逗号分隔的数据。您可以编写一个查询来生成和导出它,但这取决于您更喜欢 T-SQL 还是 C#。恕我直言,C# / Lookup 方法令人费解且不连贯。我更喜欢编写一个 SQL 查询来完成所有工作(高效)并导出它
-
我喜欢@Nick.McDermaid 提出的想法。您可以使用 (ponumber, filetype, csvcontents (max varchar)) 创建一个表。那么您可能有 4 个 PO# 1 条目(#1_detail 文件类型、#2_bill 文件类型、#3)ship 文件类型、#4_header 文件类型)。然后在你的 SQL 中,
ORDER BY PONUMBER, FILETYPE
标签: sql-server ssis etl ssis-2012