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.
Kopieren von Daten von einer DB in eine andere DB
Moderator: thorben.braun
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. AngenommenHamburgo 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 ?
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
)
Code: Alles auswählen
select id, null, null, betrag, text1, text2, left(beleg, 100), 'ok'
from quelle
- 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
Grüße, Volker