TryParse SSIS Ignore Source Row - PullRequest
       28

TryParse SSIS Ignore Source Row

3 голосов
/ 15 марта 2019

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

For example, 011756420176654 
*Note* array index may be off
Substring(1,2) = 01
Substring(3,2) = 17

Я пытаюсь игнорировать строку, не заменяя исходную строку. У меня есть производный столбец, и я делаю это в столбце.

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + (dt_str,10,1252)datepart("year",getdate()))

Мое намерение здесь состоит в том, чтобы настроить вывод ошибок при игнорировании поля [My Code], если логика TryParse в производном столбце завершается ошибкой. Я знаю, если бы я передавал производный столбец, то выбор игнорирования в конфигурации пропустил бы ноль, но проблема в том, что я пытаюсь (при ошибке) игнорировать исходную строку и передать ее как ноль (то есть [Мой код]).

Как только этот попадет в базу данных, другой процесс использует его и пытается проанализировать даты. Он не потерпит неудачу при нулевых значениях, поэтому я хочу проверить, что, по сути, является «датой» -логической, прежде чем пропустить запись или установить ее на ноль.

Редактировать: По решению Кейта я пришел к этому. У меня были проблемы с доступом к выходному буферу, но после некоторого MSDN по синтаксису я пришел к следующему, который работает отлично.

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        DateTime dateValue;
        string test = Row.ReceiptCode.Substring(0, 2) + "/" + Row.ReceiptCode.Substring(2, 2) + "/" + DateTime.Now.Year.ToString();

        if (DateTime.TryParse(test, out dateValue) && Row.ReceiptCode.Length ==16)
    {

        Output0Buffer.AddRow();

        Output0Buffer.EndDate = Row.EndDate;
        Output0Buffer.Q10 = Row.Q10;
        Output0Buffer.Q8 = Row.Q8;

        Output0Buffer.ValidatedReceipt = Row.ReceiptCode;
    }
    else 
    {
        Output1Buffer.AddRow();

        Output1Buffer.EndDate = Row.EndDate;
        Output1Buffer.Q10 = Row.Q10;
        Output1Buffer.Q8 = Row.Q8;
        Output1Buffer.Error = Row.ReceiptCode;
    }
}

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Лучше (с точки зрения производительности) избегать использования компонента Script при использовании простого выражения

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

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + "-" +  (dt_str,50,1252)datepart("year",getdate()))

Также предпочтительно использовать универсальное форматирование даты YYYY-MM-DD при обработке значений даты:

(dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))

Убедитесь, что вы сконфигурировали вывод ошибки для игнорирования сбоя:

enter image description here


Обновление 1

Если вам нужно вернуть исходное строковое значение, используйте следующее выражение:

((dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)) == (dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))) 
? [My Code] 
: NULL(dt_str,50,1252)
3 голосов
/ 15 марта 2019

Я бы использовал скрипт преобразования:

Добавьте выходной столбец (convDate) и отметьте [My Code] следующим образом:

Вот ваш код:

string test = Row.[My Code].Substring(1,2) + "/" + Row.[My Code].Substring(3,2)+"/" + DateTime.Now.Year.ToString();

if (DateTime.TryParse(test, out dateValue))
{Row.convDate = dateValue;  }
...