2013-12-17 3 views
0

У меня есть следующий штамп времени в текстовом файле:SSIS Derived Column: Как проверить правильность отметки времени и вставить нуль?

3/3/2008 15:21:33 

Использование SSIS Производный столбец, я пытаюсь проверить, если TimeStamp находится в правильном формате. Затем преобразовать его в этом:

2008-03-03 15:21:33.000 

Я получаю следующее сообщение об ошибке:

Data conversion failed. The data conversion for column "TIME_STAMP" 
returned status value 2 and status text "The value could not be 
converted because of a potential loss of data. 

Я хочу, чтобы вставить Null, если преобразование не удалось или если метка времени является недействительным.

Я пробовал это, но он не работает.

(LEN(TRIM(TIME_STAMP)) < 23) || (TRIM(TIME_STAMP) == "") 
|| (ISNULL(TIME_STAMP)) ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP)TIME_STAMP 

Как вставить нуль, если преобразование с ошибкой timestamp и конвертировать только в том случае, если оно находится в допустимом формате?

Update: Дополнительные сообщения об ошибке, LEN и TRIM не поддерживаются для типа данных (DT_DBTIMESTAMP)

Благодаря

+0

Только так мы ясны, штамп времени у вас есть есть только 17 символов, так что будет всегда возвращать NULL, а не преобразованное значение в первый условна. –

+0

Да, вы правы, это должно быть 17. Но код не работает независимо. – Asynchronous

+0

Я не думаю, что вам нужен тип TIME_STAMP. Вы, вероятно, ищете что-то вроде DT_DATE – billinkc

ответ

1

SSIS выражений не поддерживает проверку типа или обработку исключений, так что вы ограничены в этих отношениях. Выражение ниже примет вашу строку и поместит ее в желаемый формат, однако ваш пакет не сработает, если ваш столбец TIME_STAMP не может быть добавлен в DT_DATE. Например, если значение в текстовом файле было 3/3/2008T15:21:33, оно потерпит неудачу.

(DT_WSTR, 23) 
( 
    (LEN(TRIM(TIME_STAMP)) < 17) || (TRIM(TIME_STAMP) == "") 
    || (ISNULL(TIME_STAMP)) ? NULL(DT_DBTIMESTAMP2, 3) : (DT_DBTIMESTAMP2, 3)   
    (DT_DATE)TIME_STAMP 
) 

Вы всегда можете написать собственное преобразование компонентов скрипта в C# для выполнения этого типа проверки/преобразования. Основная часть кода может выглядеть следующим образом:

/// <summary> 
/// This method is called once for every row that passes through the component from Input0. 
/// 
/// Example of reading a value from a column in the the row: 
/// string zipCode = Row.ZipCode 
/// 
/// Example of writing a value to a column in the row: 
/// Row.ZipCode = zipCode 
/// </summary> 
/// <param name="Row">The row that is currently passing through the component</param> 
public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    if (!Row.DerivedColumn1_IsNull) 
    { 
     DateTime dt; 

     if (DateTime.TryParse(Row.DerivedColumn1, out dt)) 
     { 
      Row.DerivedColumn1 = dt.ToString("yyyy-MM-dd HH:mm:ss.fff"); 
     } 
     else 
     { 
      Row.DerivedColumn1_IsNull = true; 
     } 
    } 
} 
Смежные вопросы