Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 在脚本任务中获取SSIS事件名称_Events_Ssis - Fatal编程技术网

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

Events 在脚本任务中获取SSIS事件名称,events,ssis,Events,Ssis,我想在包级别的事件(OneError、OnPreExecute、OnPostExecute)中运行一个标准脚本任务来记录日志 理想情况下,我希望能够复制并粘贴脚本任务,但它需要知道它在其中运行的事件。目前,我将其作为use变量传入,但这意味着我需要手动设置该变量以存储事件的名称。这不太难,但很容易忘记。因此,我的问题是,是否有一种性能良好的方法来检测脚本任务在哪个事件中运行 我的怀疑是,这并不容易,因为从本质上讲,这与查找父容器的名称是一样的,这几乎是不可能的。 另一个选项是能够嗅探标准事件变量

我想在包级别的事件(OneError、OnPreExecute、OnPostExecute)中运行一个标准脚本任务来记录日志

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

我的怀疑是,这并不容易,因为从本质上讲,这与查找父容器的名称是一样的,这几乎是不可能的。 另一个选项是能够嗅探标准事件变量的范围,例如“EventHandlerStartTime”,但我找不到从脚本任务中确定变量范围的方法


非常感谢您的帮助。

既然@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的文件中定义一个“函数”

也就是说,该文件需要一个字符串类型的参数,该参数将填充
eventName
变量。然后,我使用一个经典的ASP风格语法在该值中进行子绑定

因此,此biml将创建一个事件。该事件有一个名为wheremi的变量,其作用域为该事件。然后我有一个executesql任务,它向日志记录表中插入系统变量和我的局部变量名

您希望使用脚本任务,因此可以替换执行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>
那么,你用它做什么?右键单击so_27378254_inc.biml文件,嗖一声,生成一个新包

我该怎么卖这个? 你在评论中提到,对任何会“给收养增加摩擦”的事情的担忧是理所当然的

我的反对意见是

  • 是免费的,如果你不使用它,你就不能像你所能做到的那样有效地交付。特别是在2012年之前,产品中的锐边太多了
  • 使用这样的方法将使每个人都有一个一致的起点,而不会遇到模板包带来的一些麻烦(ID在2012年之前不会自动更新)
  • 你不必全神贯注于Biml方法。假设您是架构师/首席开发人员,使用它来定义最佳实践。每个人都打开了日志记录、应用配置、定义了标准连接等等。所有人所要做的不是创建新的SSI,而是右键单击并生成模板包,然后将其重命名为适当的名称,他们不再担心数据流和文件获取等问题

  • 有趣的问题,我想我知道答案,但我没有看到我预期的变量。在事件处理程序上的系统变量中,有一个ParentContainerGUID,您可以记录它,然后返回并校正它是否属于OnError/OnPrePostExecute事件,但我没有看到在运行时这样做的干净方法,除了在创建事件处理程序时使用一些编程fu感谢响应。我在其他地方看到了一个解决方案,通过连接到everythings PreExecute并添加到字典中来创建任务/容器GUID字典。这是可行的,但我正在尝试创建一套简单的工具,让我的团队可以轻松地使用和“编程fu”,并在这里和那里添加一些绒毛,开始增加采用的摩擦。愚蠢的SSI。它们通常非常接近。如果解析xml,您似乎可以从GUID中查找容器名称-但是,要知道文件从开发人员到部署的位置,这将是一件困难的事情。您还可以使用命名变量创建一个包模板——这将确保团队在开发每个包时有相同的起点@从BIML的角度来看,billinkc可能也有一些建议。今天早上让我印象深刻的是,您知道SSIS中有一个本机日志功能。您可以针对平面文件、SQL Server和其他一些我从未使用过的东西,当它在那里登录时,它会指定这是OnPre/Post执行,等等。您甚至不必事先设置日志记录。2012年,通过项目部署模型,它被烘焙到执行中。您可以使用非project或2005/2008。
    <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>