Comment vérifier si une procédure stockée ou une requête est toujours en cours d'exécution dans SQL Server?
Idées
J'ai pensé à avoir un journal où écrire quand la procédure démarre et supprimer quand elle se termine.
Défauts:
Utiliser le moniteur de processus
Je préférerais une solution qui peut être incorporée en tant que procédure stockée avec procedure_name
et/ou pid
, parameters
en entrée, donc le suivi des programmes ou des solutions à l'aide de l'interface SQL Server ne fonctionnera pas.
Exemple d'utilisation:
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'
la procédure doit être appelée comme
test_if_running 'dbo.sp_sleeping_beauty '00:00:20''
et retourne vrai pendant l'exécution (pendant 20 secondes) et faux après ou si la fonction échoue ou que le système est redémarré
Vous pouvez interroger sys.dm_exec_requests
Qui fournira l'ID de session, le temps d'attente et d'autres lignes d'intérêt et CROSS APPLY sys.dm_exec_sql_text
Filtrant votre requête avec le SQL de votre procédure.
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%'
Mise à jour: La réponse donnée par John Clayton fait référence à la table système SQL Server 2000 obsolète (sys.sysprocesses). Le SQL mis à jour est:
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
Le code SQL ci-dessus renvoie une liste de noms de vos processus en cours d'exécution. Notez que vous aurez besoin d'une autorisation pour afficher l'état du serveur/de la base de données .
Utilisez ceci :
exec sp_who2
Il renvoie toutes les activités db.
vous vérifierez à partir de ce proc si votre procédure est en cours d'exécution ou non.
J'essaierai également cela:
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;
Vieux fil mais vous pouvez le faire,
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
J'ai essayé de comprendre comment obtenir la liste des procédures en cours d'exécution et suis tombé sur ce fil. Après un peu de recherche sur MSDN j'ai pu comprendre la requête suivante qui fournira la liste des processus en cours d'exécution:
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
Un peu plus de travail sera nécessaire pour obtenir les paramètres.