Rückgabe Fehlermeldung von gespeicherten Prozeduren
Die Frage sollte Recht einfach sein, aber ich kann nicht herausfinden, die Antwort noch, warum meine gespeicherten Prozedur nicht funktioniert.
CREATE PROCEDURE spTest_Delete
@ID int
AS
begin tran
declare @err int
declare @errMesage nvarchar(max)
set @errMesage = ''
set @err = 0
delete from Test
where ID = @ID
set @err = @@ERROR
set @errMesage = ERROR_MESSAGE()
if @err = 0
commit tran
else
begin
RAISERROR(N'Could not delete !Error nr: %d. Message: %s', 1, 16, @err, @errMesage)
rollback tran
end
Dieses Verfahren läuft ok, aber im Falle von FK-constraint auf die delete
Aussage läuft es in einen Fehler (was gut ist) und ich möchte, um den Fehler abzufangen.
Msg 547, Ebene 16, Status 0, Prozedur spTest_Delete, Zeile 12
Die DELETE-Anweisung in Konflikt mit der REFERENCE-Einschränkung
"FK_TEstFK_Test". Der Konflikt ist aufgetreten in Datenbank "Test", Tabelle
"dbo.Test", Spalte 'ID'. Die Anweisung wurde beendet.Konnte nicht gelöscht werden!
Fehler nr: 547. Nachricht: (null) Msg 50000, Ebene 1, Status 16
Bekomme ich immer einen null-Wert für meine variable message, auch wenn die delete
- Anweisung gibt eine Fehlermeldung aus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen mit TRY-CATCH fangen und Ihr eine Fehlermeldung wie diese:
if ISNULL(@err,0) = 0
RaiseError
zurück (via .NET-Ausnahme) seinemsg_str
Parameter, um den Anrufer, wenn der Anrufer ein .NET app, aber wie sieht es zurückgeben, wenn der Anrufer eine andere Gespeicherte Prozedur? DieError_Message
(und alleError_*
Funktionen) zurückNull
unmittelbar nachExec
auf eine Gespeicherte Prozedur, die aufgerufenRaiseError
rechts, bevor esreturn
-ed-und es ist auch nicht Auslöser derCatch
Block in der Aufrufenden Gespeicherten Prozedur.Möchten Sie vielleicht, um zu starten mit TRY..CATCH block in den Verfahren
Also die Prozedur könnte wie folgt umgeschrieben werden:
Bitte beachten Sie, dass Sie als einzigen delete-Anweisung. Es bedeutet, dass es nicht sein müssen, eingewickelt in eine Transaktion. Diese Frage erklärt, warum.
Ihr code wird dies:
Nun, warum Ihr
@errMessage
immer NULL ist? DaERROR_MESSAGE()
ist NUR gültig IM CATCH-BLOCK. Das ist geschrieben in Dokumentation:Die Verwendung von TRY..CATCH in Transact-SQL sagt dieser: