Ausführen von x86 Paket unter x64

Wer mit den Integration Services auf einem 64 Bit System arbeiten möchte, hat einiges bei zu beachten und am besten direkt im voraus zu klären, wie z.B:  “Existiert ein 64 Bit Treiber für meine Quelldatenbank?”…und “Funktioniert dieser auch wirklich wie vom Hersteller angegeben?”

Grundlegende Informationen zu Paketen auf einem x64 System sind in einem sehr guten Blog Eintrag von Douglas Laudenschlager (dougbert.com) zu finden.

Wen man nun auf einem x64 System mit 32 Bit Treibern/Systemen hantieren muss, so haben sich zwei einfache Schritte dafür sehr gut bewährt.

In einem ersten Schritt definieren ich einen Datenfluss, der die Daten aus meiner 32 Bit Quelle lädt und danach direkt in eine Rohdatendatei schreibt. Für die ADO-NET Quelle, die ich in diesem Beispiel verwende, wird über die Expressions der ConnetcionString vollständig mit Variablen definiert.

Hier im Beispiel ein Connection String für eine .NET Verbindung zu einem Advantage Database Server:

"Data Source=" + @[User::DataSource] + ";Initial Catalog=" + @[User::InitialCatalog] + ";ServerType=" + @[User::ServerType] + ";ShowDeleted=" + @[User::ShowDeleted] + ";CharType=" + @[User::CharType] + ";FilterOptions=" + @[User::FilterOptions] + ";LockMode=" + @[User::LockMode] + ";SecurityMode=" + @[User::SecurityMode] + ";TableType=" + @[User::TableType] + ";TrimTrailingSpaces=" + @[User::TrimTrailingSpaces] + ";ReadOnly=" + @[User::ReadOnly] + ";Compression=" + @[User::Compression] + ";CommType=" + @[User::CommType] + ";"

Um das Paket im BIDS auf dem x64 Server testen zu können, werden alle Pakete, die unter 32 Bit laufen müssen, in einer eigene Projektmappe abgespeichert. Über die Eigenschaften der Projektmappe wird dann definiert, dass diese während des Debuggen nicht die 64 Bit Runtime verwenden sollen.

image_thumb2

Verwirrend an dieser Stelle Stelle ist, dass die Vorschau der Datenquelle auch ohne diese Änderungen funktioniert, das Paket beim Debuggen dann aber direkt mit z. B. der Fehlermeldung “DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER” fehlschlägt.

Um die eigentliche Verarbeitung der Daten nun innerhalb der 64 Bit Umgebung ausführen zu lassen, erstelle ich ein neues Paket, in dem ich das 32 Bit Paket über den Task “Prozess ausführen” starte. Hierbei gebe ich als Executable das Programm DTExec.exe aus dem entsprechenden x86 Verzeichnis des SQL Servers an:

C:Program Files (x86)Microsoft SQL Server100DTSBinnDTExec.exe

Das auszuführende Paket wird über die Argumente gesetzt, welche ich wieder über die Expressions definiere.

image_thumb7

Über die Expressions können alle Variablen meines 32 Bit Pakets mit dem Parameter /Set gesetzt werden, so dass ich das Paket aus meinem 64 Bit Paket heraus vollständig konfigurieren kann. Mehrere Variablen können werden weiteren /set Parameter angegeben.

"/F "" + @[User::Package32] + ""  /set \package.variables[DataSource].Value;" +  @[User::DataSource]  + " /set \package.variables[InitialCatalog].Value;" +   @[User::InitialCatalog] + " /set \package.variables[ServerType].Value;" +   @[User::ServerType] + " /set \package.variables[ShowDeleted].Value;" + @[User::ShowDeleted] + " /set \package.variables[CharType].Value;" +   @[User::CharType] + " /set \package.variables[FilterOptions].Value;" + @[User::FilterOptions] + " /set \package.variables[LockMode].Value;" + @[User::LockMode] + " /set \package.variables[SecurityMode].Value;" + @[User::SecurityMode] + " /set \package.variables[TableType].Value;" + @[User::TableType] + " /set \package.variables[TrimTrailingSpaces].Value;" + @[User::TrimTrailingSpaces] + " /set \package.variables[ReadOnly].Value;" + @[User::ReadOnly]+ " /set \package.variables[Compression].Value;" + @[User::Compression] " /set \package.variables[CommType].Value;" + @[User::CommType] + " /l DTS.LogProviderTextFile;LOG.txt"

Da ich in beiden Paketen die identischen Namen für meine Variablen verwenden, sind die im Text rot markierten Variablen dem 32 Bit Paket, die grün gekennzeichnet sind die entsprechenden Variablen aus meinem 64 Bit Paket.

Ein vollständige Auflistung der Parameter des dtexec Utilities ist hier zu finden

http://msdn.microsoft.com/en-us/library/ms162810.aspx

Für das Logging ist noch zu beachten, dass das in den BOL angegebene Beispiel

dtexec /f "c:pkgOne.dtsx" /l "DTS.LogProviderTextFile;c:log.txt"

ein bisschen verwirren kann. Mit c:log.txt ist in diesem Fall nicht der Pfad zu einer Datei gemeint, sondern der Name des Verbindungsmanagers.

Die 64 Bit Version bietet im übrigen einen Parameter /x86 der ein Paket im 32 Bit Modus laufen lassen kann. Diese Einstellung wird jedoch nur vom SQL Server Agent verwendet und steht über den Konsolenaufruf nicht zur Verfügung.