none
Stored Procedure für Insert mit Fallunterscheidung RRS feed

  • Frage

  • Hallo,

    gegeben sei folgende Tabelle:

    Tabelle "Zuordnung"

    • idx int primary key
    • personal int
    • aussenschluessel int
    • bueroschluessel int

    Ich hätte nun gerne eine Stored Procedure, der man *entweder* einen Aussenschluessel *oder* einen Büroschlüssel übergibt, und dies durch einen extra Parameter "Typ" kennzeichnet:

    insertZuordnung (idx,personal,typ,nummer)

    Die Prozedur soll in etwa folgendes machen:

    switch typ
    {
     case 'A': attribut="aussenschluessel";
     case "B": attribut="bueroschluessel";
    }
    
    INSERT INTO Zuordnung(idx,personal,<attribut>)
    VALUES (@idx,@personal,@nummer);

    Geht das? Ginge es zur not, statt der Zwischenvariablen "attribut" in der Fallunterscheidung gleich das ganze SQL-Statement anzugeben?

    Wie macht man das am besten?

    Danke
    Magnus

    Donnerstag, 25. Juni 2015 10:51

Antworten

  • Hallo Magnus,

    das geht schon, nur nicht über ein einzelnes INSERT, denn den Spaltennamen kann man nicht parametrisieren, der muss fest angegeben werden. Aber Du kannst es per IF/ELSE über eine Fallunterscheidung machen:

    CREATE PROCEDURE dbo.spInsertKey
        (@idx int
        ,@personal int
        ,@schluessel int
        ,@typ char(1))
    AS
    BEGIN
        SET NOCOUNT ON;
    
        IF @typ = 'A'
        BEGIN
            INSERT INTO dbo.Zuordnung
                (idx, personal, aussenschluessel)
            VALUES
                (@idx, @personal, @schluessel);
        END
        ELSE
        BEGIN
            INSERT INTO dbo.Zuordnung
                (idx, personal, bueroschluessel)
            VALUES
                (@idx, @personal, @schluessel);
        END;
    END;
    GO


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 25. Juni 2015 11:11

Alle Antworten

  • Hallo Magnus,

    das geht schon, nur nicht über ein einzelnes INSERT, denn den Spaltennamen kann man nicht parametrisieren, der muss fest angegeben werden. Aber Du kannst es per IF/ELSE über eine Fallunterscheidung machen:

    CREATE PROCEDURE dbo.spInsertKey
        (@idx int
        ,@personal int
        ,@schluessel int
        ,@typ char(1))
    AS
    BEGIN
        SET NOCOUNT ON;
    
        IF @typ = 'A'
        BEGIN
            INSERT INTO dbo.Zuordnung
                (idx, personal, aussenschluessel)
            VALUES
                (@idx, @personal, @schluessel);
        END
        ELSE
        BEGIN
            INSERT INTO dbo.Zuordnung
                (idx, personal, bueroschluessel)
            VALUES
                (@idx, @personal, @schluessel);
        END;
    END;
    GO


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 25. Juni 2015 11:11
  • Hallo und vielen Dank für die Lösung!

    Noch eine ergänzende Frage:

    Könnte man auch den Index (idx) innerhalb der Prozedur berechnen, d. h. den bisherigen Maximalwert (MAX(idx)) ermitteln und um eins erhöhen?

    So in der Art:

    if (tabelle nicht leer)
     idx = (SELECT MAX(idx) FROM Zuordnung) + 1;
    else
     idx = 1;

    Danke!
    Magnus

    Donnerstag, 25. Juni 2015 13:18
  • Ja, das kannst Du, nur ist das so erst mal keine sichere Methode, den zwischen Lesen der Max Id und schreiben des Datensatzes könnte ein anderer Prozess das gleiche machen, dann schlägt das fehl. Man müsste per Transaction die Tabelle sperren oder einfach eine IDENTITY (Property) (Transact-SQL) Spalte verwenden, da werden die ID's automatisch vom SQL Server vergeben.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 25. Juni 2015 14:46
  • Zu Deiner Lösung von oben:

    Ich erhalte da die Fehlermeldung:

    Msg 137, Level 15, State 2, Line 31
    Must declare the scalar variable "@typ".
    

    Deklariert ist sie doch, als Parameter der Prozedur, oder?

    Donnerstag, 25. Juni 2015 16:43
  • Bei mir ist sie als Übergabe-Parameter deklariert

    CREATE PROCEDURE dbo.spInsertKey
        (@idx int
        ,@personal int
        ,@schluessel int
        ,@typ char(1))
    AS
    BEGIN

    Wie sieht Dein Code genau aus?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 25. Juni 2015 17:24