为什么 SQL Server 代理作业尝试创建过程

Ren*_*ger 0 sql-server sql-server-agent

我正在使用 SQL 代理来安排过程的执行。

第一次执行该过程时,它运行没有问题。第二次执行作业(步骤)时,它不会完成。

以下 SQL 语句的变体告诉我正在运行的语句是create procedure xyz...(其中xyz是作业应该运行的过程的名称)。

select
   prc.loginame,
   prc.program_name,
   sql.text                                           sql_text
from
   sys.sysprocesses     prc                 cross apply
   sys.dm_exec_sql_text(prc.sql_handle) sql
Run Code Online (Sandbox Code Playgroud)

我在程序(或其他方式)中没有执行任何 DDL,并且想知道是什么导致作业尝试创建程序以及作业为何挂起?

Ran*_*gen 5

看到弹出的 procedure create 语句是这里的预期行为,它与作业代理本身无关。并且作业步骤不是重新创建过程,它只是运行它。

例子

如果我创建这个过程:

CREATE PROC dbo.Waitfordelay
as
WAITFOR DELAY '00:00:10';
SELECT 5;
Run Code Online (Sandbox Code Playgroud)

然后在查询窗口中运行它:

EXEC dbo.Waitfordelay;
Run Code Online (Sandbox Code Playgroud)

然后运行您的查询:

loginame       program_name                                    sql_text
Domain\User    Microsoft SQL Server Management Studio - Query  CREATE PROC dbo.Waitfordelay  as  WAITFOR DELAY '00:00:10';  SELECT 5  
Run Code Online (Sandbox Code Playgroud)

创建过程也会显示。

如果您想了解有关过程调用的更多信息,您可以使用类似dbcc inputbuffer

dbcc inputbuffer(spid)
Run Code Online (Sandbox Code Playgroud)

对我来说这返回:

EventType   Parameters  EventInfo
Language Event  0   EXEC dbo.Waitfordelay  
Run Code Online (Sandbox Code Playgroud)

或者运行sp_whoisactive并将参数@get_outer_command设置为 1。

exec [dbo].[sp_WhoIsActive]
        @get_outer_command = 1;
enter code here
Run Code Online (Sandbox Code Playgroud)

结果示例:

dd hh:mm:ss.mss session_id  sql_text                                 sql_command
00 00:00:00.733 54          <?query --WAITFOR DELAY '00:00:10'; --?> <?query --EXEC dbo.Waitfordelay --?>
Run Code Online (Sandbox Code Playgroud)

运行 sp_whoisactive 还可能为您提供有关程序卡在哪个部分的更多信息。

我在程序(或其他方式)中没有执行任何 DDL,并且想知道是什么导致作业尝试创建程序以及作业为何挂起?

创建过程部分已清除,工作挂起的实际问题将是猜测,没有可重现的示例或更多信息。

该作业正在运行查询吗?参数嗅探会成为这里的问题吗?

运行作业时有哪些等待类型?CPU 时间/读取量是多少?

当作业步骤卡住时运行以下查询(您的已调整)可能会提供更多信息:

SELECT
req.total_elapsed_time,
req.cpu_time,
req.reads,
req.last_wait_type
,req.wait_type,
req.wait_time,
sql.text  sql_text
FROM
sys.dm_exec_requests     req                 
cross apply sys.dm_exec_sql_text(req.sql_handle) sql;
Run Code Online (Sandbox Code Playgroud)

我们需要更多细节才能知道实际问题是什么。