2010-11-16 5 views
1

Я создал пакет SSIS, поэтому я могу импортировать данные из старой базы данных FoxPro через запланированные промежутки времени. Копия базы данных FoxPro установлена ​​для нескольких клиентов. В целом, пакет работает очень хорошо и выполняет все, что мне нужно.SSIS OLE DB Источник данных: вывод столбца, который может иметь разную длину

Однако у меня есть одна неприятная ситуация, когда по крайней мере один клиент (возможно, больше) имеет измененную базу данных FP, где они увеличивают длину одного столбца в одной таблице. Когда я запускаю пакет на такого клиента, он терпит неудачу из-за усечения.

Я думал, что могу просто дать себе комнату для маневра и изменить длину от 3 до 10. Таким образом, мутанты длиной 10 будут размещены, как и все остальные, используя 3. Однако SSIS жалуется, когда длина столбцов не совпадает, период.

Я полагаю, у меня есть несколько вариантов:

  1. На задачи, установите 'ValidateExternalMetadata' ложь. Однако я не уверен, что это самый ответственный вариант ... или не так ли?
  2. Получите нашу команду по внедрению, чтобы изменить длину до 10 для всех клиентов. Это может быть проблемой, но, по крайней мере, это будет их проблемой.
  3. Создайте копию задачи, которая работает для решений с различной длиной столбца. Реализация, скорее всего, будет использовать неправильный пакет в какой-то момент, и каждый спросит меня, почему я не просто предоставил им один пакет, который не мог бы обрабатывать все сценарии и обвинять меня в этом.
  4. Используйте другой подход, который вы могли бы заполнить.

ответ

0

Если вы используете Visual FoxPro OleDB, и вас беспокоят ширины столбцов, вы можете явно принудительно их использовать с помощью PADR() во время вашего вызова. Я не знаю, сколько таблиц/запросов это влияет, но гарантирует, что вы получите ожидаемые длины столбцов символов. Если дело с числовыми, десятичной, дата/время, логическое (булево), не должно быть проблемой ... Во всяком случае, вы могли бы сделать это как ваш выбор, чтобы получить данные

select 
     t1.Fld1, 
     t1.Fld2, 
     padr(t1.CharFld3, 20) CharFld3, 
     padr(t1.CharFld4, 5) CharFld4, 
     t1.OtherFld5, 
     padr(t1.CharFld6, 35) CharFld5 
    from 
     YourTable t1 
    where 
     SomeCondition 

Это вынудит на основе символов (подразумеваемые образцы) «CharFld3», «CharFld4», «CharFld6» до ширины силы 20, 5 и 35, независимо от длины базовой структуры. Теперь, если кто-то обновит структуру ДОЛГО, чем то, что у вас есть, она будет усечена до нужной длины, но не сработает. Кроме того, если они имеют меньшую длину столбца, он будет дополнен до полного размера, указанного вами через функцию PADR() (правая кнопка).

+0

Я закончил использовать CAST (я ошибался при попытке использовать CONVERT на ранней стадии для SSIS, имеющего ограничение на то, что вы не могли использовать рассчитанные столбцы в качестве источника данных, когда на самом деле я имел в виду эквивалентный CAST OLE DB/ANSI 92), но я думаю, что это принципиально похоже на то, что вы предложили. Благодарю. – HackedByChinese

0

я слаб на стороне FoxPro, но ...

Вы можете создать временную таблицу, которая соответствует ожиданиям SSIS. Создайте задачу, которая будет использовать инструкции FoxPro для копирования данных из таблицы проблем во временную таблицу. Измените поток данных для работы с временной таблицей.

В качестве задач SSIS вы можете создать предварительные шаги (создать временную таблицу и перевести на временную таблицу), чтобы управление потоком управлялось вашим пакетом SSIS.