none
Daten in linked Server (DB2) einfügen und dabei eine DB2 Sequenz nutzen RRS feed

  • Frage

  • Hallo zusammen,

    ich stehe vor folgender Herausforderung: Ich möchte Daten in eine DB2 Tabelle (linked Server) einfügen und muss dabei aber auch eine Sequenz nutzen die auf dem DB2 Server liegt. Jeder Datensatz benötigt einen eigenen Wert aus dieser Sequenz.

    Gibt es einen einfacheren Weg als diese Datensätze Zeile für Zeile einzufügen und sich vorher den aktuellen Wert aus dieser Sequenz zu speichern?

    Bei einem "INSERT INTO ... SELECT FROM ..." kann ich diese Sequenz nicht korrekt übergeben.

    Gruß

    Freitag, 11. Oktober 2019 07:37

Antworten

Alle Antworten

  • Das ist korrekt. Hierfür benötigst du vorher einen "select Next Value for" um diesen dann erhaltenen Wert an den Insert weiter zu geben:
    https://docs.microsoft.com/de-de/sql/t-sql/functions/next-value-for-transact-sql?view=sql-server-2017
    Freitag, 11. Oktober 2019 08:29
  • Danke für die Antwort. Ich glaube ich habe mich nicht deutlich genug ausgedrückt. Ich muss die Sequenz vom DB2 Server nutzen. Wenn ich in der DB2 Datenbank ein Insert machen würde wäre die Syntax etwa

    Insert into ... values (... SCHEMA.SEQUENZNAME.NEXTVAL ...). Ich weiss nur nicht wie ich das, außer z.B. in einem EXECUTE übergeben kann. Dort klappt es aber auch nur Zeilenweise.

    Freitag, 11. Oktober 2019 08:38
  • Das ist der Fluch der Sequenz und auch der SQL-Optimierungen, dass bestimmte Aktionen nur per SQL-Kommando und nicht per SQL-Zeile aufgerufen werden.
    Da dein Ziel aber die DB2 ist, könntest du die Spalte ja als Identity definieren. Dann lässt du die Spalte beim Insert weg und die DB vergibt den nächsten Wert.
    Ist die Spalte keine Identity, dann sollte hier ein "Before-Insert"-Trigger erstellt werden (bei DB2 geht das), der die Sequenz dann vergibt.
    Ein weiteres Problem ist, dass die SQL-Serversyntax mit vielen DB's nicht kompatibel ist und somt für Linked Server nur per Native-SQL's via OPENQUERY für Abfragen oder eben EXECUTE für alles andere benötigt wird.
    Ich scheitere auch immer wieder daran, dass SQL-Server immer noch nur mit "[Name]" auf Felder zugreifen will obwohl schon lange Anführungszeichen zum SQL-Standard gehören.
    Somit sind Bulk-Operationen wie "insert into server.database.schema.table select ..." halt immer noch nicht möglich.
    Freitag, 11. Oktober 2019 09:12
  • Ich unterliege leider noch einigen Restriktionen. Mehr als SELECT und INSERT ist nicht möglich.

    Meine Frage lautet, etwas vereinfacht ausgedrückt, wie kann ich ihm sagen dass ich eine Sequenz ansprechen will und nicht einen Wert übermitteln.

    Freitag, 11. Oktober 2019 10:55
  • Das ist leider das Resultat der Unterschiede von Sequenz und Identity-Wert. Siehe hierzu auch: Difference between Identity & Sequence in SQL Server

    Auch wenn es in dem Artikel wieder um SQL Server geht, so ist das Thema Sequenzen auf den anderen Plattformen eigentlich identisch gelöst.

    Idealerweise könntest Du eine Stored Procedure aufrufen, eine Zeile übergeben und die macht dann den Insert. Da Du das nicht darfst, wirst Du wohl den Round-Trip zweimal machen müssen und für jede Zeile einen neuen Wert für die Sequenz ermitteln müssen.


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Freitag, 11. Oktober 2019 13:49
  • Sequence funktionert beim Insert genauso einfach und kann per Execute aufgerufen werden:

    insert into Table (id, F1) values( next value for sequence, 'f1')

    https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_sequencereference.html

    Freitag, 11. Oktober 2019 15:09