如何检查 运行 存储过程是否由作业触发?
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))
有没有办法在存储过程中检查它是由作业触发的还是使用其他方法(即 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))