如何检查存储过程或查询是否仍在SQL Server中运行?
观
我想过在程序启动时有一个日志写入的位置,并在结束时删除。
缺陷:
使用流程监控
我更喜欢可以作为存储过程合并的解决方案,其中procedure_name
和/或pid
,parameters
作为输入,因此使用SQL Server接口跟踪程序或解决方案赢得了& #39; t work。
用法示例:
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
答案 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