У меня была точно такая же проблема. Я провожу больше одного дня, стуча головой об этом. Вот что я нашел. Хотя файл конфигурации позволяет вам указать HeaderRowDelimiter, разделитель каждого столбца все еще сохраняется в самом пакете, и эти значения не могут быть изменены! Проблема, в частности, связана с тем, что в коде пакета сохраняется разделитель последнего столбца:
<DTS:FlatFileColumn><DTS:Property DTS:Name="ColumnType">Delimited</DTS:Property><DTS:Property DTS:Name="ColumnDelimiter" xml:space="preserve">_x000A_</DTS:Property><DTS:Property DTS:Name="ColumnWidth">0</DTS:Property><DTS:Property DTS:Name="MaximumWidth">50</DTS:Property><DTS:Property DTS:Name="DataType">129</DTS:Property><DTS:Property DTS:Name="DataPrecision">0</DTS:Property><DTS:Property DTS:Name="DataScale">0</DTS:Property><DTS:Property DTS:Name="TextQualified">-1</DTS:Property><DTS:Property DTS:Name="ObjectName">ExpirationDate</DTS:Property><DTS:Property DTS:Name="DTSID">{C6321083-8C75-43C7-B8C8-B234F7C645BA}</DTS:Property><DTS:Property DTS:Name="Description"></DTS:Property><DTS:Property DTS:Name="CreationName"></DTS:Property></DTS:FlatFileColumn>
Обратите внимание, как ColumnDelimiter последнего столбца имеет значение x000A . Это потому, что файл, с которым я настраиваю Flat File Connection, во время разработки имеет {LF} в качестве разделителя строк. Если бы я указал на файл с разделителем строк {CR} {LF}, то ColumnDelimiter последнего столбца был бы x000D _x000A_, и они не переопределялись бы значениями из файла конфигурации.
В моем случае, если я разработал пакет с файлом, у которого {CR} {LF} в качестве разделителя строк, чем во время выполнения, файл с {LF} разделителем вообще не загружается в таблицу (очевидно, потому что он не может найти {CR} {LF}, который указывает на конец строки). Однако, если я создаю указание пакета на разделитель файла {LF}, то во время выполнения обрабатывается файл с разделителем {CR} {LF], но {CR} добавляется к последнему полю файла. В моем случае это было поле даты, и символ {CR} в конце делает его полностью недействительным. Просто попробуйте это:
print isdate('1/1/2010' + char(13))
Вы можете использовать Replace () и заменить char (13) на '', но это означает добавление специфической для экземпляра задачи SQL, которая перестанет работать, если, скажем, в файл souce добавлен другой столбец.
Решение: я заканчиваю указывать во время разработки на файл с разделителем {LF} и добавляю задачу преобразования производного столбца после источника плоских файлов с выражением, чтобы удалить {CR}, если файл во время выполнения имеет {CR} {LF } разделитель:
REPLACE(ExpirationDate,"\r","")