Benutzer mit den meisten Antworten
Raiserror in user defined function

Frage
-
Hallo!
Ich schreibe momentan als Übung eine einfache Funktion zum Addieren in MS SQL. Dabei bin ich auf das Problem gestoßen, dass innerhalb einer benutzerdefinierten Funktion ein "raiserror"-Operator ungültig ist. Wenn man das "raiserror" in eine gespeicherte Prozedur schreibt und in der Funktion benutzt, kompiliert die Funktion zwar, aber beim Ausführen erscheint folgende Fehlermeldung:
---
Meldung 443, Ebene 16, Status 14, Prozedur Addition, Zeile 13
Ungültige Verwendung eines RAISERROR-Operators mit Nebenwirkungen innerhalb einer Funktion.---
Der Befehl in der Funktion sieht so aus:
---
if (@negativ != 0)
begin
exec dbo.negativeZahlen_Exception
end---
Und die gespeicherte Prozedur:
---
create procedure dbo.negativeZahlen_Exception
as
begin
raiserror ('Negative Zahlen sind nicht erlaubt.', 16, 1)
end
go---
Ich würde gerne wissen warum so etwas in der Funktion nicht möglich ist.
Vielen Dank und liebe Grüße
Antworten
-
Hallo Tavaril,
auch wenn dies explizit nirgendwo zu stehen scheint, ergibt es sich wahrscheinlich implizit aus der Definition der Funktionen. In der Online-Doku steht zu Create Function:
Erstellt eine benutzerdefinierte Funktion. Es handelt sich dabei um eine gespeicherte Transact-SQL- oder CLR-Routine (Common Language Runtime), die einen Wert zurückgibt. Eine benutzerdefinierte Funktion ist entweder eine Skalarwert- oder Tabellenwertfunktion.Hier ist also das Resultset klar definiert und das Resultset von Raiserror würde davon grundlegend abweichen, was die Verarbeitung einer solchen Funktion in einer Select-Anweisung unmöglich machen würde.
HTH!
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
www.insidesql.org/blogs/cmu- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 28. Februar 2012 17:54
Alle Antworten
-
Hallo Tavaril,
auch wenn dies explizit nirgendwo zu stehen scheint, ergibt es sich wahrscheinlich implizit aus der Definition der Funktionen. In der Online-Doku steht zu Create Function:
Erstellt eine benutzerdefinierte Funktion. Es handelt sich dabei um eine gespeicherte Transact-SQL- oder CLR-Routine (Common Language Runtime), die einen Wert zurückgibt. Eine benutzerdefinierte Funktion ist entweder eine Skalarwert- oder Tabellenwertfunktion.Hier ist also das Resultset klar definiert und das Resultset von Raiserror würde davon grundlegend abweichen, was die Verarbeitung einer solchen Funktion in einer Select-Anweisung unmöglich machen würde.
HTH!
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
www.insidesql.org/blogs/cmu- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 28. Februar 2012 17:54