【TechTarget中国原创】在本文中,我选择 OnInformation 事件为例。也就是说,我给序列容器执行体创建了一个OnInformation 事件处理程序。这样一来,每当容器内任何任务或容器本身产生 OnInformation 事件时, OnInformation 事件处理程序就会执行其已定义的任何行为。
第4步∶开发工作流
选择可执行体和事件只是你进行创建事件处理程序的第一步。事件处理程序要有实际意义,必须执行一些实际行为。
定义工作流行为的方法跟定义控制流的方法一样。如果你回到图3,你可以看到事件处理程序设计界面有一个链接。一旦你选择了执行体的和事件,你应该点击该链接激活设计界面,然后创建初始事件处理程序。这个活动是专门针对你正创建的事件处理程序的执行体或者事件对的。假如你选择一个不同的执行体或者事件对,设计界面会再一次出现图形3那样的界面。
在你激活设计界面之后,就要添加控制流元素到该界面,如图6所示。在这种情况下,我增加了一个执行SQL的任务。这样一来,每当序列容器或它的任务之一产生 OnInformation 事件时,执行SQL的任务便会运行。你可以同样容易地增加其他的任务,比如发出邮件任务或消息队列任务。就像控制流一样,你可以使用优先限制来连接工作流任务并把任务封入容器,而且你可以在你的容器和任务中使用系统变量和用户定义变量。

图6∶给设计界面添加控制流元素。
第5步∶使用变量
图6中的变量窗口显示了使用变量的方法,这些变量的作用域对已选择的执行体是可用的。在这里,我用了几个系统变量把 OnInformation 事件日志记录到 SQL Server 中的 SSIS_events 表。我使用下面的Transact-SQL来创建这个表。
CREATE TABLE dbo.SSIS_events ( EIGUID UNIQUEIDENTIFIER NOT NULL, PackageName NVARCHAR(50) NOT NULL, SourceName NVARCHAR(50) NOT NULL, EventInfo NVARCHAR(200) NOT NULL, TimeLogged DATETIME NOT NULL DEFAULT(getdate()) ) |

图7∶执行SQL任务编辑器的参数映射页
在执行SQL任务中使用变量时,你必须给任务里SQL语句中的参数占位符映射变量。在本例中,我映射了四个系统变量给参数。图7显示了执行SQL任务编辑器的参数映射页。每一个映射都被定义为输入,参数名只是整数,很简单,从零开始。
定义好参数映射之后,你就可以定义SQL语句。我在执行SQL任务中使用了下面的语句:
INSERT INTO dbo.SSIS_events (EIGUID, PackageName, SourceName, EventInfo) VALUES (?,?,?,?) |
注意问号当做参数占位符的用法。问号的顺序与参数映射页定义的参数名相对应。例如:第二个变量是 PackageName 。该变量的参数名是1,实际上是第二个参数。这就表示第二个问号与这个变量对应,这样包名称会作为第二个值插入表中。如果你运行这个包, SSIS 将在下面的表中记录 OnInformation 事件的日志∶
| EIGUID | PackageName | SourceName | EventInfo | TimeLogged |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Validation phase is beginning. | 2007-12-26 16:53:37.700 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Prepare for Execute phase is beginning. | 2007-12-26 16:53:38.030 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Pre-Execute phase is beginning. | 2007-12-26 16:53:40.907 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Execute phase is beginning. | 2007-12-26 16:53:42.623 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | The final commit for the data insertion has started. | 2007-12-26 16:53:43.047 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | The final commit for the data insertion has ended. | 2007-12-26 16:53:43.110 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Post Execute phase is beginning. | 2007-12-26 16:53:43.200 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | Cleanup phase is beginning. | 2007-12-26 16:53:43.297 |
| 7359F704-8267-4E6B-8785-1FA2ACB0A1E4 | Package | Data Flow Task | "component "OLE DB Destination" (90)" wrote 290 rows. | 2007-12-26 16:53:43.373 |
数据流任务会产生OnInformation事件。序列容器本身在容器内不执行SQL任务。当然,这只是一个例子——你可以记录任何想记录的信息,你也可以执行其他任何类型的行为。另外,你可以给其他可执行体创建事件处理程序。例如,你可能想让包执行失败时发送一份电子邮件,或者你可能只想对数据流任务记录错误事件,而不管其他任务。或你可以给数据流任务创建多个事件处理程序,而不管其他执行体。
这里要指出的是: SQL Server集成服务(SSIS)中的事件处理程序标签页非常的灵活,它支持根据你想监视的事件和你想执行的动作执行各种行为。事件处理程序标签页与控制流标签页,或者数据流标签页一样灵活,一样具有可扩展性——你只是需要知道怎样使用它。