Benutzer mit den meisten Antworten
Stored Procedure für Insert mit Fallunterscheidung

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
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]- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 08:03
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 6. Juli 2015 10:37
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]- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 08:03
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 6. Juli 2015 10:37
-
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 -
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]