Das neue Paketformat in SSIS 2012

23. August 2012

SQL Server Integration Services 2012 bringt mit vielen anderen neuen Features auch ein neues XML-Format für SSIS-Pakete. Das mag auf den ersten Blick nicht so wichtig erscheinen, aber spätestens beim Thema “Parallele Entwicklung/Branching von SSIS-Projekten” hat das wenig lesbare Paketformat in SSIS 2005/2008 die Arbeit eines ETL-Entwicklers deutlich schwieriger gemacht.

Wenn man folgende zwei Definitionen von einem OLE DB Source Output vergleicht, sieht man klar, dass die Definition in SSIS 2012 nicht nur von BIDS/SSDT schöner formatiert ist, sondern auch weniger unnötige Informationen enthält.

OLE DB Source Output 2008
<output id="11" name="OLE DB Source Output" description="" exclusionGroup="0" synchronousInputId="0" deleteOutputOnPathDetached="false" hasSideEffects="false" dangling="false" isErrorOut="false" isSorted="false" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed"><outputColumns>
<outputColumn id="17" name="DateKey" description="" lineageId="17" precision="0" scale="0" length="0" dataType="i4" codePage="0" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="Conversion" errorRowDisposition="FailComponent" truncationRowDisposition="FailComponent" externalMetadataColumnId="16" mappedColumnId="0"/></outputColumns><externalMetadataColumns isUsed="True">
<externalMetadataColumn id="16" name="DateKey" description="" precision="0" scale="0" length="0" dataType="i4" codePage="0" mappedColumnId="0"/></externalMetadataColumns></output>
OLE DB Source Output 2012
<output
  refId="PackageData Flow TaskOLE DB Source.Outputs[OLE DB Source Output]"
  name="OLE DB Source Output">
  <outputColumns>
    <outputColumn
      refId="PackageData Flow TaskOLE DB Source.Outputs[OLE DB Source Output].Columns[DateKey]"
      dataType="i4"
      errorOrTruncationOperation="Conversion"
      errorRowDisposition="FailComponent"
      externalMetadataColumnId="PackageData Flow TaskOLE DB Source.Outputs[OLE DB Source Output].ExternalColumns[DateKey]"
      lineageId="PackageData Flow TaskOLE DB Source.Outputs[OLE DB Source Output].Columns[DateKey]"
      name="DateKey"
      truncationRowDisposition="FailComponent" />
  </outputColumns>
  <externalMetadataColumns
    isUsed="True">
    <externalMetadataColumn
      refId="PackageData Flow TaskOLE DB Source.Outputs[OLE DB Source Output].ExternalColumns[DateKey]"
      dataType="i4"
      name="DateKey" />
  </externalMetadataColumns>

Mit dem neuen Format wurden folgende Funktionalitäten verbessert/vereinfacht:

  • Keine expliziten LineageIds, die Objekte werden mit refId (von einem Menschen lesbarer String) identifiziert => keine Fehlermeldungen “input column * has lineage ID * that was not previously used in the Data Flow task” mehr. Juhu!
  • Default Werte werden nicht persistiert => Übersichtlichkeit++
  • Objekteigenschaften (DTS:Property) werden als Attribute persistiert
  • Attribute sind alphabetisch sortiert
  • Tasks und Komponenten sind alphabetisch sortiert
  • Annotationen werden im Klartext persistiert

Das neue Format ist sehr detailliert dokumentiert, was auch die Arbeit von externen Tools und Generatoren, die von außerhalb SSIS-Pakete lesen bzw. schreiben, erleichtern soll.

Ich finde es generell sehr begrüßenswert, dass die ETL-Entwicklung unter SSIS 2012 wesentlich mehr strukturiert und Best Practices-orientiert geworden ist. Ich schließe mich der Meinung von Matt Mason aus dem SSIS Team zu 100% an:

Es gibt aber immer noch ein paar Unschönheiten im Format, die man beseitigen kann. Hoffentlich wird Microsoft auch diese Punkte in der nächsten SSIS Version angehen:

  • Layout-Informationen werden mit der eigentlichen Paketlogik in einer Datei gespeichert (MS Connect Vorschlag)
  • Diverse Paketmetadaten werden zentral in der Projekt-Datei (.dtproj) gespeichert (MS Connect Vorschlag)