Регулярные выражения в пакетах SSIS

Самый простой и, пожалуй, правильный способ проверить корректность данных, обрабатываемых пакетом SSIS – использовать регулярные выражения.

Реальный пример – проверка номеров ГТД
Идентификатор государственной таможенной декларации состоит из трех частей, разделенных слэшами. Первые 8 символов содержат уникальный идентификатор таможенного органа, оформившего ГТД, вторая часть включает в себя дату оформления ГТД вида ‘ddMMyy’, третья – уникальный семизначный номер. Итого 23 символа. Более того, в номере ГТД могут содержаться только цифры от 0 до 9 и слэши.
Соответственно задача состоит в том, чтобы с помощью регулярных выражений проверить корректность номера ГТД, и отправить все номера, не прошедшие проверку, в отдельный поток данных.

Конечно же в SSIS нет готового компонента, позволяющего решить эту задачу, зато есть Script Task.

Прежде чем начать кодить, необходимо настроить Scrip Task таким образом, чтоб у него было два выхода, на которые пойдут корректные и неправильные номера ГТД, соответственно.

Для обоих выходов должна быть указана идентичная ExclusionGroup, а в качестве SyncronousInputID должен быть выбран идентификатор входа, по которому придут данные для проверки, в данном случае ‘Input 0’.

В качестве языка я выбрал C# и в результате получился примерно такой код…

using System;
using System.Data;
using System.Text.RegularExpressions; // Add this to use RegExps in code
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void PreExecute()
{
base.PreExecute();
}

public override void PostExecute()
{
base.PostExecute();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (IsCorrectCDN(Row.CDN))
{
Row.DirectRowToProperCDN(); // Redirect all correct CDNs to ProperCDN output
}
else
{
Row.DirectRowToWrongCDN(); // All incorrect CDNs go to WrongCDN output
}
}
public bool IsCorrectCDN(string CDN)
{
// Check incoming CDN against RegExp and return boolean result.
string CDNPattern = @"[0-9]{8}/[0-9]{6}/[0-9]{7}";
Regex CDNRegex = new Regex(CDNPattern);
return CDNRegex.IsMatch(CDN);
}
}

Теперь на выходе Script Task будет два потока данных.

Ссылки:
RegExLib.com Regular Expression Cheat Sheet (.NET): http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1

Запись опубликована в рубрике Business Intelligence с метками , . Добавьте в закладки постоянную ссылку.

2 Responses to Регулярные выражения в пакетах SSIS

  1. we want science пишет:

    If you desire to improve your knowledge only keep visiting this web page and be updated with the
    hottest information posted here.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *