6
votes

Procédure stockée - Forcer la commande d'exécution

J'ai une procédure stockée qui appelle elle-même une liste d'autres procédures stockées dans l'ordre: XXX

Cependant, j'ai parfois des résultats étranges dans mes tables, générées par PRPROC2, qui dépend sur les résultats générés par PrProC1. Si j'exécute manuellement PrProC1, PrProC2, PrProC3 afin que tout va bien. Il semble que lorsque j'exécute la procédure de niveau supérieur, que proc2 est en cours d'exécution avant que proc1 ait terminé et engagé ses résultats à la DB. Cela ne va pas toujours mal, mais il semble aller mal quand proc1 a une longue heure d'exécution (dans ce cas ~ 10s).

Comment puis-je modifier PRSUPERPROC de sorte que chaque procédure ne s'exécute que lorsque la procédure ne s'exécute qu'une fois que la procédure ne s'exécute qu'une fois que la procédure ne s'exécute qu'une fois la précédente la procédure est terminée et engagée? Transactions?

Modifier pour plus de détails:

Il y a une table dans mon DB qui a une colonne qui est null par défaut. PrProC1 effectue un ensemble d'instructions de mise à jour sur ce tableau pour remplir cette colonne. PrProC2 puis insère des données récapitulatives dans une table secondaire en fonction des valeurs de cette colonne.

Lorsque j'exécute la super procédure, ce que je suis (parfois) vu est la première table contient les résultats correctement calculés par PrProC1, Mais PrProC2 a généré des résultats comme si la colonne était toutes des nuls. Si j'exécute ensuite manuellement PrProC2, les données de synthèse sont générées correctement.


0 commentaires

3 Réponses :


4
votes

proc2 sera pas exécuté avant ProC1: c'est un simple comme ça. SQL s'exécutera l'un après l'autre mais jamais en panne.

Vous pouvez profiler ceci à l'aide de Modèle TSQL_SPS

Avez-vous 2 exécutions de l'emballage procureur, par exemple?


3 commentaires

Je suis certain que Wrapper ProC n'est exécuté qu'une seule fois à tout moment - il est utilisé uniquement par moi pour le moment! Je ne suggère pas qu'ils sont à court d'ordre, juste que les mises à jour effectuées par PROC1 ne sont pas entièrement engagées lorsque proc2 démarre, et je l'ai confirmé en les exécutant manuellement à son tour pour supprimer le bogue.


@meepmeep, Ajouter Imprimer 'Démarrage PrProC1' et ET IMPRESSION des instructions type de type dans toutes ces procédures (y compris l'emballage), puis dans SSMS Exécuter EXEC [DBO]. [PRSUPERPROC] , avec Paramètres afin que proc1 ait une longue heure d'exécution (dans ce cas ~ 10s) pour voir ce qui se passe.


J'ai mis cela dans. Comme toujours, le bogue refuse de se reproduire. Je laisserai donc ce Q ouvert jusqu'à ce qu'il arrive encore et voyez quels résultats. Merci!



2
votes

Pour chaque appel de PRSUPERPROC , ils s'exécuteront de manière en série 1, puis le suivant, puis le suivant. Toutefois, si plusieurs utilisateurs appellent tous prsuperproc , vous aurez une exécution entrelacée de PrProC1-PrProC2 + PrProC1-PrProC2 + PRPROC3 et de PrProC3 PRPROC3.

Ce qui pourrait être quelque chose comme ça : xxx

Cela dépend vraiment de ce qui se passe dans vos procédures, combien d'utilisateurs simultanés et quelles lignes sont en train de changer et / ou de verrouillage

edit Vous pouvez essayer ceci pour résoudre le problème: xxx

en utilisant une transaction autour de tout, il tentera de verrouiller les utilisateurs simultanés de travailler sur les mêmes données. L'utilisation de la capture try tentative d'attraper des erreurs qui pourraient se produire dans une procédure et empêcher les suivants de s'exécuter.


0 commentaires

2
votes

J'ai eu le même problème (mainteniez un produit à ce moment-là) et je l'ai réparé en supprimant le produit le plus externe et en exécutant la principale la plupart des procès. Ensuite, ce processus exécuterait le processus en dépendant et ainsi de suite. C'est une douleur dans le b *** mais cela fonctionne.

htth


1 commentaires

Merci - je vais essayer les transactions ci-dessous, mais si cela échoue, cela fonctionne comme une solution non élégante. Je veux que je puisse être en mesure de gérer les PROC indépendamment également, donc je devrai ajouter une sorte de paramètre qui cascades à travers les appels PROC.