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

Posted

技术标签:

【中文标题】在其执行存储过程中查找Execute SQL任务组件ID【英文标题】:Find Execute SQL task component ID in its executing stored procedure 【发布时间】:2017-04-28 07:26:51 【问题描述】:

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

由于存储过程几乎在整个项目中使用(甚至在 MSBI 范围之外),因此既不更改存储过程参数设置,也不进行任何硬代码映射关系,也不将所有执行 SQL 任务转移到脚本任务并使用 @987654321 @听起来很简单。

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

(参考:使存储过程RAISERROR('message', 10, 1)PRINT 1 不会触发包中的ONINFORMATION 事件,因此不能使用dbo.sysssislog 来执行此操作。

【问题讨论】:

包多久运行一次?可以同时运行 2 个实例吗?我正在考虑基于执行时间范围的解决方案。 请看下面我的回答。 【参考方案1】:

以下解决方案假定执行 sql 任务不是异步执行的,并且您在任务名称中有一个“执行 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 日志记录功能。

【讨论】:

以上是关于在其执行存储过程中查找Execute SQL任务组件ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在plsql中执行存储过程

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

存储过程 SQL 编译错误中的执行错误:Statement.execute 中的标识符“TEST3”无效