Самый простой и, пожалуй, правильный способ проверить корректность данных, обрабатываемых пакетом 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
Best customer services.
If you desire to improve your knowledge only keep visiting this web page and be updated with the
hottest information posted here.