In SQL Server 2008 (aber auch 2014). Betrachten wir eine Prozedur mit einem Ausgabeparameter. Diese Prozedur kann einen Fehler erzeugen (und wird im folgenden Beispiel auftreten). Ich stelle fest, dass das Verhalten des Ausgabeparameters nicht dasselbe ist, wenn wir die Prozedur innerhalb eines TRY
/ CATCH
Blocks aufrufen .
Beispiel:
create procedure test_output @result varchar(10) output
as
begin
set @result = 'hello'
raiserror('This is an error', 16,1)
set @result = 'error'
end
Wenn wir das Verfahren auf einfache Weise starten:
declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
wir bekommen (und ich bin damit einverstanden):
Meldung 50000, Ebene 16, Status 1, Prozedur test_output, Zeile 7 [Stapelstartzeile 12]
Dies ist ein Fehler.
Ergebnis ist: Fehler
Wenn sich die Prozedur jetzt in einem Try / Catch-Block befindet:
declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
exec test_output @result = @res2 out
end try
begin catch
set @error_message = error_message()
raiserror(@error_message, 16,1)
print 'Result is: '+ isnull(@res2, 'empty')
end catch
wir bekommen (und ich bin verärgert):
Meldung 50000, Ebene 16, Status 1, Zeile 28
Dies ist ein Fehler.
Ergebnis ist: leer
Die Fehlermeldung ist OK, aber der Ausgabeparameter ist jetzt NULL . Wenn in einem TRY...CATCH
Kontext die Ausführung unmittelbar nach dem angehalten wird RAISERROR
, hätte ich erwartet, dass der Ausgabewert auf Hallo gesetzt wird .
Wieso ist es so?
quelle