Sql server 如何在SSI中从两个源追加两行?

Sql server 如何在SSI中从两个源追加两行?,sql-server,ssis,sql-server-2012,ssis-2012,Sql Server,Ssis,Sql Server 2012,Ssis 2012,我必须在MySQL服务器中创建表 标题表。 ╔════════════╦════════╦═════════════╦═════════════════╦══════════╗ ║ 记录类型║ 卡斯蒂德║ 数据性别║ 数据创建数据║ 源ID║ ╠════════════╬════════╬═════════════╬═════════════════╬══════════╣ ║ H║ #1234║ 2018-01-05 ║ 2018-01-01 ║ V301║ ╚═════════

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

  • 标题表。
    
    ╔════════════╦════════╦═════════════╦═════════════════╦══════════╗
    ║ 记录类型║ 卡斯蒂德║ 数据性别║ 数据创建数据║ 源ID║
    ╠════════════╬════════╬═════════════╬═════════════════╬══════════╣
    ║ 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 ║
    ╚════════════╩══════════╩══════════════╩══════════════╩════════════╝

  • 表头表有表头信息,交易表有交易数据。 我希望通过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源和平面文件目标导出文件,但没有成功。只有我得到的是事务行或标题行。

    这可以使用脚本任务来完成,如下所示,在本例中使用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());
    
    使用系统数据;
    使用System.Data.SqlClient;
    使用System.IO;
    使用系统文本;
    //Windows身份验证(集成安全)
    字符串连接字符串=@“数据源=服务器名;初始目录=数据库名;集成安全性=真”;
    字符串headerCmd=@“从HeaderTable中选择记录类型、CustID、DataGenDate、DataCreatedDate、SourceID”;
    string rowCmd=@“从TransactionTable中选择记录类型、CustID、DataGenDate、DataCreatedDate、SourceID”;
    字符串outputFile=Dts.Variables[“User::FilePathVariable”].Value.ToString();
    StringBuilder csvData=新的StringBuilder();
    int headerInt=0;
    DataTable headerDT=新DataTable();
    DataTable rowDT=新DataTable();
    使用(SqlConnection conn=newsqlconnection(connectionString))
    {
    SqlCommand headerSQL=新的SqlCommand(headerCmd,conn);
    SqlCommand rowSQL=新的SqlCommand(rowCmd,conn);
    SqlDataAdapter da=新的SqlDataAdapter();
    conn.Open();
    //获取标题行
    da.SelectCommand=headerSQL;
    da.填充(头部);
    //从事务表中获取数据
    da.SelectCommand=rowSQL;
    da.填充(rowDT);
    }
    //生成标头
    foreach(headerDT.行中的数据行hDR)
    {
    foreach(headerDT.Columns中的数据列hDC)
    {
    追加(hDR[headerInt].ToString()+“|”);
    headerInt++;
    }
    }
    //拆除最后一根管道,然后开始新的管线
    csvData.Remove(csvData.Length-1,1);
    追加(Environment.NewLine);
    //添加行
    foreach(rowDT.Rows中的数据行rDR)
    {
    for(int i=0;i
    不确定您是否希望从MySQL或SQL Server(我怀疑后者)获得此功能,但是,您需要的是一个动态轴心。但是,SSI无法处理导出数据的动态透视。SSIS需要数据的静态定义。如果您希望在导出中使用这种类型的数据,我建议使用SSRS和matrix.hi@Larnu。我希望从SQL Server获得这种数据,但不会改变我对动态数据的上述注释。您可以使用C#脚本任务获取数据集并动态生成.csv或Excel文件。对于Excel,但您需要在SSIS服务器上安装正确的.dll。为什么不使用脚本任务构建标头和使用数据流任务导入数据可能存在重复?如果列数是静态的,则@Hadi有意义。我不确定他们是否是,所以我发布了答案,以适应不同数量的客户