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

时间:2014-09-15 10:47:15

标签: sql sql-server stored-procedures

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

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

    缺陷:

    • 当服务器重新启动或程序内部出现某种故障时,它会打开案例。
    • 此方法在运行程序之前需要完成一些工作,因此无法应用于已经运行的程序。
  2. 使用流程监控

  3. 我更喜欢可以作为存储过程合并的解决方案,其中procedure_name和/或pidparameters作为输入,因此使用SQL Server接口跟踪程序或解决方案赢得了& #39; t work。


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

5 个答案:

答案 0 :(得分:10)

您可以查询sys.dm_exec_requests,它将提供会话ID,等待时间以及更多感兴趣的行,并使用SQL过滤您的查询CR 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%'

答案 1 :(得分:4)

更新:John Clayton给出的答案引用了SCROLLINFO(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代码返回正在运行的进程的名称列表。请注意,您将outdated SQL Server 2000 system table

答案 2 :(得分:1)

使用此:

exec sp_who2 

它返回所有数据库活动。

如果您的程序当前正在运行,您将检查此程序。

也会尝试:

 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;

答案 3 :(得分:1)

我一直在试图弄清楚如何获取运行程序的列表并遇到了这个帖子。在对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

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

答案 4 :(得分:1)

旧线程,但你可以这样做,

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