Ich habe eine gespeicherte Prozedur, die selbst eine Liste von anderen gespeicherten Prozeduren, um Anrufe:Stored Procedure - Zwingen Ausführungsreihenfolge
CREATE PROCEDURE [dbo].[prSuperProc]
AS
BEGIN
EXEC [dbo].[prProc1]
EXEC [dbo].[prProc2]
EXEC [dbo].[prProc3]
--etc
END
Allerdings habe ich manchmal einige seltsame Ergebnisse in meine Tabellen haben, von prProc2 erzeugt, die hängt von den Ergebnissen ab, die von prProc1 generiert werden. Wenn ich prProc1, prProc2, prProc3 in der Reihenfolge manuell ausführe, dann ist alles in Ordnung. Es scheint, dass, wenn ich die Top-Level-Prozedur ausführen, Proc2 ausgeführt wird, bevor Proc1 abgeschlossen und seine Ergebnisse an die Datenbank übergeben hat. Es geht nicht immer schief, aber es scheint falsch zu laufen, wenn Proc1 eine lange Ausführungszeit hat (in diesem Fall ~ 10s).
Wie ändere ich prSuperProc so, dass jede Prozedur nur ausgeführt wird, wenn die vorhergehende Prozedur abgeschlossen und festgeschrieben wurde? Transaktionen?
bearbeiten extra Detail:
Es gibt einen Tisch in meinem db, die eine Spalte hat, die standardmäßig null ist. prProc1 führt eine Reihe von update-Anweisungen für diese Tabelle aus, um diese Spalte aufzufüllen. prProc2 fügt dann zusammenfassende Daten in eine sekundäre Tabelle basierend auf den Werten in dieser Spalte ein.
Wenn ich die Super-Prozedur ausführen, was ich (manchmal) sehe, ist die erste Tabelle hat die Ergebnisse korrekt von PrProc1 berechnet, aber PrProc2 hat Ergebnisse erzeugt, als ob die Spalte alle Nullen war. Wenn ich dann prProc2 manuell ausführe, werden die Zusammenfassungsdaten korrekt generiert.
Ich bin sicher, dass der Wrapper proc nur jederzeit einmal ausgeführt - es nur von mir zur Zeit verwendet wird! Ich schlage nicht vor, dass sie außer Betrieb sind, nur dass die von Proc1 durchgeführten Updates nicht vollständig festgeschrieben werden, wenn Proc2 startet, und ich habe dies bestätigt, indem ich sie manuell ausgeführt habe, um den Fehler zu entfernen. – meepmeep
@meepmeep, füge 'PRINT 'hinzu, starte prProc1'' und' PRINT' und beende alle prProc1''-Anweisungen in all diesen Prozeduren (einschließlich des Wrappers) und führe dann in SSMS 'EXEC [dbo]. [PrSuperProc]' mit Parametern aus Proc1 hat also eine lange Ausführungszeit (in diesem Fall ~ 10s), um zu sehen, was passiert. –
Ich habe das hier eingefügt. Wie immer weigert sich der Bug zu wiederholen, also lasse ich dieses Q offen, bis es wieder passiert und sehe was passiert. Vielen Dank! – meepmeep