Bestimmte Funktion aus einer Funktion aufrufen

crashfinger

Benutzer
Beiträge
5
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo Zusammen,
ich habe folgendes Problem:


Nur leider ist der Execute-Operator innerhalb einer Funktion nicht zulässig.
Gibt es alternative Lösungen?

Gruß
Crash

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
 

ukulele

Datenbank-Guru
Beiträge
4.582
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.
 

Tommi

Datenbank-Guru
Beiträge
285
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

Datenbank-Guru
Beiträge
4.582
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.
 

crashfinger

Benutzer
Beiträge
5
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
 
Werbung:

crashfinger

Benutzer
Beiträge
5
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
 
Oben