Вот код, который вы можете использовать для задачи скрипта, которая позволит вам вывести CSV с верхним и нижним колонтитулами:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
namespace ST_80294de8b8dd4779a54f707270089f8c.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
int ErrorFlag = 0;
// Try-Catch block
try
{
int RowCount = 0;
bool fireAgain = true;
string SQLCommandText = "SELECT ColumnA = 1, ColumnB = 'A' UNION SELECT ColumnA = 2, ColumnB = 'B' UNION SELECT ColumnA = 3, ColumnB = 'C';";
SqlConnection SQLConnection = new SqlConnection("Data Source=LocalHost;Initial Catalog=master;Integrated Security=SSPI;Application Name=SSIS-My Package Name;Connect Timeout=600");
SqlCommand SQLCommand = new SqlCommand(SQLCommandText, SQLConnection);
SQLCommand.CommandTimeout = 60 * 60;
SqlDataAdapter SQLDataAdapter = new SqlDataAdapter(SQLCommand);
DataTable dt = new DataTable();
SQLDataAdapter.Fill(dt);
SQLConnection.Close();
RowCount = dt.Rows.Count;
Dts.Events.FireInformation(0, "DataTable Rows", RowCount.ToString(), "", 0, ref fireAgain);
StreamWriter sw = new StreamWriter("C:\\Test.csv", false);
// Write the header.
sw.Write("Today's date is " + DateTime.Now.ToLongDateString());
// Write the column headers.
sw.Write(sw.NewLine);
int iColCount = dt.Columns.Count;
for (int i = 0; i < iColCount; i++)
{
sw.Write(dt.Columns[i]);
if (i < iColCount - 1)
{
sw.Write(",");
}
}
// Write the details.
sw.Write(sw.NewLine);
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < iColCount; i++)
{
if (!Convert.IsDBNull(dr[i]))
{
sw.Write(dr[i].ToString());
}
if (i < iColCount - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
}
// Write the footer.
sw.Write("Row count: " + RowCount.ToString());
sw.Close();
}
catch (SqlException e)
{
Dts.Events.FireError(0, "SqlException", e.Message, "", 0);
ErrorFlag = 1;
}
catch (IOException e)
{
Dts.Events.FireError(0, "IOException", e.Message, "", 0);
ErrorFlag = 1;
}
catch (Exception e)
{
Dts.Events.FireError(0, "Exception", e.Message, "", 0);
ErrorFlag = 1;
}
// Return results.
if (ErrorFlag == 0)
{
Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
}
}
Вы также можете сделать это, не прибегая к C #, но это будет немного уродливо:
Переменная 1: переменная типа Int, используемая для назначения числа строк из потока данных 2.
Переменная 2: строковая переменная с выражением, которое генерирует команду SQL. Если переменная 1 с именем RowCount, то вот пример кода для нее:
"SELECT ColumnA = '" + (DT_WSTR, 1252) (@ [User :: RowCount]) + "', ColumnB = NULL"
Поток данных 1: выполняет команду SQL для генерации заголовка файла и вывода в место назначения плоского файла. Установите для «перезаписи данных в файле» значение true.
Поток данных 2: выполняет команду SQL для генерации сведений о плоском файле. Установите для «перезаписи данных в файле» значение false. Включите преобразование «Количество строк» и присвойте значение переменной 1.
Поток данных 3: выполняет команду SQL для генерации нижнего колонтитула плоского файла. Источник должен «Установить команду из переменной» и выполнить переменную 2. Установите для «перезаписи данных в файле» значение false.