[SQLite-Tutorial] Wie benutze Ich Parameter für Tabellen- und Spaltennamen

Zvoni

Erfahrenes Mitglied
Mahlzeit,

bekanntlich kann man Tabellen- und Spaltennamen nicht als Parameter übergeben, also in der Art (Pseudo-code):
SQL:
UPDATE :EinTabellenName SET :EinFeldName=:FeldParam WHERE ID=:RowParam

Es gibt aber einen Workaround.
1) Dazu braucht man eine staging Tabelle
SQL:
CREATE TABLE "tbl_update" (
    "TableName"    TEXT,
    "FieldName"    TEXT,
    "FieldParam"    TEXT,
    "RowParam" TEXT,
    "SQLString" TEXT GENERATED ALWAYS AS ('UPDATE ' || "TableName" || ' SET ' || "FieldName" || '=' || "FieldParam" || ' WHERE ID=' || "RowParam") VIRTUAL
);

2) Jetzt macht man einen normalen INSERT auf diese Tabelle, jedoch mit folgender "Spezialität":
Nur die ersten zwei Values sind Parameter (oder anstatt Parameter übergibt man direkt Tabellen- und Spaltenname)
SQL:
INSERT INTO tbl_update
("TableName", "FieldName", "FieldParam", "RowParam")
VALUES (:TableNameParam,:FieldNameParam,':FieldParam',':RowParam');  //Achtet auf die zwei letzten Werte: Das sind Strings!!

//Oder
INSERT INTO tbl_update
("TableName", "FieldName", "FieldParam", "RowParam")
VALUES ('MeineTabelle','MeineSpalte',':FieldParam',':RowParam');  //Achtet auf die zwei letzten Werte: Das sind Strings!!

3) Jetzt liest man die Spalte "SQLString" aus:
SQL:
SELECT SQLString FROM tbl_update
ergibt für das zweite INSERT-Beispiel:
SQL:
UPDATE MeineTabelle SET MeineSpalte=:FieldParam WHERE ID=:RowParam
Dieses Ergebnis könnt ihr dann ganz normal wie ein parametrisiertes UPDATE behandeln

Bemerkung: Sofern man über die Datentypen Bescheid weiss (also man weiss, dass FieldParam immer ein Text ist usw.) kann man sich Schritt 3 sparen, und einen AFTER INSERT-Trigger nehmen um es zu automatisieren. Dazu müssen dann aber auch die letzten beiden Values des INSERTS als Parameter oder direkt als Wert übergeben werden.
SQL:
INSERT INTO tbl_update
("TableName", "FieldName", "FieldParam", "RowParam")
VALUES (:TableNameParam,:FieldNameParam,:FieldParam,:RowParam);
//Oder
INSERT INTO tbl_update
("TableName", "FieldName", "FieldParam", "RowParam")
VALUES ('MeineTabelle','MeineSpalte','NeuerSpaltenwert',123456);
Die Spalte "SQLString" wird dann im Trigger ausgelesen und ausgeführt
Im zweiten INSERT müsste natürlich die Spalte "RowParam" in der Tabelle oben anstatt TEXT natürlich INTEGER sein.



Viel Spass

P.S.: Man sollte natürlich sicher gehen, dass die staging-Tabelle leer ist, also vorher oder nachher ein TRUNCATE abfeuern

EDIT: Dieser Workaround sollte auch mit anderen DBMS funktionieren. Das einzige SQLite-spezifische ist die Spalte "SQLString" bin mir aber sicher, dass andere gängige DBMS auch "Computed Columns" anbieten.
UNGETESTET: How To Use MySQL Generated Column Effectively
Scheint als ob MySQL sogar diesselbe Syntax hat
 
Zuletzt bearbeitet: