Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Bestimmte Funktion aus einer Funktion aufrufen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von crashfinger, 27 März 2013.

  1. crashfinger

    crashfinger Benutzer

    Hallo Zusammen,
    ich habe folgendes Problem:

    Ich möchte aus einer Fuktion, abhängig von einer Variablen, eine bestimmte Funktion aufrufen.

    Ungefähr wie in diesem Beispiel:
    Code:
    CREATE FUNCTION f_UserToCostCenter
    (   
        @id          varchar(5),
        @userType    tinyint
    )
     
    RETURNS
    @Tbl TABLE (
        CostCenterID    int,
        CostCenterDsc   nvarchar(50)
    )
    AS
    BEGIN
     
        DECLARE @functionName AS varchar(25) =
            CASE
                WHEN @userType = 0 THEN 'f_SmToCostCenter'
                WHEN @userType = 1 THEN 'f_VsmToCostCenter'
                WHEN @userType = 2 THEN 'f_BlToCostCenter'
                WHEN @userType = 3 THEN 'f_RvlToCostCenter'
            END;
     
        EXECUTE('INSERT INTO @Tbl SELECT * FROM '+ @functionName +'('+ @id +')')
       
     
        RETURN
    END
    
    Nur leider ist der Execute-Operator innerhalb einer Funktion nicht zulässig.
    Gibt es alternative Lösungen?

    Gruß
    Crash
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Vorweg: ich null Plan von M$SQL, aber Du verwendest EXECUTE als Funktion, in PG / plpgsql verwendet man es in der Form

    execute <sql-string>

    Du machst

    execute(<sql-string>)


    Vielleicht ist das nur der Fehler, denn ich denke schon, daß man dynamisches SQL auch in M$SQL-Funktionen ausführen kann.


    Andreas
     
  3. ukulele

    ukulele Datenbank-Guru

    Code:
    EXECUTE('INSERT INTO @Tbl SELECT * FROM '+ @functionName +'('+ @id +')')
    Das könnte schon klappen aber @Tbl ist ja auch eine Variable die mit '+ @Tbl +' verkettet werden sollte.
    Code:
    EXECUTE('INSERT INTO @Tbl SELECT * FROM '+ @functionName +'('+ @id +')')
    Ansonsten müsste man das mal Schritt für Schritt debuggen aber generell muss mit EXEC(<String>) gearbeitet werden.
     
    akretschmer gefällt das.
  4. Tommi

    Tommi Datenbank-Guru

    Hi,

    hier gibt es zwei Lösungsmöglichkeiten:
    1. anstatt einer Tabellenwertfunktion direkt eine Prozedur nutzen und aufrufen. In einer Prozedur ist ein EXEC erlaubt und es kann auch eine Tabelle als Ergebnis zurückgegeben werden
    2. bei Beibehaltung der Tabellenwertfunktion einfach statt der CASE...WHEN-Anweisung eine IF-Verschachtelung nutzen und die für die Rückgabe deklarierte
    Tabelle mit einem fixen SELECT (statt Nutzung einer Variablen) auf die entsprechende Tabelle befüllen.


    Viele Grüße,
    Tommi
     
    ukulele gefällt das.
  5. ukulele

    ukulele Datenbank-Guru

    Eine Tabelle habe ich zugegebener Weise auch noch nie zurück gegeben. Aus einer Prozedur sollte man aber zur Not auch temporäre Tabellen füllen können, insofern ist hier wie von Tommi beschrieben die Funktion vieleicht nicht die beste Wahl.
     
  6. crashfinger

    crashfinger Benutzer

    Vielen Dank für die schnelle Hilfe an alle :)
    Ich werde mich heute Abend daransetzen, die Idee mit der Prozedur hört sich vielversprechend an.

    Ich gebe euch ein Feedback ob es funktioniert hat und wenn ja, wie die Lösung aussah.

    Gruß
    Crash
     
  7. crashfinger

    crashfinger Benutzer

    Also der 2. Lösungsansatz von Tommi war ganau das was ich brauchte.
    Die Separation der Werte von @userType mit CASE war bei mir der falsche Ansatz - mit IF funktioniert es wunderbar.

    Hier die funtionierende Lösung:
    Code:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[f_UserToCostCenter]
    (
        @id          int,
        @userType    tinyint
    )
     
    RETURNS
    @Tbl TABLE (
        CostCenterID    int,
        CostCenterDsc  nvarchar(50)
    )
    AS
    BEGIN
     
        IF @userType = 0
            INSERT INTO @Tbl SELECT * FROM f_SmToCostCenter(@id)
        IF @userType = 1
            INSERT INTO @Tbl SELECT * FROM f_VsmToCostCenter(@id)
        IF @userType = 2
            INSERT INTO @Tbl SELECT * FROM f_BlToCostCenter(@id)
        IF @userType = 3
            INSERT INTO @Tbl SELECT * FROM f_RvlToCostCenter(@id)
     
        RETURN
    END
    
    Danke nochnal an alle für die Hilfe
    Crash
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden