Kopieren von Daten von einer DB in eine andere DB

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

bfuerchau
Beiträge: 546
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Das kann die SP nicht leisten, da keine Schemaabfragen über die interne Verbindung möglich sind.
Hierfür musst du nun doch die Erkenntisse für den Kopierbefehl im Client-Programm machen um den "Insert .. Select " dann ganz einfach per Execute auszuführen.
vr2
Beiträge: 246
Registriert: Fr 13. Apr 2018, 00:13

Hamburgo hat geschrieben: So 19. Jun 2022, 17:11 Ich bräuchte schon eine Logik, die in der Lage ist z.B. in der Tabelle MASCHIENEN die Daten des Feldes SERIEN_NR von der alten DB in die neue DB zu übertragen, auch wenn das Feld im neuen Schema eine neue Position hat, weil davor entweder neue Felder hinzu gekommen sind oder evtl. auch welche gelöscht wurden.

Auch müsste die SP merken, dass ein Feld einer Tabelle im neuen Schema evtl. nicht mehr da ist und dann halt einfach Alt-Daten verloren gehen, weil nicht kopiert werden kann.

Ist das ohne größeren Aufwand machbar ?
Ja. Die Zuordnung der Felder läuft über die Reihenfolge. Das und die Anzahl der Felder steuerst Du über das select statement. Du musst es nur so formulieren, dass es zur Zieltabelle passt, denn deren Struktur ist vorgegeben. Die Struktur der Quelltabelle ja auch, aber durch das select statement kannst Du Spalten passend umpositionieren und Leerspalten hinzufügen. Angenommen

Code: Alles auswählen

table quelle (
id integer,
text1 varchar(100),
text2 varchar(100),
beleg varchar(200),
betrag double precision,
konto varchar(50)
)

table ziel (
id integer,
datum date,
kommentar varchar(100),
betrag double precision,
text1 varchar(100),
text2 varchar(100),
buchungsbeleg varchar(100),
status integer
)
Dann würde das select bspw so aussehen, Du musst es so aufbauen, wie die Zieltabelle es erwartet, ich hab im Beispiel alle möglichen Abweichungen untergebracht:

Code: Alles auswählen

select id, null, null, betrag, text1, text2, left(beleg, 100), 'ok' 
from quelle
- id ist in beiden Tabellen die erste Spalte, kommt gleich so ins select, an die erste Position
- datum gibt es nicht in quelle, also übergibst Du für die zweite Spalte der Zieltabelle null im select an Position 2
- kommentar analog
- betrag gibt es in beiden Tabellen, ziel erwartet es als Spalte 4, also muss es auch im select an Position 4 sein
- text1 und text2 sind ebenfalls in beiden Tabellen, in ziel sind die in den Spalten 5 und 6, daher müssen sie auch im select an diesen Positionen sein
- beleg in quelle soll nach Spalte buchungsbeleg in Tabelle ziel. Die unterschiedlichen Namen machen nichts, da die Zuordnung über Position läuft. buchungsbeleg ist kürzer deklariert als beleg, daher musst Du die Daten im select auf die Länger der Zielspalte begrenzen - left(beleg, 100). Besser natürlich die Spalte der Zieltabelle vergrößern.
- ziel hat eine Spalte status, die es in quelle nicht gibt, hier hab ich mal eine Konstante 'ok' statt null im select übergeben, Du kannst natürlich auch einen Ausdruck übergeben, zb zwei Spalten der Quelltabelle verkettet oder betrag gerundet oder oder, was halt in selects alles geht.
- konto in Tabelle quelle wird nicht benutzt

Um sich die Zuordnung klarer zu machen, kannst Du auch Spaltenaliase vergeben, sie bewirken nichts bei der Datenübertragung, aber sorgen für Klarheit:

Code: Alles auswählen

select id, null datum, null kommentar, betrag, text1, text2, left(beleg, 100) buchungsbeleg, 'ok' status 
from quelle
jetzt klarer?

Grüße, Volker
Antworten