在脚本任务中获取SSIS事件名称

时间:2014-12-09 11:48:29

标签: events ssis

我想在包级别事件(OnError,OnPreExecute,OnPostExecute)中运行标准脚本任务以进行日志记录。

理想情况下,我希望能够复制并粘贴脚本任务,但它需要知道它在其中运行的事件。目前我将其作为use变量传递,但这意味着我需要手动设置变量来存储事件的名称。这不是太艰难,但很容易被遗忘。因此,我的问题是,是否有一种高效的方法来检测脚本任务在哪个事件中运行。

我怀疑这并不容易,因为基本上这与找出父容器的名称是一样的,事实证明它几乎是不可能的。 另一种选择是能够嗅探标准事件变量的范围,例如'EventHandlerStartTime',但我找不到从脚本任务中确定变量范围的方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于@Mark提到了Biml,我想我花了一些时间来爆发使用一些非常基本的概念来实现这一点的概念。

假设我有一个可怜的记录表,如

CREATE TABLE 
    dbo.DoWhat
(
    PackageName nvarchar(150) NULL
,   ParentContainerGUID varchar(38) NULL
,   SourceDescription nvarchar(1000) NULL
,   SourceName nvarchar(150) NULL
,   SourceParentGUID varchar(38) NULL
,   EventName varchar(20) NULL
);

然后我可以定义一个"功能"在名为inc_events.biml

的文件中

这就是说,这个文件需要一个类型为string的参数来填充eventName变量。然后,我使用经典的ASP样式语法在该值<#=eventName#>

中进行子搜索

所以,这个biml会创建一个Event。该事件有一个名为WhereAmI的变量,其范围为Event。然后我在那里有一个执行SQL任务,它插入到日志表中,传递系统变量和我的本地变量名。

您正在寻找使用脚本任务,因此您将替换执行SQL任务,但概念是相同的。那里有一个的东西,它将使用我们的本地变量,该变量具有分配给它的事件名称。

<#@ property name="eventName" type="String" #>
                <Event EventType="<#=eventName#>" ConstraintMode="Linear" Name="<#=eventName#>">
                    <Variables>
                        <Variable DataType="String" Name="WhereAmI"><#=eventName#></Variable>
                    </Variables>
                    <Tasks>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Log notes">
                            <VariableInput VariableName="User.QueryLog"></VariableInput>
                            <Parameters>
                                <Parameter DataType="String" VariableName="System.PackageName" Name="0" />
                                <Parameter DataType="AnsiString" VariableName="System.ParentContainerGUID" Name="1" DataTypeCodeOverride="129" />
                                <Parameter DataType="String" VariableName="System.SourceDescription" Name="2" />
                                <Parameter DataType="String" VariableName="System.SourceName" Name="3" />
                                <Parameter DataType="AnsiString" VariableName="System.SourceParentGUID" Name="4" DataTypeCodeOverride="129" />
                                <Parameter DataType="AnsiString" VariableName="User.WhereAmI" Name="5" DataTypeCodeOverride="129" />
                            </Parameters>
                        </ExecuteSQL>
                    </Tasks>
                </Event>

使用包含文件

我在我的项目中添加了第二个Biml文件so_27378254_inc.biml。这个将演示我们如何使用函数/包含文件。

我在Connections集合中定义了一个名为tempdb

的OLE DB数据库连接

在我的Packages集合中,我定义了一个名为so_27378254_inc的新包。它有一个Variable,QueryLog,它只包含插入到我的日志表中的语句的格式。

在包的事件集合中,然后我调用CallBimlScript 3次,每个事件处理程序一个,我想在包级别范围添加。

在Tasks集合中,我添加了一个Sequence Container,这样我就可以在日志中获得一些变化。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="tempdb" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;" />
    </Connections>
    <Packages>
        <Package ConstraintMode="Linear" Name="so_27378254_inc">
            <Variables>
                <Variable DataType="String" Name="QueryLog">
                    <![CDATA[INSERT INTO  
    dbo.DoWhat
(
    PackageName
,   ParentContainerGUID
,   SourceDescription
,   SourceName
,   SourceParentGUID
,   EventName
)
SELECT
    ? /* AS PackageName */
,   ? /* AS ParentContainerGUID */
,   ? /* AS SourceDescription */
,   ? /* AS SourceName */
,   ? /* AS SourceParentGUID */
,   ? /* AS EventName */
;]]>
                </Variable>
            </Variables>
            <Events>
<#=CallBimlScript("inc_events.biml", "OnError")#>
<#=CallBimlScript("inc_events.biml", "OnPreExecute")#>
<#=CallBimlScript("inc_events.biml", "OnPostExecute")#>
</Events>
            <Tasks>
                <Container Name="SEQC Container on Control Flow" ConstraintMode="Linear">

                </Container>
            </Tasks>
        </Package>
    </Packages>
</Biml>

那么,你用它做什么?您右键单击so_27378254_inc.biml文件,然后生成一个新包。

我怎么卖这个?

你在评论中提到,并且理所当然地关注任何会增加采用摩擦力的事情。

我的反击是

  1. BIDS Helper是免费的,如果您不使用它,那么您在交付时的效果就不如您所能。特别是在2012年之前,产品的边缘太多了。
  2. 使用这样的方法可以让每个人都达到一致的起点,没有模板包带来的麻烦(ID直到2012年才会自动更新)
  3. 你不必全力投入Biml方法。假设您是架构师/首席开发人员,请使用它来定义最佳实践。每个人都开启了日志记录,应用配置,定义了标准连接等等。所有人都要做的不是创建新的SSIS,而是右键单击并生成模板包,然后将其重命名为适当的内容并且他们需要在比赛中担心数据流和文件获取等等。