Вы не можете сделать это через BIDS (парень, это было бы неплохо), но вы, безусловно, можете сделать это через объектную модель.Я построил программу, которая считывала мастер-файлы Focus (описывала разметку текста с фиксированной шириной) и использовала пакет шаблонов, а затем обновляю менеджер соединений, чтобы отразить разметку столбцов (которую я прочитал в своей собственной структуре данных).Синтаксический анализ SQL может быть немного сложнее, но он, безусловно, полуавтоматизирован.
Обратите внимание, что если у SQL есть собственные типы, такие как int, кто-то должен будет сказать вам, или вам придется выяснить, насколько широкоint находится в текстовом файле, если вы используете столбцы фиксированной ширины.В этом случае ваша жизнь может быть намного проще в CSV.
Моя полная программа также выполняет преобразование производного столбца в области обрезки и выполняет некоторые другие действия - сгенерированный пакет затем очищается и тестируется вручную.
Вот пример кода (mf - моя объектная модель для мастер-файла, этот код загружает пакет шаблонов, добавляет диспетчер соединений, помещает все поля):
Application App = new Microsoft.SqlServer.Dts.Runtime.Application();
p = App.LoadPackage(TemplatePackage, null);
ConnectionManager cm = p.Connections.Add("FLATFILE");
cm.Properties["Name"].SetValue(cm, mf.SSISConnectionManagerName);
cm.Properties["ConnectionString"].SetValue(cm, FlatFilePath);
cm.Properties["Format"].SetValue(cm, "FixedWidth");
cm.Properties["RowDelimiter"].SetValue(cm, "\r\n");
cm.Properties["HeaderRowDelimiter"].SetValue(cm, "\r\n");
cm.Properties["CodePage"].SetValue(cm, 1252);
cm.Properties["ConnectionString"].SetExpression(cm, "@[User::FilePath] + \"\\\\\" + @[User::FileName]");
RWrap.IDTSConnectionManagerFlatFile90 con = cm.InnerObject as RWrap.IDTSConnectionManagerFlatFile90;
List<FocusField> flds = mf.Fields();
foreach (FocusField fld in flds)
{
RWrap.IDTSConnectionManagerFlatFileColumn90 Col = con.Columns.Add();
(Col as RWrap.IDTSName90).Name = fld.FieldName;
Col.ColumnType = "FixedWidth";
Col.ColumnDelimiter = "";
Col.DataType = RWrap.DataType.DT_STR;
Col.ColumnWidth = fld.SSISColumnWidth;
Col.MaximumWidth = fld.SSISColumnWidth;
}
RWrap.IDTSConnectionManagerFlatFileColumn90 EolCol = con.Columns.Add();
(EolCol as RWrap.IDTSName90).Name = "CRLF";
EolCol.ColumnType = "FixedWidth";
EolCol.ColumnDelimiter = "";
EolCol.DataType = RWrap.DataType.DT_STR;
EolCol.ColumnWidth = 2;
EolCol.MaximumWidth = 2;