web-dev-qa-db-fra.com

Vérifiez si la procédure stockée est en cours d'exécution

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

  1. J'ai pensé à avoir un journal où écrire quand la procédure démarre et supprimer quand elle se termine.

    Défauts:

    • il laisse ouvert le cas lorsque le serveur redémarre ou une sorte d'échec à l'intérieur de la procédure.
    • cette méthode nécessite un certain travail avant d'exécuter la procédure, elle ne peut donc pas être appliquée aux procédures déjà en cours d'exécution.
  2. 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.


Mise à jour # 1


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é

11
Stefan Rogin

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

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 .

4
mattavatar

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;
3
Navneet

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
1
HMan06

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.

1
John Clayton