繁体   English   中英

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

[英]Check if stored procedure is running

如何检查存储过程或查询是否仍在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'

该过程应该像

test_if_running 'dbo.sp_sleeping_beauty '00:00:20''

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

您可以查询sys.dm_exec_requests ,该查询将提供sesion_ID,等待时间和其他感兴趣的行,并使用SQL交叉应用sys.dm_exec_sql_text为您的过程过滤查询。

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%'

更新: 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

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

用这个 :

exec sp_who2 

它返回所有数据库活动。

您将从此proc中检查您的过程当前是否正在运行。

也将尝试:

 SELECT  creation_time , object_name(st.objectid) as ProcName
        ,last_execution_time
        ,total_physical_reads
        ,total_logical_reads 
        ,total_logical_writes
        , execution_count
        , total_worker_time
        , total_elapsed_time
        , total_elapsed_time / execution_count avg_elapsed_time
        ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
         ((CASE statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
          ELSE qs.statement_end_offset END
            - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY total_elapsed_time / execution_count DESC;

我一直在尝试找出如何获取正在运行的程序的列表,并遇到了这个线程。 在对MSDN进行了一些研究之后,我能够找出以下查询,该查询将提供正在运行的进程的列表:

select 
  object_name(st.objectid) as ProcName 
from 
  sys.sysprocesses as qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st 
where 
  object_name(st.objectid) is not null

获取参数需要做更多的工作。

旧线程,但是你可以做到

SELECT @object = object_id
FROM SYS.OBJECTS
WHERE NAME = [SP NAME]

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 objectid = @object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM