[英]Check if stored procedure is running
如何检查存储过程或查询是否仍在SQL Server中运行?
主意
我曾想过要在过程开始时写一个日志,在过程结束时删除。
缺陷:
使用过程监控器
我希望可以将存储过程合并为一个存储过程,并使用procedure_name
和/或pid
作为parameters
,因此使用SQL Server界面跟踪程序或解决方案将无法使用。
用法示例:
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.