Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism [SQL] Datensatz kopieren (https://www.delphipraxis.net/125276-%5Bsql%5D-datensatz-kopieren.html)

Nersgatt 3. Dez 2008 13:12

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:
INSERT INTO TABELLE (ID, NAME, VORNAME) SELECT 4 AS ID, NAME, VORNAME FROM TABELLE WHERE ID = 3;
Das produziert eine Kopie von Datensatz 3 und weist die ID 4 zu.
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:
INSERT INTO TABELLE SELECT 4 AS ID, * FROM TABELLE WHERE ID = 3;
Geht aber nicht.

Tipps?

Danke!
Jens

Relicted 3. Dez 2008 13:29

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

Nersgatt 3. Dez 2008 13:35

Re: [SQL] Datensatz kopieren
 
Zitat:

Zitat von Relicted
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.

Mit "AS ID" weise ich dem ja nur einen Namen zu. Vielleicht könnte ich es mir sparen, habe ich mir aber mal so angewöhnt.

Wenn ich schreibe
SQL-Code:
SELECT 4 FROM RDB$DATABASE
dann nennt Firebird die Spalter "F_1".
Wenn ich schreibe
SQL-Code:
SELECT 4 AS ID FROM RDB$DATABASE
dann heißt die Spalte halt "ID".

Gruß,
Jens

nahpets 3. Dez 2008 13:38

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:
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'
Wenn Du Dir nun das Ergebnis dieses SQL nimmst, solltest Du das Insert-Statement erhalten, das Du wünschst.
SQL-Code:
insert into tabelle (ID
 ,name
 ,vorname
 ,beruf
) select 4 as ID
,name
,vorname
,beruf
from tabelle where id = 3
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.

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.

Relicted 3. Dez 2008 13:39

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

Hansa 3. Dez 2008 13:40

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;

Nersgatt 3. Dez 2008 13:44

Re: [SQL] Datensatz kopieren
 
Zitat:

Zitat von nahpets
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.

Danke, so oder ähnlich kann ich es in Firebird auch umsetzen. Ich mag halt dieses SQL-Zusammen-Gebastel nicht sonderlich, aber ich glaube hier führt kein Weg daran vorbei. Immer noch besser, als bei jedem neuen Feld daran denken zu müssen, auch diese Routine anzupassen.
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

Nersgatt 3. Dez 2008 13:46

Re: [SQL] Datensatz kopieren
 
Zitat:

Zitat von Hansa
Wie wärs denn mit sowas :

Delphi-Quellcode:
Dataset2 := Dataset1; // alle Felder zunächst mal kopieren
// einzelne Felder bearbeiten
Dataset2.Post;

Siehe oben: Delphi.NET mit Firebird.NET Provider :mrgreen:

Gruß,
Jens

Hansa 3. Dez 2008 13:53

Re: [SQL] Datensatz kopieren
 
Soll das heißen, bei .NET gibts in Delphi kein TDataset oder ähnliches mehr ? :shock:

Nersgatt 3. Dez 2008 13:56

Re: [SQL] Datensatz kopieren
 
Zitat:

Zitat von Hansa
Soll das heißen, bei .NET gibts in Delphi kein TDataset oder ähnliches mehr ? :shock:

Es gibt in .NET ein Dataset, das hat aber mit dem TDataSet nicht viel zu tun. Ist ein ganz anderes Konzept.

Gruß,
Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz