none
Raiserror in user defined function RRS feed

  • 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

    Donnerstag, 9. Februar 2012 12:12

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

    Donnerstag, 9. Februar 2012 14:07

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

    Donnerstag, 9. Februar 2012 14:07
  • Hallo Christoph!

    Erstmal vielen Dank für die Antwort. 

    Ich hätte vermutet, dass das Problem mit dem Determinismus benutzerdefinierter Funktionen zusammenhängt, aber so macht es mehr Sinn. 

    Ebenfalls einen schönen Tag, 

    Tavaril

    Freitag, 10. Februar 2012 12:12