ЗАМЕНИТЕ 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 был заполнителем.