toxduebel
Goto Top

Befehl für SQL Server 2012 - Importscript bei Create Table verallgemeinern

Hallo zusammen,

Ausgangssituation: Ich habe einen SQL Server und lasse dort nächtlich die Daten von einer Oracle Tabelle über ein Import Script importieren (SQL Server Agent).

Hierzu habe ich folgende Anfrage:

Gibt es eine Möglichkeit des Create Table Befehl in meinem Import Script zu verallgemeinern, sodass die komplette Struktur der Oracle Tabelle zunächst abgerufen und angelegt wird? Die angelegte Struktur wird dann im 2. Schritt mit den Inhalten befüllt...

Hintergrund: Falls in der bsw. "Artikel" Tabelle in der Oracle eine neue Spalte hinzugefügt wird, fehlt diese beim Erstellen der Tabelle im Script und müsste jedes mal manuell hinzugefügt werden...

Mit freundlichen Grüßen

toxduebel
1

Content-ID: 315351

Url: https://administrator.de/contentid/315351

Ausgedruckt am: 14.11.2024 um 17:11 Uhr

sabines
sabines 16.09.2016 um 07:15:55 Uhr
Goto Top
Moin,

keine Ahnung von welchen SQL Versionen Du wohin importieren willst, aber mit "select into" wird die Tabelle komplett neu erstellt.
Hilft das?

Gruss
toxduebel
toxduebel 16.09.2016 um 07:33:14 Uhr
Goto Top
Guten Morgen,

ich will von einer Oracle Datenbank in einem SQL Server 2012 Express importieren. Select into greift Inhalte von Spalten ab. Ich suche aber einen alternativen Befehl für Create Table, der zunächst die vorhandene Tabelle (z.B. Artikel mit Spalte "Artnr", "Bezeichnung", usw.) in der Oracle scannt und dann die dort vorhandene Struktur erstellt.

Gruß
sabines
sabines 16.09.2016 um 07:54:22 Uhr
Goto Top
Ok,

wie wäre es mit select into und danach delete from? Kann aber sein, dass damit nicht alle Tabelleneigenschaften kopiert werden können.
Oder stehe ich auf dem Schlauch?
toxduebel
toxduebel 16.09.2016 um 08:36:16 Uhr
Goto Top
aber mit dem select into werden nicht die Eigenschaften der Spalten übertragen sondern nur die Inhalte. ich will dynamisch zuerst die Tabelle mit den Spalteneigenschaften (varchar,number usw.) erstellen lassen und danach mache ich mit dem select into die Datenübernahme.
Problem ist wenn in der Quelltabelle eine weitere Spalte hinzugefügt wurde läuft zurzeit mein Skript auf Fehler weil beim select into alles übertragen wird also mit (select * from Artikel). Davor wird aber die Tabelle auf der Ziel-DB erstellt mit den definierten Spalten mit Eigeschaften und da fehlen die neuen Spalten und dadurch läuft das Skript auf Fehler weil mit (select * from Artikel) die neu angelegten Spalten auf der Quell-DB nicht auf der Ziel-DB vorhanden sind.
Gibt es ein Create-Befehl der wie ein select * funktionieren würde der alle Spalten mit Eigenschaften anlegen könnte?
sabines
sabines 16.09.2016 um 08:50:36 Uhr
Goto Top
OK, jetzt kommt Licht.

Stell' die Frage vielleicht besser in einem reinen SQL Forum, ich könnte mir vorstellen, das über einen trigger oder eine kleine procedure zu lösen, ob das aber SQL übergreifend, also von Oracle SQL zu MS SQL funktioniert, weiß ich nicht.

Gruß
Biber
Biber 16.09.2016 aktualisiert um 09:24:26 Uhr
Goto Top
Moin toxduebel,

das wird eher nicht ohne Eigenprogrammierung gehen.
MSSQL kennt ja noch nicht einmal den Befehl CREATE neuetable LIKE andereTable, die viele andere DBMSe mitbringen.

Workaround ist nur das SELECT INTO neueTable from andereTable, das bei Bedarf eine neue Struktur anlegt und je nach WHERE-Clause eine neue leere oder mit Daten befüllte Table-Kopie anlegt.
Das geht aber nur von MSSQL-Tabellen nach MSSQL-Tabellen.

bei Importen von zB Oracle müssen ja Konvertierungen berücksichtigt werden, da unterschiedliche Datentypen/physische Eigenschaften vorliegen.

Also müstest du eigentlich erst die Struktur direkt im Oracle-Katalog abgreifen und in einem selbstgeschriebenen Stück Code definieren, wie denn ein neues TIMESTAMP(9) WITH TIMEZONE-Feld aus Oracle in einer MSSQL-Struktur repräsentiert werden soll etc.

Grüße
Biber
ice.polar
ice.polar 16.09.2016 um 14:54:59 Uhr
Goto Top
Moin moin,

Biber hat Recht: SELECT INTO neueTable from andereTable das ist die Syntax (in diese Richtung hatte sabines schon zu Beginn gedeutet).

Bedingung dabei ist, dass neueTable nicht schon existiert und es geht nur, wenn die Oracle-Datentypen bereits konvertiert in der andereTable vorliegen.
Damit kommen wir zum interessanten Teil: andereTable wird wohl eine (Oracle-) Tabelle sein aus einer (ORACLE-)Datenbank sein, die im SQL-Server mit "Linked Server" und ODBC eingebunden worden ist: damit wären diese Datenkonvertierungen bereits grössten Teils standardmässig erledigt...
...Aber vielleicht macht Dein Import-Script ja was gaaanz anderes und liest eine Textdatei, dann hast Du verloren, weil da keine Datentypen drin stehen. Verloren hast Du auch bei Strukturänderungen, in jedem Fall...
Vielleicht ist's aber ein schönes XML zusammen mit einem WSDL oder Du hast wirklich Zugriff auf den ORACLE-Katalog und kannst die Tabelle immer schön selber neu aufbauen (Biber hat's bereits gesagt!).

Aber sach mal toxduebel, wozu nächtens eine Tabelle neu erstellen und Daten aus Oracle abziehen? Eine Datenbank ist eigentlich da um Daten zu speichern, nicht um sie jedesmal auf's Neue zu verwerfen...