Ich schreibe eine benutzerdefinierte Funktion in SQL Server 2008. Ich weiß, dass Funktionen Fehler auf die übliche Weise nicht auslösen können - wenn Sie versuchen, die RAISERROR-Anweisung aufzunehmen SQL zurückgibt:So melden Sie einen Fehler von einer benutzerdefinierten SQL Server-Funktion
Msg 443, Level 16, State 14, Procedure ..., Line ...
Invalid use of a side-effecting operator 'RAISERROR' within a function.
Aber die Tatsache ist, nimmt die Funktion eine Eingabe, die ungültig sein kann, und wenn es ist, gibt es keinen sinnvollen Wert der Funktion zurückgeben kann. Was mache ich dann?
Ich könnte natürlich NULL zurückgeben, aber es wäre schwierig für jeden Entwickler, der die Funktion verwendet, um dies zu beheben. Ich könnte auch eine Division durch Null oder Ähnliches verursachen - das würde eine Fehlermeldung erzeugen, aber eine irreführende. Kann ich irgendwie meine eigene Fehlermeldung melden?
JA !!! Es klappt! Das ist hervorragend! – EMP
Große Antwort, aber JEEZ Wotta Hack. > :( – JohnL4
Für eine Inline-Tabelle-Wert-Funktion, wo die RETURN ist eine einfache Auswahl, das allein funktioniert nicht, weil nichts zurückgegeben wird - nicht einmal null, und in meinem Fall wollte ich einen Fehler werfen, wenn nichts gefunden wurde Ich wollte die Inline-Funktion aus offensichtlichen Performance-Gründen nicht in eine Multi-Statement-Funktion zerlegen, stattdessen habe ich Ihre Lösung plus ISNULL und MAX verwendet. Die RETURN-Anweisung sieht nun so aus: SELECT ISNULL (MAX (E.EntityID) , CAST ('Das Lookup (' + @LookupVariable + ') existiert nicht.' As Int)) [EntityID] FROM Entity als E WHERE E.Lookup = @ LookupVariable – MikeTeeVee