检查存储过程是否正在运行

Ste*_*gin 12 sql sql-server stored-procedures

如何检查存储过程或查询是否仍在SQL Server中运行?

思路

  1. 我想过在程序启动时有一个日志写入的位置,并在结束时删除.

    缺陷:

    • 当服务器重新启动或程序内部出现某种故障时,它会打开机箱.
    • 在运行该过程之前,此方法需要完成一些工作,因此无法在已运行的过程中应用它.
  2. 使用进程监视器

我希望能有一个可以合并为一个存储过程的解决方案procedure_name和/或pid,parameters作为输入,所以跟踪程序或使用SQL Server的界面将无法正常工作的解决方案.


更新#1


用法示例:

CREATE PROCEDURE dbo.sp_sleeping_beauty 
    @time_str varchar(50)
AS 
   SET NOCOUNT ON;
   WAITFOR DELAY @time_str;
GO

dbo.sp_sleeping_beauty '00:00:10'
dbo.sp_sleeping_beauty '00:00:20'
dbo.sp_sleeping_beauty '00:00:30'
Run Code Online (Sandbox Code Playgroud)

该程序应该被称为

test_if_running 'dbo.sp_sleeping_beauty '00:00:20''
Run Code Online (Sandbox Code Playgroud)

在运行(20秒)时返回true,在函数失败或系统重启后返回false

bum*_*mmi 11

您可以查询 sys.dm_exec_requests哪些将提供sesion_ID,waittime和更多感兴趣的行,并且CROSS APPLY sys.dm_exec_sql_text使用SQL过滤您的查询.

Select * from
(
SELECT * FROM sys.dm_exec_requests 
where sql_handle is not null
) a 
CROSS APPLY  sys.dm_exec_sql_text(a.sql_handle) t 
where t.text like 'CREATE PROCEDURE dbo.sp_sleeping_beauty%'
Run Code Online (Sandbox Code Playgroud)


mat*_*tar 6

更新: John Clayton给出的答案引用了过时的SQL Server 2000系统表(sys.sysprocesses)。更新的SQL是:

SELECT
  object_name(st.objectid) as ProcName
FROM
  sys.dm_exec_connections as qs 
CROSS APPLY sys.dm_exec_sql_text(qs.most_recent_sql_handle) st 
WHERE
  object_name(st.objectid) is not null
Run Code Online (Sandbox Code Playgroud)

上面的SQL代码返回您正在运行的进程的名称列表。请注意,您需要获得查看服务器/数据库状态的权限