有没有办法在商店程序中检查它是由Job引用还是使用其他方法,例如SSIS,特殊查询等?
有类似问题SQL Server Find What Jobs Are Running a Procedure 但它只是检查工作步骤,但这不是我需要的。
这是我的情景。
我有SP spDoSomethingImportant,这可以由Job或数据库中的用户运行。
因此,在该SP中,我希望检查是否是作业触发并获得该作业的名称或ID。
答案 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))