![]() |
Datenbank: Firebird • Version: 2.0 • Zugriff über: Firebird .NET Provider
[SQL] Datensatz kopieren
Hallo,
ich stehe im Moment etwas auf dem Schlauch. Ich möchte einen Datensatz mit leichten Änderungen kopieren. Dabei möchte gern alle Felder, bis auf 2 bestimmte Felder eins zu eins kopieren. Und das auch, wenn in Zukunft evtl. mal Felder dazukommen. In SQL könnte ich ja schreiben:
SQL-Code:
Das produziert eine Kopie von Datensatz 3 und weist die ID 4 zu.
INSERT INTO TABELLE (ID, NAME, VORNAME) SELECT 4 AS ID, NAME, VORNAME FROM TABELLE WHERE ID = 3;
Wenn nun aber in Zukunft noch das Feld BERUF hinzu kommt, möchte ich mein SQL-Statement nicht ändern müssen. Wie geht man sowas an? Leider kann ich im SELECT den * nur benutzen, wenn ich sonst nichts mit reinschreibe. Sonst hätte ich so eine Idee gehabt:
SQL-Code:
Geht aber nicht.
INSERT INTO TABELLE SELECT 4 AS ID, * FROM TABELLE WHERE ID = 3;
Tipps? Danke! Jens |
Re: [SQL] Datensatz kopieren
Ich glaube das ist nicht möglich. Ich wunder mich aber gerade, dass das "4 as ID" funktioniert. Ich kannte es bisher nur dass man direkt den Wert also hier nur "4" hinschreiben würde.
Gruß Reli |
Re: [SQL] Datensatz kopieren
Zitat:
Wenn ich schreibe
SQL-Code:
dann nennt Firebird die Spalter "F_1".
SELECT 4 FROM RDB$DATABASE
Wenn ich schreibe
SQL-Code:
dann heißt die Spalte halt "ID".
SELECT 4 AS ID FROM RDB$DATABASE
Gruß, Jens |
Re: [SQL] Datensatz kopieren
Hallo,
kenne Firebird nicht. Bei Oracle oder SQL-Server täte ich ins Dictionary schauen und mir dort aus den Einträgen zur Laufzeit das passende Statement bauen, mit Ausnahme der Spalten, bei denen ich selbst was ändern möchte. Unter SQL-Server könnte das ungefähr so aussehen:
SQL-Code:
Wenn Du Dir nun das Ergebnis dieses SQL nimmst, solltest Du das Insert-Statement erhalten, das Du wünschst.
select 'insert into tabelle (ID '
union all select ' ,' + column_name from information_schema.columns where table_name like 'tabelle' and column_name <> 'ID' union all select ') select 4 as ID' union all select ',' + column_name from information_schema.columns where table_name like 'tabelle' and column_name <> 'ID' union all select 'from tabelle where id = 3'
SQL-Code:
Und wenn Du neue Spalten in die Tabelle einfügst, so ändert sich das Ergebnis der ersten Abfrage um die entsprechenden Spalten und passt sich somit an Dein geändertes Datenmodell an.
insert into tabelle (ID
,name ,vorname ,beruf ) select 4 as ID ,name ,vorname ,beruf from tabelle where id = 3 Unter Oracle haben wir mal ein System gebaut, dass permanenten Änderungen des Datenmodells unterworfen war und ist. Diese Routinen sind nun seit etwa 5 Jahren im Einsatz und mussten bisher nicht einmal angepasst werden. |
Re: [SQL] Datensatz kopieren
Ja bei Abfragen ist das ja auch i.O. aber bei "Insert Selects" überflüssig, da es da auf die Reihenfolge ankommt wie du die Spalten angibst.
Gruß reli |
Re: [SQL] Datensatz kopieren
Wie wärs denn mit sowas :
Delphi-Quellcode:
Dataset2 := Dataset1; // alle Felder zunächst mal kopieren
// einzelne Felder bearbeiten Dataset2.Post; |
Re: [SQL] Datensatz kopieren
Zitat:
Bis vor einiger Zeit habe ich 4GL programmiert, dort konnte man sowas einfach mit dem Befehl BUFFER-COPY lösen. Naja, alles hat sein Vor- und Nachteile. Gruß, Jens |
Re: [SQL] Datensatz kopieren
Zitat:
Gruß, Jens |
Re: [SQL] Datensatz kopieren
Soll das heißen, bei .NET gibts in Delphi kein TDataset oder ähnliches mehr ? :shock:
|
Re: [SQL] Datensatz kopieren
Zitat:
Gruß, Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz