برای تبدیل تاریخ میلادی به تاریخ شمسی در packageهای SSIS میتوان از زبان سی شارپ استفاده کرد . بدین طریق میتوان در طی عملیات ETL و هنگام transform کردن دادهها ، عملیات تبدیل از میلادی به شمسی را انجام داد . عملیات تبدیل داده در این مثال به کمک Script Component انجام میشود.
پیشتر اینجا مطلبی در مورد مدیریت رخدادها به صورت دستی نوشته بودم. در این پست قصد دارم به نحوه ثبت رخدادها به صورت خودکار در هنگام اجرای کامپننتها بپردازم. در واقع در این روش نیازی نیست که جدول جداگانهای داشته باشیم و یا پارمتری تنظیم کنیم، فقط کافیست یکسری تنظیمات اولیه انجام دهیم و همه چیز را به خود SSIS بسپاریم.
برای اینکار مراحل زیر را انجام دهید.
1- پس از آنکه پکیج مورد نظر را ایجاد کردید از نوار ابزار ابتدا SSIS و سپس Loging را انتخاب کنید.
2- مطابق شکل زیر تنظیمات مربوط به Log را انجام دهید.
از پنل سمت چپ میتوانید تمام پکیج و یا یک کامپننت خاص را انتخاب کنید. در صورتی که پکیج انتخاب شده باشد، رویدادی که در مرحله بعد انتخاب خواهید کرد از تمام کامپننتهای پکیج Log میگیرد.
در قسمت Providers and Logs نوع Provider خود را انتخاب کنید. از آنجایی که ما قصد داریم Log را در SQL و به صورت جدولی داشته باشیم از SSIS log provider for SQL Server استفاده میکنیم.
در Configuration محل ذخیره Log را انتخاب کنید.
از قسمت Details میتوانید تنظیمات مربوط به Log و نحوه آن را مشخص کنید.
3- بر روی Ok کلیک کرده و پکیج را اجرا کنید.
از دستور زیر برای مشاهده Log استفاده کنید.
SELECT * FROM dbo.sysssislog
زمانی که با یک پکیج بزرگ و پیچیده سروکار داریم بررسی روند اجرای کامپننتها و خطایابی کمی سخت میشود. در چنین شرایطی وجود یک فایل یا جدولی که Log پکیج را در هر بار اجرا ذخیره کند ضروری است. در SSIS این امکان وجود دارد که از رویدادهای مختلف Log گرفته شود. این کار از دو طریق امکان پذیر است؛ مدیریت رخدادها با تنظیمات دستی و مدیریت رخدادها توسط SSIS Loging
در این مقاله روش اول را شرح میدهم و به روش دوم در مقالهای جداگانه خواهم پرداخت.
مدیریت رخدادها به صورت دستی
اولین روشی که قصد دارم به آن بپردازم، ذخیره Log به صورت دستی است. در این روش باید از سربرگ Event Handlers استفاده کنید. در این قسمت باید از منوی باز شوندهی Executable کامپننت مورد نظر و سپس از منوی باز شوندهی Event handler رخداد مورد نظر را انتخاب کنید.
برای انجام این کار مراحل زیر را انجام دهید.
۱- ابتدا توسط کوئری زیر یک جدول Log ایجاد کنید. از این جدول برای ذخیره خروجی رویدادها استفاده میشود.
CREATE TABLE [dbo].[Log]( [ID] [int] IDENTITY(1,1) NOT NULL, [PackageID] [uniqueidentifier] NULL, [Error] [nvarchar](max) NULL, [Source] [nvarchar](100) NULL, [PackageName] [nvarchar](100) NULL ) ON [PRIMARY] GO |
۲- در Control Flow با استفاده از Execute SQL Task و کوئری زیر یک پکیج ساده ایجاد کنید
select * from shop.Test
۳- به سربرگ Event Handlers رفته و از منوی باز شوندهی Executable کامپننت Execute SQL Task و از منوی باز شوندهی Event handler رخداد onError را انتخاب کنید. برروی Click here to create an ‘onError’ event handler for executable ‘Execute SQL Task’ کلیک کنید تا فعال شود.
۴- از جعبه ابزار یک Execute SQL Task به این قسمت اضافه کنید.
۵- برروی Execute SQL Task دوبار کلیک کنید تا صفحه مربوط به تنظیمات آن باز شود. از کوئری زیر در قسمت SQL Statement استفاده کنید.
insert into Log(PackageID,Error,Source,PackageName) values (?, ?, ?, ?) |
۶- از لیست سمت چپ به قسمت Parameter Mapping رفته و مطابق با شکل زیر آن را تنظیم کنید.
توسط کلید F5 پکیج را اجرا کنید. از آنجایی که جدولی با نام Test وجود ندارد پکیج با خطا مواجه میشود و در این لحظه کامپننت Execute SQL Task که در سربرگ Event Handlers ایجاد شده است شروع به کار میکند و از طریق پارامترهایی که به آن تخصیص دادیم مشخصات مورد نظر را به جدول Log ساخته شده در ابتدای آموزش انتقال میدهد.
در پایان جدول Log به شکل زیر میباشد.
در این پست قصد دارم برای آشنایی بیشتر و بهتر با SSIS یک پکیج ساده ایجاد کنم. اگر تا به حال از SSIS استفاده نکرده اید بهتر است مراحل اولیه ایجاد یک پروژه را از اینجا مطالعه کنید.
۱- یک پروژهی جدید با نام Learn-SSIS1 ایجاد کنید.
در هر پروژهی SSIS پیش از هر چیز باید نوع ارتباط و منبع دادههای خود را مشخص کنیم. از آنجایی که در این پروژه قصد استفاده از بانک اطلاعاتی SQL را داریم، باید از اتصال دهندهی OLEDB استفاده کنیم.
۲- در قسمت Connection Managers راست کلیک کرده و NEW OLEDB را انتخاب نمایید.
۳- از صفحهی باز شده بر روی New کلیک کنید و مطابق شکل زیر تنظیمات مربوط به Server Name و Provider و بانک اطلاعاتی را انجام دهید. سپس برروی ok کلیک کنید.
همان طور که در تصویر بالا مشخص است از بانک اطلاعاتی AdventureWorksDW2008 استفاده شده. پیشتر در اینجا نحوه افزودن انبار داده AdventureWorksDW2008 را شرح دادهام. چنانچه AdventureWorksDW2008 را در SQL خود ندارید در صورت نیاز از اینجا کمک بگیرید.
۴- فایل learn-ssis1.sql را دانلود کنید.
این فایل شامل یک کوئری ساده جهت بروز رسانی یکی از رکوردهای جدول DimProductCategory است.
۵- از جعبه ابزار بر روی Execute SQL Task دوبار کلیک کنید تا به ناحیه Control Flow منتقل شود.
۶- برروی کامپننت اضافه شده دو بار کلیک کنید تا صفحهی Execute SQL Task Editor باز شود. در این صفحه تنظیمات مربوط به کامپننت انجام میشود.
۷- تنظیمات مربوط به کامپننت را به شکل زیر انجام دهید.
ConnectionType=OLE DB
Connection=localhost.AdventureWorksDW2008
SQLSourceType=File connection
FileConnection=learn-ssis1.sql
برای تنظیم FileConnection ابتدا New connection را انتخاب کنید و از صفحه باز شده Existing file را انتخاب و سپس توسط Browse به محل فایل دانلود شده رفته و آن را انتخاب کنید.
در نهایت Execute SQL Task Editor باید به شکل زیر باشد.
کار تمام است! فقط کافیست کلید F5 را بزنید.
برای دیدن نتیجه به جدول DimProductCategory در SQL مراجعه کنید.