mischn1980
Goto Top

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

Content-ID: 162911

Url: https://administrator.de/contentid/162911

Ausgedruckt am: 20.11.2024 um 01:11 Uhr

AndreasHoster
AndreasHoster 18.03.2011 um 10:28:18 Uhr
Goto Top
Der Fehler tritt hier auch schon beim exportieren auf.
Ist ja schön, daß es dabei auch nur genau ein einziger, eindeutiger Fehler auftreten kann und der so allgemein bekannt ist, daß ihn jeder kennt.

Also, was für ein Fehler tritt auf? Log-Einträge könnten da auch ganz hilfreich sein.
mischn1980
mischn1980 18.03.2011 um 10:36:05 Uhr
Goto Top
Hi,

mit Log-Einträgen kann ich leider nicht dienen.

Es wird das Programm gestartet. Der Data-Reader fängt an zu lesen und bricht sofort ab. Ich bekomme keine Fehlermeldung und keinen sinnvollen Eintrag ins Systemlogbuch.
Der Eintrag der gemacht wird ist:

Fehler beim Paket 'XYZ'.
Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.

Also nicht wirklich hilfreich.

Gruss

Michael
AndreasHoster
AndreasHoster 18.03.2011 um 11:01:00 Uhr
Goto Top
Das ist wirklich nicht sonderlich hilfreich.
Da bleibt wohl nur die im Moment neblige Kristallkugel übrig.
Mal so ins Blaue geraten:
Möglicherweise ist das Zielfeld nicht groß genug? Weil möglicherweise die Erkennung ob Unicode oder nicht nicht richtig tut?
mischn1980
mischn1980 18.03.2011 um 11:03:19 Uhr
Goto Top
Das Zielfeld hat wie die Quelle als Größe 20 eingestellt.
Habe eben auch mal das Zielfeld auf nvarchar(max) umgestellt. Leider ohne Erfolg.
mischn1980
mischn1980 18.03.2011 um 11:08:44 Uhr
Goto Top
So jetzt habe ich doch noch eine weitere Information gefunden die vielleicht helfen kann.

Warnung: 0x800470C8 bei Datenflusstask, OLE DB-Ziel [18740]: Die externe Metadatenspaltenauflistung ist nicht mit den Datenquellspalten synchronisiert. DieXYZ-Spalte muss in der externen Metadatenspaltenauflistung aktualisiert werden.

Fehler: 0xC0209029 bei Datenflusstask, DataReader-Quelle [20347]: SSIS-Fehlercode 'DTS_E_INDUCEDTRANSFORMFAILUREONERROR'. Fehler bei 'Komponente 'DataReader-Quelle' (20347)' aufgrund des Fehlercodes 0x80131937, und die Fehlerzeilendisposition in 'Ausgabespalte 'XYZ' (25229)' gibt an, dass bei einem Fehler der Vorgang fehlschlägt. Im angegebenen Objekt in der angegebenen Komponente ist ein Fehler aufgetreten. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.
Fehler: 0xC02090F5 bei Datenflusstask, DataReader-Quelle [20347]: 'Komponente 'DataReader-Quelle' (20347)' konnte die Daten nicht verarbeiten.
Fehler: 0xC0047038 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_PRIMEOUTPUTFAILED'. Die PrimeOutput-Methode in 'Komponente 'DataReader-Quelle' (20347)' hat den Fehlercode 0xC02090F5 zurückgegeben. Die Komponente gab einen Fehlercode zurück, als das Pipelinemodul 'PrimeOutput()' aufgerufen hat. Die Bedeutung des Fehlercodes wird von der Komponente definiert. Der Fehler ist jedoch schwerwiegend, und die Ausführung der Pipeline wurde beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.
Fehler: 0xC0047021 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADFAILED'. Der Thread 'SourceThread0' wurde mit dem Fehlercode 0xC0047038 beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Beenden des Threads beinhalten.
Fehler: 0xC0047039 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADCANCELLED'. Der Thread 'WorkThread0' hat ein Signal zum Herunterfahren erhalten und wird beendet. Der Benutzer hat das Herunterfahren angefordert, oder ein Fehler in einem anderen Thread hat dazu geführt, dass die Pipeline heruntergefahren wird. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Abbruch des Threads beinhalten.
Fehler: 0xC0047021 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADFAILED'. Der Thread 'WorkThread0' wurde mit dem Fehlercode 0xC0047039 beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Beenden des Threads beinhalten.

