Einzelnen Beitrag anzeigen

Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
313 Beiträge
 
Delphi 12 Athens
 
#1

SQL-Server BulkCopy bzw. IRowsetFastLoad aus TDataSet - extrem schnell

  Alt 1. Nov 2021, 13:28
Datenbank: MS SQL-Server • Version: ab 2012 • Zugriff über: ADO/OLE DB
Mit der Funktion kann ich 1 Mio. Datensätze in weniger als 2 Sekunden!!! aus einem beliebigen DataSet (bei mir einfach ein TClientDataSet) in eine gleich strukturierte SQL-Server-Tabelle kopieren. Meine Beispieltabellen hatten allerdings auch nur 3 Spalten - aber immerhin.

Den Quellcode dazu habe ich hier gefunden. Ganz unten auf der Seite gibts auch einen Link zu GitHub. Wenn man die .pas-Datei einbindet, kann man einfach die folgende Prozedur benutzen - und fertig. Das Quell-Dataset muss vorher nur auf dem 1. Datensatz stehen:

procedure BulkCopy(Dataset: TDataSet; Connection: TADOConnection; const DstTableName: string);

Falls jemand Interesse hat, habe ich auch eine Version gefunden, mit der die Insert-Trigger auf dem SQL-Server ausgelöst werden.

Jetzt aber zu meinem Problem: Für den Kopiervorgang werden automatisch immer neue Verbindungen zum SQL-Server erstellt. Diese neuen Verbindungen haben für meinen Verwendungszweck jedoch zwei entscheidende Nachteile:
  1. Die Daten können nicht in einfache temporäre Tabellen #TableXYZ kopiert werden, da diese in der neuen Verbindung nicht verfügbar sind.
  2. Wenn die Insert-Berechtigung aus einer SQL-AppRole kommt, ist diese AppRole in der neuen Verbindung nicht gesetzt.
Für die SSIS gibt es den Verbindungsparameter "RetainSameConnection = TRUE". Damit wären meine Probleme gelöst. Leider habe ich keine Ahnung, wie ich das der neuen Verbindung beibringen soll.

Geändert von Papaschlumpf73 ( 1. Nov 2021 um 13:40 Uhr)
  Mit Zitat antworten Zitat