我昨天定义了一个 SQL 作业,用于在早上的特定时间执行存储过程。这是一个临时且紧急的要求,因此我即时开发了这个程序,并安排它每天早上运行。
我应该只是在作业步骤中调用该过程并在高级选项卡中定义输出文件。我必须在作业步骤中使用以下命令:
use db_name
go
exec sp_name
go
而不是上面,我错误地写了如下:
begin tran
go
exec sp_name
go
这个 sql 作业没有失败,但是它没有完成它的预期工作。
输出文件包含以下内容:
作业“Job_Name”:第 1 步,“Step_name”:开始执行 2020-02-03 06:10:00
这似乎是正确的,但我想知道上面可以保持一个开放的交易并可能导致另一个问题。
我执行了sp_whoisactive
(感谢 Adam Machanic 先生)并且没有看到从那时起运行的任何会话,并且在任何表上都没有阻塞,因为基础过程在将数据插入表时有 tablock 表提示。
有没有办法找到这个 sql 作业实际发生了什么,为什么它没有完成它的预期工作,以及是否有办法找到它是否仍在后台运行并且可以提交或回滚。我还运行 sp_who2 以查看是否有任何与此作业相关的 SPID,但找不到任何东西。
运行以下查询以检查所有作业的状态,它显示我的作业成功:
USE MSDB
SELECT name AS [Job Name]
,CONVERT(VARCHAR,MAX(DATEADD(S,(run_time/10000)*60*60 /* hours */
+((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
+ (run_time - (run_time/100) * 100) /* secs */
,CONVERT(DATETIME,RTRIM(run_date),113))),100) AS [Time Run]
,CASE WHEN enabled=1 THEN 'Enabled'
ELSE 'Disabled'
END [Job Status]
,CASE WHEN SJH.run_status=0 THEN 'Failed'
WHEN SJH.run_status=1 THEN 'Succeeded'
WHEN SJH.run_status=2 THEN 'Retry'
WHEN SJH.run_status=3 THEN 'Cancelled'
ELSE 'Unknown'
END [Job Outcome]
FROM sysjobhistory SJH
JOIN sysjobs SJ
ON SJH.job_id=sj.job_id
WHERE step_id=0
AND DATEADD(S,
(run_time/10000)*60*60 /* hours */
+((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
+ (run_time - (run_time/100) * 100) /* secs */,
CONVERT(DATETIME,RTRIM(run_date),113)) >= DATEADD(d,-20,GetDate())
group by name, CASE WHEN enabled=1 THEN 'Enabled'
ELSE 'Disabled'
END
,CASE WHEN SJH.run_status=0 THEN 'Failed'
WHEN SJH.run_status=1 THEN 'Succeeded'
WHEN SJH.run_status=2 THEN 'Retry'
WHEN SJH.run_status=3 THEN 'Cancelled'
ELSE 'Unknown'
END
非常感谢任何帮助或输入。
版本:Microsoft SQL Server 2014 (SP3-GDR) (KB4505218) - 12.0.6108.1 (X64) 2019 年 5 月 29 日 20:05:27 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows NT 上基于内核的许可(64 位) 6.3(内部版本 9600:)(管理程序)
当您在作业中执行此操作时,它基本上会结束会话并在作业完成时回滚事务。您可以使用
SQLTransaction
Profiler 中的事件类来跟踪它。这就是您看不到任何打开的事务/会话或正在完成的工作的原因。