Назначение компонента сценариев SSIS - разделение данных таблицы на несколько файлов - PullRequest
0 голосов
/ 11 сентября 2018

Я использую задачу потока данных для подключения к источнику oledb и запуска кода SQL, который создает миллионы строк.Каждая строка представляет собой содержимое XML, существует только один столбец (nvarchar (max)).Я подключаю это к назначению компонента скрипта, причина в том, что когда количество строк достигает 10 КБ, я хочу остановиться и записать в другой файл.

Это прекрасно работает, когда я использую точку останова, поэтому, если есть 100 строк, и яхочу 10 строк в каждом файле, когда я использую точку останова, он создает 10 файлов.Но когда я запускаю pacakge без точек останова, он создает случайное количество файлов.Например: он создает 6 файлов, 3 из которых содержат 10 строк, а остальные 70 разбиты на другие файлы.

Я прочитал документы и блоги, чтобы увидеть, является ли входной буфер синхронным, и кажется, что это так.т.е. каждая строка обрабатывается по одному, по крайней мере, таково мое понимание, поэтому я не уверен, что является основной причиной этой проблемы?Может кто-нибудь, пожалуйста, пролить немного света.Ниже приведен код, который я использую для разделения файлов в Script Componenet

 [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
 StreamWriter writer;
    int rowCount = 0;
    int rowLimit = 50;
    String RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt"; 
    public override void PreExecute()
    {
        base.PreExecute();
        writer = new System.IO.StreamWriter(RunFileName, true);
        rowCount = 0;
    }
    public override void PostExecute()
    {
        base.PostExecute();
        writer.Dispose(); 
    }
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (rowCount == rowLimit)
        {
            writer.Dispose();
            rowCount = 0;
            RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
            writer = new System.IO.StreamWriter(RunFileName, true);
        }
        var data = System.Text.Encoding.Unicode.GetString(Row.XMLInnerText.GetBlobData(0, Convert.ToInt32(Row.XMLInnerText.Length)));
        writer.WriteLine(data);
        rowCount++; 
    }
}

1 Ответ

0 голосов
/ 11 сентября 2018

Извините, если я потратил впустую время.Проблема была из-за того, как я создал имя файла, он начал добавляться к тому же файлу.

RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
...