by Admin
5. November 2009 21:25
Die Union Transformation in einem SSIS-Datenfluss (SQL Server 2005 und SQL Server 2008) erkennt automatisch, wenn sich die Metadaten des Datenflusses ändern. Nur leider gibt es keinen Weg diese wie bei allen anderen Elementen automatisch mit der Datenquelle zu synchronisieren. Siehe [hier]
Hier stelle ich einen kleinen Workaround vor:
Folgendes Beispiel: Aus zwei Datenquellen sollen Daten zusammengeführt werden. Im Beispiel sind das einfach zwei Select-Statements auf eine Datenbank. Dies funktioniert so lang, wie sich die Tabellenstruktur nicht ändert. Wird beispielsweise eine VARCHAR-Spalte in der Länge geändert gibt das folgendes Bild:
Bei Öffnen der OLE-DB Source wird erkannt, dass sich die Tabelle geändert hat und mit Bestätigung werden die Metadaten auch aktualisiert, doch dann passiert folgendes:
…und bei Ausführung des Paketes gibt es die Fehlermeldung (Anmerkung: Ich habe die Spalte Strasse von VARCHAR(500) auf VARCHAR(600) geändert):
Ein Workaround wäre jetzt das UNION ALL zu löschen und neu zu erstellen, nur “meckern” dann alle nachfolgenden Datenflusselemente. =Schlecht!
Viel besser in den Griff bekommt man das Problem, indem man die Metadaten einfach von Hand ändert. Also Rechtsklick auf das Paket und “View Code” - das zugrundeliegende XML-File öffnet sich. Danach per Textsuche nach dem Union all Element (in meinem Fall heißt das einfach Union All) suchen. Dort im XML File folgen sämtliche Input-Spalten aus allen Elementen davor (im Tag <inputs>). Danach kommt der interessante Teil, die <outputs>.
<outputColumn id="175" name="Strasse" description="" lineageId="175" precision="0" scale="0" length="500" dataType="str" codePage="1252" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed" externalMetadataColumnId="0" mappedColumnId="0"/>
Hier am Beispiel meine “Strasse” Spalte. Dort steht bei length noch der falsche alte Wert. Diesen kann man einfach durch den richtigen (hier 600) austauschen, speichern, das Paket wieder öffnen und voilá, das Paket funktioniert wieder. Auch alle nachfolgenden Elemente bekommen diese Änderung mit.