【问题标题】:How to Append two rows from two source in SSIS?如何在 SSIS 中从两个源追加两行?
【发布时间】:2019-03-07 11:06:16
【问题描述】:

我必须在 MySQL 服务器中建表。

  1. 标题表。 ╔════════════╦════════╦═════════════╦═════════════════╦══════════╗ ║ RecordType ║ CustID ║ DataGenDate ║ DataCreatedDate ║ SourceID ║ ╠════════════╬════════╬═════════════╬═════════════════╬══════════╣ ║ H ║ #1234 ║ 2018-01-05 ║ 2018-01-01 ║ V301 ║ ╚════════════╩════════╩═════════════╩═════════════════╩══════════╝

  2. 事务表 ╔════════════╦══════════╦══════════════╦══════════════╦════════════╗ ║ RecordType ║ ProdCode ║ OpeningValue ║ ClosingValue ║ TranDate ║ ╠════════════╬══════════╬══════════════╬══════════════╬════════════╣ ║ T ║ AL001 ║ 95 ║ 90 ║ 2018-01-01 ║ ╠════════════╬══════════╬══════════════╬══════════════╬════════════╣ ║ T ║ AL002 ║ 54 ║ 40 ║ 2018-01-01 ║ ╠════════════╬══════════╬══════════════╬══════════════╬════════════╣ ║ T ║ AL003 ║ 63 ║ 43 ║ 2018-01-02 ║ ╠════════════╬══════════╬══════════════╬══════════════╬════════════╣ ║ T ║ AL004 ║ 56 ║ 23 ║ 2018-01-01 ║ ╚════════════╩══════════╩══════════════╩══════════════╩════════════╝

Header Table 有 Header Information,Transaction 表有 Transaction Data。 我希望通过 SSIS 生成以下格式的文本文件(竖线分隔的“|”)。

H|#1234|2018-01-05|2018-01-01|V301
----------------------------------------
T|AL001|95        |90        |2018-01-01
T|AL002|54        |40        |2018-01-01
T|AL003|63        |43        |2018-01-02
T|AL004|56        |23        |2018-01-01

我尝试使用 ole DB 源和平面文件目标来导出文件,但没有成功。只有我得到交易或标题行。

【问题讨论】:

  • 不确定你是想从 MySQL 还是 SQL Server 获得这个(我怀疑是后者),但是,你在这里要求的是一个动态的 Pivot。但是,SSIS 无法处理导出数据的动态数据透视。 SSIS 需要数据的静态定义。如果您想在导出中使用这种类型的数据,我建议您使用 SSRS 和矩阵。
  • 嗨@Larnu 我想从 SQL Server 得到这个
  • 这并没有改变我上面关于动态数据的 cmets。
  • 您可以使用 C# 脚本任务获取数据集并动态生成 .csv 或 Excel 文件。对于 Excel,尽管您需要在 SSIS 服务器上安装正确的 .dll。

标签: sql-server ssis sql-server-2012 ssis-2012


【解决方案1】:

这可以使用如下的脚本任务来完成,在这种情况下使用 C#。这将创建一个带有管道 (|) 分隔符的 CSV 文件。使用此运行示例测试,我能够通过 SSIS 平面文件连接管理器导入输出 CSV 文件,而无需对文件进行任何修改。此示例假定标题表中只有一行,否则您需要修改此表的 SQL 以返回正确的行。

using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;



//Windows Authentication (Integrated Security)
 string connectionString = @"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=true";
 string headerCmd = @"SELECT RecordType, CustID, DataGenDate, DataCreatedDate, SourceID FROM HeaderTable";
 string rowCmd = @"SELECT RecordType, CustID, DataGenDate, DataCreatedDate, SourceID FROM TransactionTable";

 string outputFile = Dts.Variables["User::FilePathVariable"].Value.ToString();

 StringBuilder csvData = new StringBuilder();
 int headerInt = 0;
 DataTable headerDT = new DataTable();
 DataTable rowDT = new DataTable();

 using (SqlConnection conn = new SqlConnection(connectionString))
 {
     SqlCommand headerSQL = new SqlCommand(headerCmd, conn);
     SqlCommand rowSQL = new SqlCommand(rowCmd, conn);

     SqlDataAdapter da = new SqlDataAdapter();

     conn.Open();

     //get header row
     da.SelectCommand = headerSQL;
     da.Fill(headerDT);

     //get data from Transaction table
     da.SelectCommand = rowSQL;
     da.Fill(rowDT);
 }

 //build header
 foreach (DataRow hDR in headerDT.Rows)
 {
     foreach (DataColumn hDC in headerDT.Columns)
     {
         csvData.Append(hDR[headerInt].ToString() + "|");
         headerInt++;
     }
 }

 //remove last pipe then start new line                    
 csvData.Remove(csvData.Length - 1, 1);
 csvData.Append(Environment.NewLine);

 //add rows
 foreach (DataRow rDR in rowDT.Rows)
 {
     for (int i = 0; i < headerInt; i++)
     {
         csvData.Append(rDR[i] + "|");
     }
     csvData.Remove(csvData.Length - 1, 1);
     csvData.Append(Environment.NewLine);
 }
 //write to CSV
 File.WriteAllText(outputFile, csvData.ToString());

【讨论】:

  • 为什么不使用脚本任务构建标题并使用数据流任务导入数据?
  • @Hadi 如果列数是静态的,那将是有意义的。我不确定他们是否如此,所以我发布了答案以容纳不同数量的列。但是,如果问题中始终存在 5 列,则使用脚本任务来处理列,并且导入的 DFT 会简化这一点。
  • 我完全同意
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多