Comment puis-je connaître le statut d'exécution d'une procédure stockée dans MS SQL Server

J'ai une longue procédure stockée et comment puis-je connaître le statut d'exécution? Quelque chose comme 50% terminé, etc. J'ai beaucoup cherché et n'a pas obtenu de résultat satisfaisant.Alors j'espère que ce n'est pas possible.J'utilise MS SQL Server 2008. SI ce n'est pas disponible puis-je connaître la raison pour laquelle il n'est pas disponible ?

Vous pouvez utiliser:

RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT 

pour imprimer le message immédiatement après cette déclaration. (il ne génère pas de message d'erreur).

Non, il n'est pas disponible au less dans la forme que vous décrivez. C'est parce qu'il est très difficile de savoir à la fois ce qu'une procédure stockée doit faire en interne (si elle appelle d'autres procs stockés?) Et combien de time cela prendra, jusqu'à ce qu'elle essaye de le faire.

Bien sûr, vous pouvez examiner le proc et le voir SELECT * FROM [TableName]

Mais alors vous auriez besoin de connaître la taille de la table, les types de données returnnés, la vitesse d'access au disque, si la requête a été caching, etc.

Ensuite, que se passe-t-il si un autre process verrouille un logging de façon inattendue et prend plus de time que d'habitude? Vous ne savez pas combien de time ce verrou sera tenu – alors comment calculer un pourcentage d'une variable inconnue (time)?

Le mieux que vous pouvez faire est de mettre des 'points de contrôle' dans votre proc pour soit print messages ou envoyer des emails ou vous connecter dans un tableau après chaque étape discrète, par exemple

 print getdate() print 'Selecting from [Users]' Select * from [Users] print getdate() print 'Selecting from [Clients]' Select * from [Clients] print getdate() print 'Finished' 

Si vous avez une application client .NET, vous pouvez recevoir des messages de progression approximatifs envoyés par le server en utilisant la syntaxe suivante en C #:

  using (SqlConnection conn = new SqlConnection(...)) { conn.FireInfoMessageEventOnUserErrors = true; conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage); using (SqlCommand comm = new SqlCommand("dbo.sp1", conn) { CommandType = CommandType.StoredProcedure }) { conn.Open(); comm.ExecuteNonQuery(); } } static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) { // Process received message } 

Alors que les messages côté server peuvent être envoyés comme décrit par Janis dans l'une des réponses précédentes:

  RAISERROR('33%%..', 10, 0) WITH NOWAIT 

Il n'existe aucune fonctionnalité embeddede à SQL Server pour vérifier l'état d'une procédure stockée, mais vous pouvez écrire quelque chose qui fera quelque chose de similaire. Dans notre cas, nous avons créé une fonction de journalisation qui affiche un message après chaque process dans un proc stocké.

Disons que vous avez un proc stocké qui exécute plusieurs requêtes:

 SELECT * FROM yourTable UPDATE ... SET ... DELETE FROM ... 

Vous pouvez mettre en place après chaque requête / process une étape qui publiera des données dans une table de journalisation:

 SELECT * FROM yourTable -- log query INSERT INTO LogTable (DateComplete, Status, TaskId) VALUES (getdate(), 'Complete', 1) UPDATE ... SET ... -- log query INSERT INTO LogTable (DateComplete, Status, TaskId) VALUES (getdate(), 'Complete', 2) DELETE FROM ... -- log query INSERT INTO LogTable (DateComplete, Status, TaskId) VALUES (getdate(), 'Complete', 3) 

Vous pouvez aller encore plus loin en utilisant un bloc TRY...CATCH autour de vos requêtes. Vous pouvez alors avoir des messages différents sur le succès ou l'échec du process.