在其执行的存储过程中查找执行SQL任务组件ID

时间:2017-04-28 07:26:52

标签: sql sql-server ssis

我有一个日志存储过程,最初设计时没有与SSIS包系统变量相关的输入参数。现在我想用它来获取它的组件ID,如果通过包执行(即它执行的SQL任务组件GUID)。

由于存储过程几乎在整个项目的任何地方使用(甚至在MSBI范围之外),既不更改存储过程参数设置,也不做任何硬代码映射关系,也不将所有执行SQL任务转移到脚本任务并使用{{ 1}}听起来很容易。

但是,SSIS内置日志记录功能已在项目中很好地启用。我怎样才能做到这一点?

(参考:使存储过程Dts.Events.FireinformationRAISERROR('message', 10, 1)不会在包中触发PRINT 1事件,因此无法使用ONINFORMATION执行此操作。

1 个答案:

答案 0 :(得分:0)

以下解决方案假定执行sql任务不是异步执行的,并且在任务名称中有一个“execute sql”字符串。我还在目录中运行包时使用默认的“ISServerExec”应用程序名称,您应该在连接字符串中将应用程序名称设置为项目的特定值,然后使用它。这些是很多假设,但你设置的场景太开放了。

完成上述所有假设后,您可以在sp:

中使用此代码
DECLARE @taskId AS UNIQUEIDENTIFIER;

WITH hostProcess AS (

    SELECT host_process_id as id FROM SYS.dm_exec_sessions 
    WHERE program_name = 'ISServerExec' --set an specific application name here 
    AND session_id = @@SPID

)

SELECT TOP 1 @taskId= m.message_source_id
FROM SSISDB.catalog.executions e 
INNER JOIN hostProcess ON e.process_id = hostProcess.id
INNER JOIN SSISDB.catalog.event_messages m ON e.execution_id = m.operation_id
where m.message_source_name like '%execute sql%' --identifying exec sql tasks 
AND m.message_type =30 and  m.message_source_type=40
order by m.message_time DESC

IF @taskId is not null 
    BEGIN
    --do your stuff here
    END

您想要完成的任务我建议仅使用SSIS日志记录功能。