Hilft das weiter? Mir pers. im Moment leider nicht wirklich!
AndreasHoster
AndreasHoster 18.03.2011 um 11:55:13 Uhr
Goto Top
Klingt fast so, als ob sich die Spaltenstruktur geändert hat, seitdem das Transformationspaket erstellt wurde.
Könnte das sein?
mischn1980
mischn1980 18.03.2011 um 12:00:10 Uhr
Goto Top
Nein die Splatenstruktur ist nicht geändert.

Die obere Warung konnte ich inzwischen beheben.

Die restlichen Fehler sind weiterhin vorhanden.
mischn1980
mischn1980 18.03.2011 um 13:53:28 Uhr
Goto Top
Habe als Ziel jetzt mal versucht eine Text-Datei anzugeben.

Dabei bekomme ich dann folgenden Fehler:

Fehler: 0xC0209029 bei Datenflusstask, DataReader-Quelle [20347]: SSIS-Fehlercode 'DTS_E_INDUCEDTRANSFORMFAILUREONERROR'. Fehler bei 'Komponente 'DataReader-Quelle' (20347)' aufgrund des Fehlercodes 0x80131937, und die Fehlerzeilendisposition in 'Ausgabespalte 'XYZ'(25376)' gibt an, dass bei einem Fehler der Vorgang fehlschlägt. Im angegebenen Objekt in der angegebenen Komponente ist ein Fehler aufgetreten. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.
Fehler: 0xC02090F5 bei Datenflusstask, DataReader-Quelle [20347]: 'Komponente 'DataReader-Quelle' (20347)' konnte die Daten nicht verarbeiten.
Fehler: 0xC0047038 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_PRIMEOUTPUTFAILED'. Die PrimeOutput-Methode in 'Komponente 'DataReader-Quelle' (20347)' hat den Fehlercode 0xC02090F5 zurückgegeben. Die Komponente gab einen Fehlercode zurück, als das Pipelinemodul 'PrimeOutput()' aufgerufen hat. Die Bedeutung des Fehlercodes wird von der Komponente definiert. Der Fehler ist jedoch schwerwiegend, und die Ausführung der Pipeline wurde beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.
Fehler: 0xC0047021 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADFAILED'. Der Thread 'SourceThread0' wurde mit dem Fehlercode 0xC0047038 beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Beenden des Threads beinhalten.
Fehler: 0xC0047039 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADCANCELLED'. Der Thread 'WorkThread0' hat ein Signal zum Herunterfahren erhalten und wird beendet. Der Benutzer hat das Herunterfahren angefordert, oder ein Fehler in einem anderen Thread hat dazu geführt, dass die Pipeline heruntergefahren wird. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Abbruch des Threads beinhalten.
Fehler: 0xC0047021 bei Datenflusstask: SSIS-Fehlercode 'DTS_E_THREADFAILED'. Der Thread 'WorkThread0' wurde mit dem Fehlercode 0xC0047039 beendet. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Informationen zum Beenden des Threads beinhalten.
AndreasHoster
AndreasHoster 18.03.2011 um 14:04:41 Uhr
Goto Top
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.
Biber
Biber 18.03.2011 um 14:13:21 Uhr
Goto Top
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]
mischn1980
mischn1980 18.03.2011 um 14:17:15 Uhr
Goto Top
Leider muss ich dir Wiedersprechen.

Die Spalte mit dem nvarchar, die ich versuche zu importiern hat in jeder Zeile einen Wert eingetragen.
Habe extra eben nochmal die Spalte geprüft.
mischn1980
mischn1980 18.03.2011 um 14:21:40 Uhr
Goto Top
Hallo Biber,

auch dich muss ich leider enttäuschen.

Das Feld in der Sybase-Quelle ist nicht NULLABLE.

Bei meinem SQL handelt es sich leider auch noch um einen MS-SQL 2000.

Gruss

Michael

[Edit]
Ohne Worte
[/Edit]
Biber
Biber 18.03.2011 um 14:30:44 Uhr
Goto Top
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
mischn1980
mischn1980 18.03.2011 um 15:05:11 Uhr
Goto Top
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?
Biber
Biber 18.03.2011 um 15:49:06 Uhr
Goto Top
Moin mischn1980,

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.
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
mischn1980
mischn1980 21.03.2011 um 12:41:55 Uhr
Goto Top
Hallo Leute,

das Problem ist gelöst.

Hier ist der Link mit der Lösung.

Lösung

Danke für Eure Hilfe.

Gruss

Michael