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:
- Die Daten können nicht in einfache temporäre Tabellen #TableXYZ kopiert werden, da diese in der neuen Verbindung nicht verfügbar sind.
- 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.