Это можно сделать с помощью задачи «Сценарий» следующим образом, в этом случае используется C #.Это создаст файл CSV с разделителем канала (|
).Запустив образец теста с этим, я смог импортировать выходной CSV-файл через диспетчер соединений с плоскими файлами SSIS без каких-либо изменений в файле.В этом примере предполагается, что в таблице заголовков есть только одна строка, в противном случае вам потребуется изменить 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());