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

时间:2016-02-05 13:48:38

标签: sql-server stored-procedures ssis sql-agent-job

有没有办法在商店程序中检查它是由Job引用还是使用其他方法,例如SSIS,特殊查询等?

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

这是我的情景。

我有SP spDoSomethingImportant,这可以由Job或数据库中的用户运行。

因此,在该SP中,我希望检查是否是作业触发并获得该作业的名称或ID。

2 个答案:

答案 0 :(得分:2)

我创建了以下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(作业0xCB393E8FF0E9D44485204D0100803469:步骤1)”

因此,如果你不想传递一个参数来表明它是否作为一份工作运行,我认为你可以从sys.dm_exec_sessions.Program_name中找出它

答案 1 :(得分:0)

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

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

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

--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))