如何检查 运行 存储过程是否由作业触发?

How to check if running store procedure was triggered by job?

有没有办法在存储过程中检查它是由作业触发的还是使用其他方法(即 SSIS、临时查询等)触发的?

有类似问题SQL Server Find What Jobs Are Running a Procedure 但它只是检查工作步骤,但这不是我需要的。

这是我的场景。

我有 SP spDoSomethingImportant,这可以是作业 运行 或数据库中的用户。

因此在该 SP 中我想检查它是否由作业触发并获取该作业的名称或 ID。

我创建了以下 SPROC:

CREATE PROCEDURE TESTME
AS

INSERT  INTO TEST_LOG
SELECT  *
FROM    sys.dm_exec_sessions
WHERE   session_Id = @@SPID

GO

然后我从 SSMS 运行 它。在 TEST_LOG 中,第 Program_name 列是 "Microsoft SQL Server Management Studio - Query"

然后我为 运行 这个 SPROC 创建了一个作业。在 TEST_LOG 中,第 Program_name 列是 "SQLAgent - TSQL JobStep (Job 0xCB393E8FF0E9D44485204D0100803469 : Step 1)"

因此,如果您不想传递一个参数来指示它是否 运行ning 作为一项工作,我想您可以从 sys.dm_exec_sessions.Program_name

中找出答案

根据 Robert Paulsen 的重要建议,我创建了简单的解决方案来实现这一目标。

我还使用了此位置的一些代码将字符串转换为唯一标识符。它由 Scott Pletcher 发布。有一个函数可以从字符串中获取这个 uid。 http://www.sqlservercentral.com/Forums/FindPost1480606.aspx

示例代码如下所示。需要进行更多检查,因为如果不是 SQL Agent 运行,代码将无法工作。

--Get Program Name
DECLARE @ProgramName VARCHAR(255)
DECLARE @StartOfJjobId INT
DECLARE @JobIdPrefix VARCHAR(30) = '(Job 0x'
SET @ProgramName = (SELECT Program_name FROM sys.dm_exec_sessions WHERE session_Id = @@SPID)
--If run by job it will returns something like this line below
--SQLAgent - TSQL JobStep (Job 0x5A9C063C3BDE5D41B4CBF86D4C1A82A5 Step 1)
SET @StartOfJjobId = CHARINDEX(@JobIdPrefix, @ProgramName) + LEN(@JobIdPrefix)

select name AS JobName from msdb..sysjobs where job_id = (SELECT CAST(
        SUBSTRING(@ProgramName, @StartOfJjobId + 06, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 04, 2) + 
        SUBSTRING(@ProgramName, @StartOfJjobId + 02, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 00, 2) + '-' +
        SUBSTRING(@ProgramName, @StartOfJjobId + 10, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 08, 2) + '-' +
        SUBSTRING(@ProgramName, @StartOfJjobId + 14, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 12, 2) + '-' +
        SUBSTRING(@ProgramName, @StartOfJjobId + 16, 4) + '-' +
        SUBSTRING(@ProgramName, @StartOfJjobId + 20,12) AS uniqueidentifier))