SSIS - Как установить 'RowDelimiter' и 'HeaderRowDelimiter' из файла конфигурации XML? - PullRequest
0 голосов
/ 11 марта 2010

Я хочу иметь возможность настроить значения 'RowDelimiter' и 'HeaderRowDelimiter', используемые моим диспетчером соединений с плоскими файлами, с помощью моего файла конфигурации XML.

Я использовал файлы конфигурации XML с пакетами служб SSIS много раз без каких-либо проблем, и поэтому я знаю, что мой файл конфигурации правильно отформатирован и выбирается моим пакетом, но пакет, похоже, не изменяет Значения 'RowDelimiter', указанные в файле конфигурации.

По сути, я хочу иметь возможность настроить использование либо терминаторов строки {CR} {LF}, либо терминаторов {LF}, но я не могу понять, что я делаю неправильно. Независимо от того, какие значения я пытаюсь настроить, значения, указанные во время разработки, имеют приоритет. Я также пытался вообще ничего не указывать для разделителей во время разработки, но затем процесс завершается неудачей из-за того, что он игнорирует фактические терминаторы в плоском файле (то есть, опять же, кажется, что он полностью игнорирует мои параметры конфигурации и пытается использовать именно то, что был указан во время разработки).

Мои записи конфигурации следующие:

  <Configuration ConfiguredType="Property" Path="\Package.Connections[Connection 1].Properties[HeaderRowDelimiter]" ValueType="String" xml:space="preserve">
<ConfiguredValue>_x000D__x000A_</ConfiguredValue>  </Configuration>

Очевидно, это сводит меня с ума, так как это должно быть так просто и понятно, поэтому любая помощь будет очень признательна !!!

Pat.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

У меня была точно такая же проблема. Я провожу больше одного дня, стуча головой об этом. Вот что я нашел. Хотя файл конфигурации позволяет вам указать 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","")
1 голос
/ 28 сентября 2010

В SSIS 2008 R2 я могу изменить разделитель строк с помощью выражений. Хитрость заключается в том, чтобы использовать значения "{CR} {LF}" соответственно «{LF}» для установки желаемого разделителя строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...