Ich schreibe eine benutzerdefinierte Funktion in SQL Server 2008. Ich weiß, dass Funktionen nicht auf die übliche Weise Fehler auslösen können - wenn Sie versuchen, die RAISERROR-Anweisung einzuschließen, die SQL zurückgibt:
Msg 443, Level 16, State 14, Procedure ..., Line ...
Invalid use of a side-effecting operator 'RAISERROR' within a function.
Tatsache ist jedoch, dass die Funktion einige Eingaben benötigt, die möglicherweise ungültig sind, und wenn dies der Fall ist, gibt es keinen aussagekräftigen Wert, den die Funktion zurückgeben kann. Was mache ich dann?
Ich könnte natürlich NULL zurückgeben, aber es wäre für jeden Entwickler schwierig, die Funktion zu verwenden, um dies zu beheben. Ich könnte auch eine Division durch Null oder so etwas verursachen - dies würde eine Fehlermeldung erzeugen, aber eine irreführende. Gibt es eine Möglichkeit, meine eigene Fehlermeldung irgendwie melden zu lassen?
declare @error int; set @error = 'Error happened here.';
Der übliche Trick besteht darin, eine Division durch 0 zu erzwingen. Dies löst einen Fehler aus und unterbricht die aktuelle Anweisung, die die Funktion bewertet. Wenn der Entwickler oder Supportmitarbeiter über dieses Verhalten Bescheid weiß, ist die Untersuchung und Fehlerbehebung des Problems ziemlich einfach, da der Fehler durch Division durch 0 als Symptom eines anderen, nicht verwandten Problems verstanden wird.
So schlecht dies aus jeder Sicht auch aussieht, leider lässt das Design der SQL-Funktionen derzeit keine bessere Wahl zu. Die Verwendung von RAISERROR sollte in Funktionen unbedingt zulässig sein.
quelle
In Anlehnung an die Antwort von Vladimir Korolev lautet die Redewendung, einen Fehler bedingt auszulösen
quelle
Ich denke, der sauberste Weg ist, einfach zu akzeptieren, dass die Funktion NULL zurückgeben kann, wenn ungültige Argumente übergeben werden. Solange dies klar dokumentiert ist, sollte dies in Ordnung sein?
quelle
RAISEERROR
oder@@ERROR
sind in UDFs nicht erlaubt. Können Sie die UDF in ein strenges Verfahren verwandeln?Aus Erland Sommarskogs Artikel Fehlerbehandlung in SQL Server - ein Hintergrund :
quelle
Die beste Antwort ist im Allgemeinen die beste, funktioniert jedoch nicht für Funktionen mit Inline-Tabellenwerten.
MikeTeeVee gab in seinem Kommentar zur Top-Antwort eine Lösung dafür an, erforderte jedoch die Verwendung einer Aggregatfunktion wie MAX, die für meine Umstände nicht gut funktionierte.
Ich habe mit einer alternativen Lösung für den Fall herumgespielt, dass Sie eine Inline-Tabelle mit dem Wert udf benötigen, die anstelle eines Aggregats so etwas wie select * zurückgibt . Beispielcode zur Lösung dieses speziellen Falls finden Sie unten. Wie schon jemand darauf hingewiesen hat ... "JEEZ muss hacken" :) Ich begrüße jede bessere Lösung für diesen Fall!
quelle
Einige Leute fragten nach Fehlern in Tabellenwertfunktionen, da Sie keine " RETURN [ungültige Besetzung] " verwenden können. Das Zuweisen der ungültigen Umwandlung zu einer Variablen funktioniert genauso gut.
Das führt zu:
quelle
Ich kann unter Davecs Antwort keine Kommentare zur Tabellenwertfunktion abgeben, aber meiner bescheidenen Meinung nach ist dies eine einfachere Lösung:
quelle
Eine Möglichkeit (ein Hack) besteht darin, eine Funktion / gespeicherte Prozedur zu haben, die eine ungültige Aktion ausführt. Zum Beispiel das folgende Pseudo-SQL
In der Tabelle tbl_throw_error gibt es eine eindeutige Einschränkung für die Spalte err_msg. Ein Nebeneffekt davon (zumindest unter MySQL) ist, dass der Wert von err_msg als Beschreibung der Ausnahme verwendet wird, wenn sie wieder in das Ausnahmeobjekt auf Anwendungsebene aufgenommen wird.
Ich weiß nicht, ob Sie mit SQL Server etwas Ähnliches tun können, aber einen Versuch wert.
quelle