Vermeiden der Abrufmethode "Zeile für Zeile" beim Umgang mit Quell-LOB-Spalten


12

Ich habe eine ältere PostgreSQL-Datenbankquelle (ODBC), die ich mithilfe von SSIS auf ein neues SQL Server-Schema migrieren möchte. Ich erhalte eine Warnung mit den Worten:

Die Abrufmethode 'Zeile für Zeile' wird erzwungen, da die Tabelle LOB-Spalten enthält. Der Spalteninhalt ist LOB

Die Sache ist, keines der Spalte wirklich brauchen LOBs zu sein. Es gibt einige TEXT-Typen, die jedoch problemlos in einen Varchar (max) passen. Noch seltsamer, aber die meisten schon sind Varchars, aber es etwas über varchar scheint (128) behandelt wird , als ob es ein LOB war (im Voraus Eigenschaften, ist der Datentyp DT_NTEXT).

Ich habe versucht, einen manuellen SQL-Befehl auszuführen, bei dem ich jeden Zeichenfolgentyp explizit in einen varchar mit einer geeigneten Länge in der select-Anweisung umgewandelt habe und sie in der ODBC-Quelle immer noch als DT_NTEXT festgelegt sind.

Ich bin kein DBA, also ist es durchaus möglich, dass ich etwas wirklich Dummes mache. Ich möchte nur wissen, wie ich am besten sicherstellen kann, dass die Typen als Varchare enden, damit ich sie abrufen kann. Irgendwelche Ideen?

Falls es wichtig ist, verwende ich SSIS-BI 2014 in Visual Studio 2013.


3
Wenn Sie sie explizit im Quellsystem auf eine nicht maximale Größe umwandeln, war das in einem vorhandenen Datenfluss oder haben Sie eine neue oder zumindest eine neue Quellkomponente dafür erstellt? Wenn Sie eine Abfrage mit denselben Spaltennamen und nur dünneren Typen versehen, wird dies manchmal nicht als Änderung registriert, sodass der Editor keinen Metadatenerfassungsprozess auslöst (was teuer sein kann). Außerdem wird ein Varchar (max) als LOB für einen SSIS-Datenfluss behandelt, was agilebi.com/jwelch/2010/05/11/…
billinkc

In der ODBC-Datenquellenkomponente haben Sie die Möglichkeit, eine Tabelle auszuwählen oder eine Abfrage zu verwenden. Dort mache ich das Casting: in einer benutzerdefinierten Abfrage. Ich erwähnte varchar(max)nur als Abkürzung, dass die Spaltendaten für SSIS-Zwecke in die maximale Varchar-Größe passen, die bei etwa 4000 liegt, denke ich. Ich besetze eigentlich nichts varchar(max); Allerdings habe ich einige Kolumnen gegossen varchar(4000), nur um sicher zu gehen.
Chris Pratt

Antworten:


3

Anscheinend läuft dies nur darauf hinaus, dass SSIS jeden Varchar, der größer als 128 ist, als NTEXT behandelt. Nicht sicher warum. Ich kann jedoch in die erweiterten Eigenschaften der ODBC-Quelle gehen und die Typen wieder in DT_WSTR ändern. Welches scheint zum größten Teil zu funktionieren.

Ich habe jedoch festgestellt, dass einige der Tabellen, mit denen ich mich befasse, in einigen ihrer TEXT-Spalten tatsächlich mehr als 4000 Byte enthalten. Daher muss ich diese Spalten leider als DT_NTEXT belassen, um ein Abschneiden zu verhindern (SSIS lässt dies nicht zu Sie setzen einen DT_WSTR-Typ mit mehr als 4000 Bytes. Ich nehme an, in diesen Fällen bin ich nur beim zeilenweisen Abrufen festgefahren, aber zumindest konnte ich ein paar Tabellen reparieren.


3

Ich habe die Datenkonvertierung für den varchar größer als 128 als NTEXT verwendet, aber was den Fehler für mich letztendlich beseitigt hat, ist die Einstellung Externe Daten validieren auf Falsch gesetzt.


0

Diese Lösung hat bei mir funktioniert:

Ich habe den Fehler behoben, indem ich den Parameter Max Varchar in der Datenquelleneigenschaft geändert habe. Gehen Sie zum Verbindungsmanager. Wählen Sie die Erstellungsoption neben der Verbindungszeichenfolge aus. Klicken Sie auf die Verbindungsschaltfläche, um auf weitere Optionen zuzugreifen. Ändern Sie den Wert des Max Varchar.

Geben Sie hier die Bildbeschreibung ein


0

In meinem Fall ist die Quelle Filemaker ODBC, die auch Langtext als LOB-Datentyp behandelt. Mein Paket blieb lange Zeit hängen, da die Leistung für die zeilenweise Abrufmethode extrem abgenommen hat, da die Tabelle LOB-Spalten enthält. Während der Bereitstellung trat daher nach langer Zeit eine Zeitüberschreitung auf, die schließlich fehlschlug.

Ich teile die eigentliche Lösung, die für mich wie ein Zauber funktioniert hat. Ein Tag mit einem Datenabruf vom Typ über 30.000 LOB dauerte für mich ca. 10 Minuten ::

Verringern Sie die DefaultBufferMaxRows auf 1 und erhöhen Sie DefaultBufferSize auf maximal 100 MB. Ändern Sie dann den ODBC-DSN der Quelle, indem Sie die Option "Text als langen Varchar behandeln" aktivieren. Und ordnen Sie die Datentypen von Quelle zu Ziel zu (ohne Änderung des erweiterten Editors in der Quelle).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.