Как предотвратить ошибки CAST на SSIS? - PullRequest
4 голосов
/ 11 марта 2010

Вопрос

Можно ли попросить SSIS привести значение и вернуть NULL , если приведение не разрешено вместо выдачи ошибки ?

Мое окружение

Я использую Visual Studio 2005 и Sql Server 2005 на Windows Server 2003.

Общий контекст

На всякий случай, если вам интересно, вот мой вариант использования. Я должен хранить данные, поступающие откуда-то в общей таблице (структура ключ / значение с историей), которая содержит какое-то значение, которое может быть строкой, числом или датой. Структура примерно такая:

table Values {
    Id int,
    Date datetime, -- for history
    Key nvarchar(50) not null,
    Value nvarchar(50),
    DateValue datetime,
    NumberValue numeric(19,9)
}  

Я хочу поместить необработанное значение в столбец Значение и попытаться ввести то же значение

  • в столбце DateValue, когда я могу привести его к Datetime
  • в столбце NumberValue, когда я могу привести его к числу

Эти два типизированных столбца значительно упростят и ускорят все виды агрегации и манипуляции.

Вот и все, теперь вы знаете, почему я задаю этот странный вопрос.

============

Заранее спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 12 марта 2010

Вы также можете попробовать компонент «Производный столбец» и проверить значение потенциального поля даты / числа или просто привести его и перенаправить любые ошибки как значения NULL для этих двух полей.

(1) Если вы просто каждый раз просто приводите поле с помощью следующего выражения в компоненте «Производный столбец»: (DT_DATE) [MYPOTENTIALDATE] - вы можете перенаправить строки, которые не выполняются, и манипулировать данными оттуда.

OR

(2) Вы можете сделать что-то подобное в компоненте Производный столбец: ISNULL ([MYPOTENTIALDATE])? '2099-01-01': (DT_DATE) [MYPOTENTIALDATE]. Обычно я отправляю через '2099-01-01', когда дата имеет значение NULL, а не связывается с NULL (лучше работает с кубами и т. Д.).

Конечно, (2) не будет работать, если поле [MYPOTENTIALDATE] будет отображаться как другие вещи, отличные от DATETIME или NULL, то есть иногда это слово типа "привет".

Это варианты, которые я хотел бы изучить, удачи!

1 голос
/ 15 марта 2010

Имея дело с такими же вещами, я обнаружил, что обработка ошибок в SSIS не была достаточно конкретной.Мой подход состоял в том, чтобы на самом деле создать таблицу ошибок и запросить исходную таблицу, в которой данные хранятся как varchar, и зарегистрировать ошибки в таблице ошибок с помощью чего-то подобного ниже.У меня есть одно из следующих утверждений для каждого столбца, потому что для меня было важно знать, какой столбец не удался.Затем после того, как я регистрирую все ошибки, я делаю INSERT, где я выбираю те записи в SomeInfo, у которых нет ошибок.В вашем случае вы можете сделать более сложные вещи на основе ColumnName в таблице ошибок, чтобы вставить значения по умолчанию.

INSERT INTO SomeInfoErrors
           ([SomeInfoId]
           ,[ColumnName]
           ,[Message]
           ,FailedValue)    
    SELECT
        SomeInfoId,
        'PeriodStartDate',
        'PeriodStartDate must be in the format MM/DD/YYYY',
                PeriodStartDate
    FROM
        SomeInfo
    WHERE 
        ISDATE(PeriodStartDate) = 0 AND [PeriodStartDate] IS NOT  NULL;
0 голосов
/ 11 марта 2010

Tru, использующий условное разбиение, и записи, в которых данные являются датой, идут по одному пути, а другие - по другому пути, где они обновляются до нуля, прежде чем вставляются.

...