2013-02-27 3 views
1

Я использую Flat File Destination для экспорта моих данных в текстовый файл. Мне нужно ограничить выходной размер файла до 1 МБ. Является ли это возможным?Предельный выходной размер плоского файла в SSIS

+1

Как вы планируете обрабатывать недостающие строки? Вы можете использовать * SELECT TOP x ROWS WHERE ToExport = 1 * – jazzytomato

ответ

0

Если данные превысят размер файла, вы должны принять решение о том, какие данные следует опустить. Это то, что может решить только вы или ваш клиент.

Затем напишите запрос, чтобы вернуть только те данные, которые необходимы.

0

Некоторые идеи:

Используя сценарий преобразования, нужно иметь сгенерированный класс, который имеет метод «получить следующую строку» для вашей логики - На этом классе добавить счетчик, и на каждой строке вы получаете работать размер данных строки и добавление ее в счетчик. Если счетчик превышает 1 000 строк, не помещайте строку в выходной буфер.

Используйте компонент сценария в потоке управления, вызовите методы .Net IO, чтобы читать 1 мб файла и писать только обратно (это означает, что вы создаете большой файл, а затем уменьшаете его).

Действительно, SSIS не собирается делать это хорошо. Я бы пошел с подходом «SELECT TOP X», если бы это был я.

0

Нет ничего лишнего, что сделает это в SSIS; однако довольно просто закодировать трансформацию сценария, которая может выступать в роли адресата потока данных и ограничивает размер его выходного файла. Не сложнее добавить код для создания нескольких файлов (каждый меньше указанного размера) по мере необходимости для хранения всех результирующих данных.

Например, предположим, что ваш исходный запрос

SELECT 
    TABLE_CATALOG, 
    TABLE_SCHEMA, 
    TABLE_NAME, 
    COLUMN_NAME, 
    ORDINAL_POSITION, 
    COLUMN_DEFAULT, 
    IS_NULLABLE, 
    DATA_TYPE, 
    CHARACTER_MAXIMUM_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 

и вы пытаетесь записать это на один или несколько файлов CSV, не превосходящих некоторого определенного размера каждого файла.

Определить три переменного уровень пакета следующим образом:

  • пользователя :: TargetFolder (String, содержащее имя папки, вы хотите написать)
  • User :: TargetFileNamePattern (String с рисунком наименований выходные файлы; например SampleOutput{0}.csv)
  • пользователя :: MaxFileLength (Int32, содержащий максимальное количество символов в файле)

Создать свой поток данных, как это:

data flow screenshot

И код преобразования сценарий таким образом:

/* Microsoft SQL Server Integration Services Script Component 
* Write scripts using Microsoft Visual C# 2008. 
* ScriptMain is the entry point class of the script.*/ 

using System; 
using System.Data; 
using System.IO; 
using System.Text; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
using Microsoft.SqlServer.Dts.Runtime.Wrapper; 

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 
    private int _fileCounter; 
    private int _bytesWritten; 
    private TextWriter _tw; 

    private TextWriter CurrentWriter 
    { 
     get 
     { 
      if (_tw == null) 
      { 
       string fileName = String.Format(this.Variables.TargetFileNamePattern, _fileCounter); 
       string filePath = Path.Combine(this.Variables.TargetFolder, fileName); 
       _tw = File.CreateText(filePath); 
      } 
      return _tw; 
     } 
    } 

    public override void PreExecute() 
    { 
     base.PreExecute(); 
     _fileCounter = 1; 
     _bytesWritten = 0; 
     _tw = null; 
    } 

    public override void PostExecute() 
    { 
     base.PostExecute(); 
     if (_tw != null) 
     { 
      _tw.Flush(); 
      _tw.Close(); 
     } 
    } 

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
     string thisLine = String.Format(
       "{0},{1},{2},{3},{4},{5},{6},{7},{8}", 
       Row.TABLECATALOG, 
       Row.TABLESCHEMA, 
       Row.TABLENAME, 
       Row.COLUMNNAME, 
       Row.ORDINALPOSITION, 
       Row.COLUMNDEFAULT_IsNull ? "NULL" : Row.COLUMNDEFAULT, 
       Row.ISNULLABLE, 
       Row.DATATYPE, 
       Row.CHARACTERMAXIMUMLENGTH_IsNull ? "NULL" : Row.CHARACTERMAXIMUMLENGTH.ToString()); 
     if (_bytesWritten + thisLine.Length > this.Variables.MaxFileLength) 
     { 
      _tw.Flush(); 
      _tw.Close(); 
      _tw = null; 
      _fileCounter += 1; 
      _bytesWritten = 0; 
     } 
     this.CurrentWriter.WriteLine(thisLine); 
     _bytesWritten += thisLine.Length; 
    } 
} 

Для каждой строки в запросе источника, это будет построить строку, которая будет написана и затем убедитесь, что добавление этой строки в текущий TextWriter приведет к тому, что файл будет слишком большим. Если это так, текущий файл очищается на диск и закрывается; следующий вызов this.CurrentWriter создаст новый объект TextWriter для следующего файла в последовательности.

Смежные вопросы