2017-03-23 2 views
0

Ich habe eine SQL Server gespeicherte Prozedur, die mir den sehr häufig FehlerWarum gibt mir mein SP keine sinnvolle Fehlermeldung?

"db_ErrorCode Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0." 

Was nachdem ich habe festgestellt, kehrt das Googeln ist, dass seine wirklich sagen, dass es ein Fehler passiert, bevor die Transaktion festgeschrieben wird.

Es gibt ein

BEGIN TRY    

BEGIN TRANSACTION  

Zu Beginn des SP und

COMMIT TRANSACTION    

     END TRY    

    BEGIN CATCH    

    ROLLBACK TRANSACTION    

    SELECT @ErrorNumber = ERROR_NUMBER(),    
    @ErrorLine = ERROR_LINE(),    
    @ErrorMessage = ERROR_MESSAGE()    

    RAISERROR (@Flag, 18, 120);    

     END CATCH    

END   

Das Problem ist, dass zwischen diesen Linien in etwa 1100 Zeilen Code gibt es, und wenn es ein Problem gibt, Der gesamte SP muss zurückgesetzt werden, so dass wir keine try/catch-Anweisungen dazwischen setzen können. Und warum gibt mein abschließender Catch-Block den tatsächlichen Fehler nicht zurück, anstatt mir den nicht hilfreichen Transaktionszählungsfehler zu geben?

+1

Versuchen Sie, 'set XACT_ABORT ON 'an die Spitze der SP hinzuzufügen. Dadurch wird der Transaktionszählungsfehler beseitigt und Sie sollten den tatsächlichen Fehler sehen können. –

+0

An der Spitze vor dem BEGINN TRY und BEGIN TRANSACTION, mit den Globals? –

+0

Ja, mit den Globalen. –

Antwort

1

ich nicht, warum SQL Server gibt die Fehlermeldungen tut es vor allem nicht ohne zu sehen, die ganzen 1100 Zeilen Code beantworten kann. Wenn Sie jedoch wissen möchten, was zu tun ist, um den Fehler genau lokalisieren zu können, kann ich Ihnen einige Hinweise geben. Zuerst in jedem großen gespeicherten proc habe ich immer eine Variable @Debug als eine Eingabevariable. Machen Sie es zur letzten Variablen und vergeben Sie einen Standardwert von 0 (nicht im Debug-Modus). Wenn es einen Standardwert hat, sollte das Hinzufügen als letzte Variable nicht bestehende Aufrufe des Codes unterbrechen.

Wenn Sie debuggen möchten, können Sie dann Tests oder Ergebnisse hinzufügen, die Sie zeigen, welche Schritte abgeschlossen sind oder was die Ergebnisse verschiedener Operationen waren. Wickeln Sie diese Schritte, wenn Aussagen wie

IF @DEBUG=1 
BEGIN 
<add your tests here> 
END 

Sie können diesen Code nach jedem bedeutenden Schritt in der Prozedur hinzufügen oder vielleicht eine ein mit mehreren Schritten in sie später in der proc oder beides. Ich tendiere dazu, zu überprüfen, was in einem Schritt durch den Prozess passieren wird und welche die Ergebnisse am Ende zeigen.

Dieser Code wird nur ausgeführt, wenn Sie im Debug-Modus sind. Die Art von Dingen, die Sie einfügen könnten, könnte das Drucken oder Auswählen der Variablen an diesem Punkt des Prozesses sein, Drucken des Namens des Schritts, auf dem Sie sich befinden, Ausführen einer Auswahl, die normalerweise die Basis einer Einfügung oder der Ergebnisse nach einer sein würde Betrieb usw.

eine andere Sache, die Sie tun können, ist eine Tabelle Variable erstellen die Schritte, wie sie vollständig zu speichern. Die Tabellenvariable bleibt nach dem Rollback im Gültigkeitsbereich. Sie können also eine Auswahl treffen und sehen, welche Schritte vor dem Rollback abgeschlossen wurden.

Verwandte Themen