Probleme mit dem Lesen von nvarchar-Daten bei SSIS
Hallo Forum,
ich habe ein kleines Problem mit den SSIS.
Vorhanden ist eine Sybase-Datenbank. Aus dieser Datenbank soll eine Tabelle exportiert und in MS-SQL importiert werden.
Dafür soll von Microsoft SSIS eingesetzt werden. Die Verbindung zu beiden Datenbanken steht.
Es werden auch ohne Probleme Informationen von dem Typen INT und DateTime ex- und importiert.
Das Problem sind die Datentypen NVarchar. Der Fehler tritt hier auch schon beim exportieren auf.
Zum Exportieren verwende ich einen Data-Reader.
Ich habe bereits einen Datenkonvertierer zwischen dem Reader und dem Writer eingebaut. Leider ohne Erfolg.
Der Witz am Ganzen ist eigentlich, dass wenn ich über die gleiche Datenbankverbindung über Access einen Import mache bekomme ich eine 1 zu1 Abbildung der Tabelle in Access.
Kann mir jemand weiterhelfen?
Gruss
Michael
ich habe ein kleines Problem mit den SSIS.
Vorhanden ist eine Sybase-Datenbank. Aus dieser Datenbank soll eine Tabelle exportiert und in MS-SQL importiert werden.
Dafür soll von Microsoft SSIS eingesetzt werden. Die Verbindung zu beiden Datenbanken steht.
Es werden auch ohne Probleme Informationen von dem Typen INT und DateTime ex- und importiert.
Das Problem sind die Datentypen NVarchar. Der Fehler tritt hier auch schon beim exportieren auf.
Zum Exportieren verwende ich einen Data-Reader.
Ich habe bereits einen Datenkonvertierer zwischen dem Reader und dem Writer eingebaut. Leider ohne Erfolg.
Der Witz am Ganzen ist eigentlich, dass wenn ich über die gleiche Datenbankverbindung über Access einen Import mache bekomme ich eine 1 zu1 Abbildung der Tabelle in Access.
Kann mir jemand weiterhelfen?
Gruss
Michael
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 162911
Url: https://administrator.de/contentid/162911
Ausgedruckt am: 20.11.2024 um 01:11 Uhr
16 Kommentare
Neuester Kommentar
Eine kurze Google Suche nach 'DTS_E_INDUCEDTRANSFORMFAILUREONERROR' ergibt:
http://support.microsoft.com/kb/943655/en-us
http://connect.microsoft.com/SQLServer/feedback/details/369365/empty-nv ...
Zweiter Link verweist zwar auf eine Ingres Datenbank, aber ich vermute, daß es bei Dir auch an einem leeren nvarchar Feld liegt.
http://support.microsoft.com/kb/943655/en-us
http://connect.microsoft.com/SQLServer/feedback/details/369365/empty-nv ...
Zweiter Link verweist zwar auf eine Ingres Datenbank, aber ich vermute, daß es bei Dir auch an einem leeren nvarchar Feld liegt.
Moin mischn1980,
hast du schon mal beim sympathischen Weltmarktführer nachgelesen?
Auch falls wider Erwarten das angegebene Servicepack schon bei dir nachgerüstet sein sollte,
verwette ich das Lieblingsfusskettchen meiner Lieblingspraktikantin darauf, dass in der Sybase-Quelle das angesprochene NVarChar()-Feld NULLABLE ist.
Leg doch einen Eins-zu-Eins-View mit CHAR-Typen und fester Feldlänge an für den Export, und sei es nur, um die Fehlerursache zu verifizieren.
Grüße
Biber
[Edit] @missionimpossible
Zu deiner Antwort gerade:
Es war nicht gefragt, ob die Spalte in jedem Satz einen Wert hat, sondern ob die NULLABLE ist.
[/Edit]
hast du schon mal beim sympathischen Weltmarktführer nachgelesen?
Auch falls wider Erwarten das angegebene Servicepack schon bei dir nachgerüstet sein sollte,
verwette ich das Lieblingsfusskettchen meiner Lieblingspraktikantin darauf, dass in der Sybase-Quelle das angesprochene NVarChar()-Feld NULLABLE ist.
Leg doch einen Eins-zu-Eins-View mit CHAR-Typen und fester Feldlänge an für den Export, und sei es nur, um die Fehlerursache zu verifizieren.
Grüße
Biber
[Edit] @missionimpossible
Zu deiner Antwort gerade:
Es war nicht gefragt, ob die Spalte in jedem Satz einen Wert hat, sondern ob die NULLABLE ist.
[/Edit]
Moin mischn1980,
die Ursache dürfte nicht SQLServer2000/2005/2008-spezifisch sein, so wie ich es lese.
Sondern irgendwo in dem zusammengeschlamperten OBDC-Treiber liegen.
Und den und/oder die .NET-Versionen kannst du bestimmt auch separat aktualisieren.
P.S. Hat auch sein Gutes,wenn ich mich mit der NULLABLE-Eigenschaft geirrt habe.
Dann kann ich das Fusskettchen behalten.
Grüße
Biber
die Ursache dürfte nicht SQLServer2000/2005/2008-spezifisch sein, so wie ich es lese.
Sondern irgendwo in dem zusammengeschlamperten OBDC-Treiber liegen.
Und den und/oder die .NET-Versionen kannst du bestimmt auch separat aktualisieren.
P.S. Hat auch sein Gutes,wenn ich mich mit der NULLABLE-Eigenschaft geirrt habe.
Dann kann ich das Fusskettchen behalten.
Grüße
Biber
Moin mischn1980,
Beide laufen über den native ODBC-Treiber des Fremd-Systems (in deinem Fall den Sybase-Treiber).
SSIS allerdings ruft den auf über den halbabstrakten System.Data.ODBC managed driver, der wiederum die Intention hat
Bedeutet allerdings konkret bei NVarChar()-Feldern und wahrscheinlich auch bei Timestamp-Feldern, dass
a) die tatsächlich zum Inhalt gehörige Länge im Quellsystem XY und im Zielsystem SQLServer unterschiedlich sein kann. Weil... N[Var]Chars eben je nach Zeichensatz/Unicode/Ascii 1, 2, 3 oder 4 Byte belegen könnten
b) der Sauger, in diesem Falle SSIS muss also den Quellstring nicht in der Länge des Ziel-Feldes abholen, auch nicht mit Len(vonDemQuellString), sondern mit LenW(vonDemQuellStr).
c) und genau da scheint der Fehler zu liegen - WENN denn das NVarChar-Feld leer (=ein Leerstring), aber nicht NULL ist, dann wird offensichtlich die Sauger-Funktion mit einem Read-Befehl für das Quellfeld tätig in dem steht "Gib mir den Quellfeld-Inhalt in der Länge 0 Byte in den bereitgestellten Buffer der Länge 0"---> und da grätscht der native ODBC-Treiber ab.
Und wie ich die Redmonder PraktikantInnen einschätze werden die sagen "Okay, End-User, muttu warten, bis Sybase/mySQL/InGres/Hu-Ewwer ihre native ODBC-Driver darauf umgestellt haben, dass die auch mal einen etwas kleineren Buffer als sonst, also in Länge 0, für ihre Daten hingestellt bekommen."
--> Auf der/dem M$-Seiten stehen auch als mögliche Workarounds ein paar tipps, die darauf hinauslaufen, dass die Felder auf der ZIEL-Seite halt nicht WSTR, also NVarChar-felder sein sollten.
Ich würde zwar (siehe oben) genau anders vorgehen und die Quelle ändern, aber gehen sollte es auch.
Grüße
Biber
Zitat von @mischn1980:
Die Frage die sich mir stellt ist:
Wenn es am Treiber liegen sollte. Was macht dann Access 2010 so viel anders wie SSIS? Denn bei Access 2010 kann ich die Tabelle
mit dem gleichen Treiber auslesen und in Access2010 anlegen.
Das sollte doch dann auch nicht funktionieren. Oder?
Nicht zwangsläufig. Der SSIS hat ja noch eine künstliche Zwischenebene mehr als das relativ schlichte Access.Die Frage die sich mir stellt ist:
Wenn es am Treiber liegen sollte. Was macht dann Access 2010 so viel anders wie SSIS? Denn bei Access 2010 kann ich die Tabelle
mit dem gleichen Treiber auslesen und in Access2010 anlegen.
Das sollte doch dann auch nicht funktionieren. Oder?
Beide laufen über den native ODBC-Treiber des Fremd-Systems (in deinem Fall den Sybase-Treiber).
SSIS allerdings ruft den auf über den halbabstrakten System.Data.ODBC managed driver, der wiederum die Intention hat
"Hey, im Prinzip haben doch alle Datenbanken einen gemeinsamen kleinsten Nenner. Und auf der Ebene sprech ich mit denen."
Bedeutet allerdings konkret bei NVarChar()-Feldern und wahrscheinlich auch bei Timestamp-Feldern, dass
a) die tatsächlich zum Inhalt gehörige Länge im Quellsystem XY und im Zielsystem SQLServer unterschiedlich sein kann. Weil... N[Var]Chars eben je nach Zeichensatz/Unicode/Ascii 1, 2, 3 oder 4 Byte belegen könnten
b) der Sauger, in diesem Falle SSIS muss also den Quellstring nicht in der Länge des Ziel-Feldes abholen, auch nicht mit Len(vonDemQuellString), sondern mit LenW(vonDemQuellStr).
c) und genau da scheint der Fehler zu liegen - WENN denn das NVarChar-Feld leer (=ein Leerstring), aber nicht NULL ist, dann wird offensichtlich die Sauger-Funktion mit einem Read-Befehl für das Quellfeld tätig in dem steht "Gib mir den Quellfeld-Inhalt in der Länge 0 Byte in den bereitgestellten Buffer der Länge 0"---> und da grätscht der native ODBC-Treiber ab.
Und wie ich die Redmonder PraktikantInnen einschätze werden die sagen "Okay, End-User, muttu warten, bis Sybase/mySQL/InGres/Hu-Ewwer ihre native ODBC-Driver darauf umgestellt haben, dass die auch mal einen etwas kleineren Buffer als sonst, also in Länge 0, für ihre Daten hingestellt bekommen."
--> Auf der/dem M$-Seiten stehen auch als mögliche Workarounds ein paar tipps, die darauf hinauslaufen, dass die Felder auf der ZIEL-Seite halt nicht WSTR, also NVarChar-felder sein sollten.
Ich würde zwar (siehe oben) genau anders vorgehen und die Quelle ändern, aber gehen sollte es auch.
Grüße
Biber