ЗАМЕНИТЕ NULL В SSIS Производная колонка

У меня есть пакет служб SSIS, который передает данные из SAS в SQL Server. Я создаю производный столбец, но не могу получить REPLACENULL особенность для работы. Я получаю ошибку

"Неверное значение символа для спецификации приведения"

Я уверен, что это из-за значений NULL в источнике. Вот мое текущее производное выражение столбца:

REPLACENULL(DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01"),0)

REPLACENULL функция здесь не работает Есть ли способ сделать это? Я использую SSIS 2008. Спасибо.

3 ответа

Вы должны использовать одно из следующих выражений:

DATEADD("d",(DT_I8)REPLACENULL([AuthEndDate],0),(DT_DATE)"1960-01-01")

ИЛИ ЖЕ

ISNULL([AuthEndDate]) ? (DT_DATE)"1960-01-01" : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

Обратите внимание, что вы не можете использовать логику, которая может возвращать несколько типов данных, оба случая должны возвращаться к типу данных ( DT_DATE )

Так как вы хотите, чтобы пустая /0 текла вниз по течению, вам нужна ifне replacenull()

Обратите внимание, что пустое значение /0 в SQL Server записывается как 1900-01-01, пустое значение /0 не являются допустимыми значениями даты, поэтому по умолчанию используется это значение. Единственный другой вариант - NULL.

Это должно работать, если местом назначения является столбец datetime:

ISNULL(AuthEndDate) ? (DT_DATE)0 : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

Если вы решите написать NULL вместо 1900-01-01, вы можете сделать это:

ISNULL(AuthEndDate) ? NULL(DT_DATE) : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

Если источник возвращает значения NULL, попробуйте REPLACENULL в AuthEndDate, а не после вычислений. Ваше утверждение попытается выполнить вычисления с NULL, что никогда не является хорошим.

Так...

REPLACENULL(DATEADD("d",REPLACENULL((DT_I8)AuthEndDate,0),(DT_DATE)"1960-01-01"),0)

Изменить - заменить и затем применить преобразование:

DATEADD("d",(DT_I8)REPLACENULL(AuthEndDate,0),(DT_DATE)"1960-01-01")

Вам больше не понадобится первый REPLACENULL, так как теперь мы обрабатываем его перед вычислениями.

Следовательно:

DATEADD("d",REPLACENULL((DT_I8)AuthEndDate,0),(DT_DATE)"1960-01-01")

Изменить: Вы можете изменить 0 на то, что вы хотите, чтобы NULL стал, 0 был заполнителем.

Другие вопросы по тегам