SSIS excel-Ziel, wie Kraft LongText?
Ich bin mit SSIS, um die Datenmigration durchzuführen.
Verwende ich eine Excel-Ziel-Datei zur Ausgabe alles, was falsch läuft.
In dieser Excel-Datei möchte ich die Ausgabe der beiden Spalte Fehler (Fehlernummer und Fehler-Spalte) und auch alle Spalten aus meiner input-Komponente.
Dies ist fast arbeiten, außer wenn ich die Zeichenfolge-Spalten mit mehr als 255 Zeichen. Wenn ich meine Excel-Ziel, erstelle ich eine neue Tabelle.
Die Create Table-Anweisung definiert Longtext richtig, wie der Datentyp :
CREATE TABLE `My data` (
`ErrorCode` Long,
`ErrorColumn` Long,
`ID` Long,
`MyStringColumn` LongText
)
Diese Werke das erste mal. Dann Entferne ich alle Daten aus der Excel-Datei, weil ich will zum bereinigen der excel-Datei vor bestens-Fehler.
Wenn ich zurück in die Paket-designer, mein Spalten-Definitionen Durcheinander. Alle text-Spalten behandelt, als nvarchar(255), und nicht mehr ntext. Das bricht meine Komponente als meine Daten von mehr als 255.
Wie kann ich die korrekte Verwaltung von excel-Zielen ?
thx
[Bearbeiten], Da ich nicht sicher bin ob meine interpretation, hier ist die Fehler Meldung wenn ich den task ausführen :
Error: 0xC0202009 at MyDataTask, To Errors file [294]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E21.
Error: 0xC0202025 at MyDataTask, To Errors file [294]: Cannot create an OLE DB accessor. Verify that the column metadata is valid.
Error: 0xC004701A at MyDataTask, SSIS.Pipeline: component "To Errors file" (294) failed the pre-execute phase and returned error code 0xC0202025.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In SSIS-Pakete, die beinhalten Excel-Ziel, benutzt habe ich eine Excel-Vorlage-Datei-format-Strategie zu überwinden, die Fehler, die Sie auftreten.
Hier ist ein Beispiel, das zeigt zunächst, wie simulieren Sie Ihre Fehlermeldung und zeigt dann, wie um es zu beheben. Das Beispiel verwendet SSIS 2008 R2 mit Excel 97-2003.
Simulation
Erstellt eine einfache Tabelle mit zwei Feldern
Id
undDescription
. Gefüllt ist die Tabelle mit einigen Datensätzen.Erstellt ein SSIS-Paket mit single-Daten-Fluss-Vorgang und die Daten-Fluss-Vorgang konfiguriert wurde, wie unten gezeigt. Es ist im Grunde liest die Daten aus der oben genannten SQL-Server-Tabelle und versucht dann konvertieren Sie die Spalte Beschreibung, um Unicode-text mit Zeichen-Länge auf 20 festgelegt.
Da der Tisch hat zwei Zeilen, die Spalte "Beschreibung" Werte von mehr als 20 Zeichen Länge, die Standard-Fehler-Konfiguration festlegen, die auf der transformation für Datenkonvertierung scheitern würde das Paket. Allerdings müssen wir umleiten, alle Fehler-Zeilen. Also der Fehler-Konfiguration auf die Daten-Konvertierungs-task geändert werden, wie unten dargestellt, um die Umleitung der error Zeilen.
Dann habe ich umgeleitet, die Fehlerausgabe in ein Excel-Ziel, das konfiguriert ist, speichern Sie die Ausgabe in eine Datei in dem Pfad
C:\temp\Errors.xls
. Erste Ausführung des Pakets erfolgreich sein würde, weil die Excel-Datei ist zu Beginn leer.Die Datei enthält sowohl die Zeilen aus der Tabelle, denn beide hätten festgestellt das abschneiden der Fehler und damit die Weiterleitung auf die error-Ausgabe.
Nach dem löschen der Inhalte in der Excel-Datei ohne änderung der Spaltenüberschrift, wenn wir das Paket auszuführen, wieder wird es scheitern.
Ursache für den Ausfall wäre aufgrund der Fehlermeldungen unten dargestellt.
Abschluss der simulation der Fehler in der Frage genannten. Und hier ist eine Möglichkeit, wie das Problem behoben werden konnte.
Mögliche Lösung
Löschen Sie die vorhandene Excel-Datei Ziel, zu dem die Fehlerausgabe umgeleitet. Erstellen Sie eine neue Excel-Verbindungs-manager mit dem Pfad
C:\temp\Template.xls
. Setzen Sie eine neue Excel-Ziel und zeigen Sie es auf die neue Excel-Verbindungs-manager und erstellen Sie auch das Blatt in die neue Excel-Datei mit der Neu-Schaltfläche auf der Excel-Ziel.Erstellen Paket zwei Variablen namens
TemplatePath
undActualPath
. TemplatePath, sollte der WertC:\temp\Template.xls
und die ActualPath, sollte der WertC:\temp\Errors.xls
. der tatsächliche Pfad ist der Pfad, wo die Datei erstellt werden.Rechten Maustaste auf die Excel-Verbindungs-Manager, und legen Sie die
DelayValidation
Eigenschaft False und legen Sie dieServerName
Ausdruck der Variablen @[Benutzer::ActualPath]. DelayValidation wird, stellen Sie sicher, dass das Paket nicht werfen Fehler, die während der design-Zeit, wenn die DateiC:\temp\Errors.xls
existiert nicht. Einstellung der ServerName Ausdruck wird sichergestellt, dass das Paket den Pfad der Datei erwähnt, in der variable ActualPath um die Datei zu generieren.Auf die Registerkarte Ablaufsteuerung, legen Sie eine Datei System-Task über den Daten-Fluss-Vorgang.
Konfigurieren Sie die Datei System-Task, wie unten gezeigt. So, die Datei System-Task kopiert die Vorlage-Datei
C:\temp\Template.xls
und es wird ein neues Ziel-DateiC:\temp\Errors.xls
jedes mal, wenn das Paket ausgeführt wird. Wenn die DateiC:\temp\Errors.xls
bereits existiert, dann wird der Task Dateisystem einfach die Datei überschreiben, wenn dieOverwriteDestination
- Eigenschaft in der Datei System Aufgabe festgelegt, Wahr.Nun, können Sie weiterhin das Paket eine beliebige Anzahl von Zeiten. Das Paket wird nicht scheitern, und auch Sie haben nur die Fehler-Meldungen der letzten Ausführung ohne manuell deaktivieren Sie die Excel-Datei Inhalte.
Hoffe, das hilft.
[Bearbeiten] Hinzugefügt von Steve B. zu bieten, ein bisschen mehr details direkt in der post da zu lang für einen Kommentar
In meine Lösung, die ich in meinem SSIS-Projekt Schlepptau Excel-Dateien:
Errors_Design_Template.xls
undErrors_Template.xls'. The former file contains my sheets with the headers and one line of data (using formulas like
=Rept("A",1024)` für input-Spalten mit Länge 1024 max), letzteres ist genau das gleiche, ohne die erste Zeile der Daten.Beide Dateien kopiert werden, die beim start des Paket von mein source-Verzeichnis temp-Verzeichnis. Ich habe zwei Dateien, weil ich will, dass die design-time validation, und ich werde zeigen auf die Kopie der Vorlage-Datei in die Excel-Anbindung. Ich bin duplizieren Sie die Vorlage-Datei auch, denn ich bin oft die Ausführung eines einzelnen Daten-Fluss-Vorgang von mein Paket, und ich will die Auffüllen, dass eine temp-Datei, nicht in der Vorlage-Datei in mein Projekt (das muss leer bleiben, aber die überschriften und die ersten dummy-Zeile mit Daten).
Ich habe auch zwei Variablen, eine für die Verwendung in Excel-Verbindungs-expression, eine für den eigentlichen output-Datei. Ich hatte auch ein Skript schreiben, dass meine beiden Variablen als input. ActualFilePath Lesen/schreiben. Kopiert das Skript zur Laufzeit der Wert der ActualFilePath der ErrorFilePath variable. (Ich habe nicht den source-code jetzt durch, aber ich kann fügen Sie es nächste Woche wenn es hilft).
Verwenden Sie diese Komponente zusammen, die mir ermöglicht haben, die Excel-Verbindung zeigt auf der design-Datei, die Sie beim entwerfen, und auf den tatsächlichen Fehler-Datei zur Laufzeit, ohne die delayvalidation zu wahren.
eher für eine 'task ausführen' in der Ablaufsteuerung.Im execute-task-geben Sie die Verbindung zu excel-Verbindungs-manager.In der SQL-Anweisung drop der excel-Tabelle, die erstellt werden, während die Blatt-Erstellung in excel-Ziel. nach drop erstellen, die dieselbe Tabelle.daher das nächste mal die Daten eingefügt werden, in excel-Tabelle.