Zvoni
Erfahrenes Mitglied
Mahlzeit,
bekanntlich kann man Tabellen- und Spaltennamen nicht als Parameter übergeben, also in der Art (Pseudo-code):
Es gibt aber einen Workaround.
1) Dazu braucht man eine staging Tabelle
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)
3) Jetzt liest man die Spalte "SQLString" aus:
ergibt für das zweite INSERT-Beispiel:
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.
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
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
SQL:
UPDATE MeineTabelle SET MeineSpalte=:FieldParam WHERE ID=:RowParam
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);
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: