如何在 SSIS 中追加来自两个源的两行?
How to Append two rows from two source in SSIS?
我必须在 MySQL 服务器中 table。
HeaderTable。
╔════════════╦════════╦═════════════╦═════════════════╦══════════╗
║ RecordType ║ CustID ║ DataGenDate ║ DataCreatedDate ║ SourceID ║
╠════════════╬════════╬═════════════╬═════════════════╬══════════╣
║ H ║ #1234 ║ 2018-01-05 ║ 2018-01-01 ║ V301 ║
╚════════════╩════════╩═════════════╩═════════════════╩══════════╝
交易Table
╔════════════╦══════════╦══════════════╦══════════════╦════════════╗
║ 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 信息和交易 table 有交易数据。
我想通过 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 源和平面文件目标来导出文件,但没有成功。只有我得到交易或 Header 行。
这可以使用脚本任务完成,如下所示,在本例中使用 C#。这将创建一个带有竖线 (|
) 分隔符的 CSV 文件。 运行 使用此进行的示例测试我能够通过 SSIS 平面文件连接管理器导入输出 CSV 文件,而无需对文件进行任何修改。此示例假设 header table 中只有一行,否则您需要将此 table 的 SQL 修改为 return 正确的行.
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());
我必须在 MySQL 服务器中 table。
HeaderTable。
╔════════════╦════════╦═════════════╦═════════════════╦══════════╗ ║ RecordType ║ CustID ║ DataGenDate ║ DataCreatedDate ║ SourceID ║ ╠════════════╬════════╬═════════════╬═════════════════╬══════════╣ ║ H ║ #1234 ║ 2018-01-05 ║ 2018-01-01 ║ V301 ║ ╚════════════╩════════╩═════════════╩═════════════════╩══════════╝
交易Table
╔════════════╦══════════╦══════════════╦══════════════╦════════════╗ ║ 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 信息和交易 table 有交易数据。 我想通过 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 源和平面文件目标来导出文件,但没有成功。只有我得到交易或 Header 行。
这可以使用脚本任务完成,如下所示,在本例中使用 C#。这将创建一个带有竖线 (|
) 分隔符的 CSV 文件。 运行 使用此进行的示例测试我能够通过 SSIS 平面文件连接管理器导入输出 CSV 文件,而无需对文件进行任何修改。此示例假设 header table 中只有一行,否则您需要将此 table 的 SQL 修改为 return 正确的行.
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());