我想在包级别事件(OnError,OnPreExecute,OnPostExecute)中运行标准脚本任务以进行日志记录。
理想情况下,我希望能够复制并粘贴脚本任务,但它需要知道它在其中运行的事件。目前我将其作为use变量传递,但这意味着我需要手动设置变量来存储事件的名称。这不是太艰难,但很容易被遗忘。因此,我的问题是,是否有一种高效的方法来检测脚本任务在哪个事件中运行。
我怀疑这并不容易,因为基本上这与找出父容器的名称是一样的,事实证明它几乎是不可能的。 另一种选择是能够嗅探标准事件变量的范围,例如'EventHandlerStartTime',但我找不到从脚本任务中确定变量范围的方法。
非常感谢任何帮助。
答案 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
在我的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文件,然后生成一个新包。
你在评论中提到,并且理所当然地关注任何会增加采用摩擦力的事情。
我的反击是