{"id":623,"date":"2018-07-22T04:38:57","date_gmt":"2018-07-22T02:38:57","guid":{"rendered":"https:\/\/staging.sql.marcus-belz.de\/?p=623"},"modified":"2026-05-07T02:01:55","modified_gmt":"2026-05-07T00:01:55","slug":"ssis-vs-transact-sql-quellcodeverwaltung","status":"publish","type":"post","link":"https:\/\/staging.sql.marcus-belz.de\/?p=623","title":{"rendered":"SSIS vs. SQL &#8211; Quellcodeverwaltung"},"content":{"rendered":"<p><a href=\"https:\/\/staging.sql.marcus-belz.de\/?p=732\">This Article in English&#8230;<\/a><\/p>\n<h2>\u00dcberblick<\/h2>\n<p><strong>SQL Server Integration <\/strong>Services (SSIS) ist ein \u00e4u\u00dferst m\u00e4chtiges Tool Set f\u00fcr die Entwicklung von ETL-Strecken. Es gibt viele gute Gr\u00fcnde, die f\u00fcr einen Einsatz von SSIS sprechen. Es gibt derer aber auch gen\u00fcgend, die dagegen sprechen. Beschr\u00e4nken wir uns auf den Microsoft Produkt Stack, dann kommt als Alternative f\u00fcr die Entwicklung von komplexen ETL Strecken (im Wesentlichen) nur noch Transact-SQL (T-SQL) in Frage.<\/p>\n<p>Dieser Artikel geh\u00f6rt zu einer <a href=\"https:\/\/staging.sql.marcus-belz.de\/?p=614\">Serie von Artikeln<\/a>, die wichtige Entscheidungskriterien f\u00fcr die Wahl der richtigen Technologie(n) \u2013 SSIS und\/oder T-SQL \u2013 beleuchten.<\/p>\n<p>\u2014<\/p>\n<p>Eine Quellcodeverwaltung erm\u00f6glicht die Speicherung von Quellcode in verschiedenen Versionen. Nach einer \u00c4nderung kann die ge\u00e4nderte Datei als neue Version gespeichert werden. Mit der ge\u00e4nderten Version der Datei werden auch Metadaten wie Datum und Uhrzeit der \u00c4nderung, Benutzerkennung der Person die die \u00c4nderung durchgef\u00fchrt hat, Verweis auf einen Change-Request, etc. gespeichert. \u00c4ltere Versionen eines Dokumentes k\u00f6nnen damit wieder hergestellt werden.<\/p>\n<p>Dar\u00fcber hinaus bieten Quellcodeverwaltungen zus\u00e4tzliche Features an, die unter anderem f\u00fcr die Arbeit in einem Mehrentwicklerteam und auch f\u00fcr das Releasemanagement unerl\u00e4sslich sind. Kurz: Die Verwaltung von Quellcode ist essentieller Bestandteil professioneller Softwareentwicklung. Bekannte Quellcodeverwaltungssysteme im Microsoft-Umfeld sind der <strong>Team Foundation Server<\/strong> (TFS) bzw. <strong>Azure DevOps Server<\/strong> oder <strong>Git<\/strong> und k\u00f6nnen in die Entwicklungsumgebung <strong>Visual Studio<\/strong> integriert werden.<\/p>\n<p>Ein weiteres wichtiges Feature einer Quellcodeverwaltung ist der Vergleich zweier Versionen einer Datei. \u00dcber einen Vergleich zweier Versionen der gleichen Datei k\u00f6nnen die Unterschiede identifiziert werden. Ein Anwendungsfall hierf\u00fcr ist zum Beispiel das 4-Augen-Prinzip. Ein Entwickler arbeitet an einem Dokument und ein weiterer f\u00fchrt einen Review des ge\u00e4nderten Dokumentes durch. Relevant f\u00fcr den Review sind nur die \u00c4nderungen in der neuen Version und diese k\u00f6nnen \u00fcber einen Versionsvergleich ermittelt werden.<\/p>\n<p>Der Vergleich von zwei Versionen einer Datei ist allerdings nur dann hilfreich, wenn aus den ermittelten \u00c4nderungen die Bedeutung und ggf. der Grund der \u00c4nderung ersichtlich sind. Ein Vergleich von Bin\u00e4r-Dateien ist in der Regel nicht hilfreich, da weder die Bedeutung der \u00c4nderung noch der Grund erkennbar sind. Bei einem Vergleich von zwei Versionen einer Text-Dateien ist die Wahrscheinlichkeit hoch, dass beides erkennbar ist. Etwas schwieriger wird es allerdings auch hier, wenn die Daten in der Text-Datei hierarchisch und strukturiert gespeichert sind. So werden SSIS-Pakete in einer hierarchisch strukturierten Weise in XML-Dateien mit der Extension <strong>*.dtsx<\/strong> gespeichert, w\u00e4hrend SQL Statements \u00fcblicherweise als (reine) Text-Dateien mit der Extension <strong>*.sql<\/strong> gespeichert werden.<\/p>\n<p>Dieser Artikel beschreibt den Versions-Vergleich von SQL-Skripten und SSIS-Paketen anhand von drei Beispielen.<\/p>\n<ul>\n<li>Vergleich von zwei Versionen eines SQL Statements<\/li>\n<li>Vergleich von zwei Versionen eines einfachen SSIS-Paketes<\/li>\n<li>Vergleich von komplexen Entwicklungsartefakten<\/li>\n<\/ul>\n<h2>Vergleich von zwei Versionen eines SQL-Skriptes<\/h2>\n<p>Die folgende Abbildung zeigt das Ergebnis eines Vergleichs von zwei Versionen eines SQL-Skriptes in Visual Studio. In diesem Vergleich werden die Abweichungen farblich hervorgehoben.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-645 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png\" alt=\"\" width=\"1024\" height=\"576\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png 1024w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-300x169.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-768x432.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005.png 1535w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Der Screenshot zeigt auf der linken Seite das SQL Statement vor der \u00c4nderung und auf der rechten Seite das ge\u00e4nderte SQL Statement. In dem ge\u00e4nderten SQL Statement sind Zeilen, die eine \u00c4nderung enthalten, hellgr\u00fcn hinterlegt. \u00c4nderungen selbst werden in einem kr\u00e4ftigeren Gr\u00fcn hervorgehoben. In der Vorg\u00e4ngerversion auf der linken Seite sind die korrespondierenden Texte in roter Farbe hinterlegt.<\/p>\n<p>Rechts neben dem vertikalen Scroll-Balken sind die ge\u00e4nderten Bereiche in dem gesamten Dokument angedeutet. Eine gute Beschreibung zu der Verwendung des Datei-Vergleichs findet sich in der <a href=\"https:\/\/docs.microsoft.com\/en-us\/vsts\/repos\/tfvc\/compare-files?view=vsts\">Online Dokumentation<\/a> von Microsoft.<\/p>\n<h2>Vergleich von zwei Versionen eines einfachen SSIS-Paketes<\/h2>\n<p>Die Entwicklung von ETL-Strecken mit SSIS erfolgt in SSIS-Paketen. SSIS-Pakete werden als XML-Dokument gespeichert. Microsoft hat in der Online Dokumentation mit Bezug zu der Dokumentation von SSIS-Paketen den folgenden Artikel ver\u00f6ffentlicht: <a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/integration-services\/ssis-package-format?view=sql-server-2014\">SSIS-Paketformat<\/a> und f\u00fchrt darin unter anderem aus:<\/p>\n<p>In der aktuellen Version von Integration Services wurden wichtige \u00c4nderungen am Paketformat (DTSX-Datei) vorgenommen, um das Format besser lesbar zu machen und Pakete besser vergleichen zu k\u00f6nnen. Au\u00dferdem wurde das Zusammenf\u00fchren von Paketen verbessert, die keine miteinander in Konflikt stehenden \u00c4nderungen oder im Bin\u00e4rformat gespeicherte \u00c4nderungen enthalten.<\/p>\n<p>Dieses Zitat ist dem ersten (!) Abschnitt des Artikels entnommen. Demnach wurde das Format weiterentwickelt, um unter anderem Pakete besser vergleichen zu k\u00f6nnen.<\/p>\n<p>Die folgenden beiden Screenshots zeigen zwei Versionen eines Control Flows eines SSIS-Paketes, in dem lediglich der Name der zweiten Skript-Task von <strong>B SCT Skripttask<\/strong> nach <strong>D SCT Skripttask<\/strong> ge\u00e4ndert wurde. Die Screenshots wurden von einem SSIS-Paket genommen, in dem Tasks einfach in dem Control Flow platziert, beliebig benannt, miteinander verbunden aber nicht weiter konfiguriert. Das Beispiel ist ein einfaches und daher nur plakatives Beispiel.<\/p>\n<h3>Version 1<\/h3>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170002.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-627\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170002.png\" alt=\"\" width=\"792\" height=\"242\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170002.png 792w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170002-300x92.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170002-768x235.png 768w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/a><\/p>\n<h3>Version 2<\/h3>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170003.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-628\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170003.png\" alt=\"\" width=\"792\" height=\"242\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170003.png 792w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170003-300x92.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/07\/post00170003-768x235.png 768w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/a><\/p>\n<h3>Versionsvergleich<\/h3>\n<p>Der Vergleich beider Versionen bringt Erstaunliches zu Tage. Die \u00c4nderung des Namens einer Skript Task resultiert in sagenhaften 8 ge\u00e4nderten Bereichen des SSIS Paketes\/XML-Dokumentes, die rechts neben der vertikalen Scroll-Bar angezeigt werden.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-647 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006-1024x695.png\" alt=\"\" width=\"1024\" height=\"695\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006-1024x695.png 1024w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006-300x204.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006-768x521.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170006.png 1273w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Die Zeilen <strong>60<\/strong> bis <strong>77<\/strong> repr\u00e4sentieren (unter anderem) die Skripttask <strong>B SCT Skripttask<\/strong> in der Vorg\u00e4nger Version. Diese Skripttask wurde gem\u00e4\u00df Vergleich nach <strong>C SCT Skripttask<\/strong> umbenannt und nicht nach <strong>D SCT Skripttask<\/strong>. Die Zeilen <strong>78<\/strong> bis <strong>95<\/strong> repr\u00e4sentieren (unter anderem) die Skripttask <strong>C SCT Skripttask<\/strong> in der Vorg\u00e4nger Version. Diese Skripttask wurde laut Vergleich nach <strong>D SCT Skripttask<\/strong> umbenannt.<\/p>\n<p>Noch mal zur Erinnerung: Ge\u00e4ndert wurde lediglich der Name der Skripttask <strong>B SCT Skripttask<\/strong> nach <strong>D SCT Skripttask<\/strong>.<\/p>\n<p>Der Vergleich liefert hier schlicht ein falsches Ergebnis.<\/p>\n<h2>Vergleich von komplexen Entwicklungsartefakten<\/h2>\n<p>In diesem Abschnitt wird ein etwas komplexeres Beispiel betrachtet, das in einer \u00e4hnlichen Form durchaus in der Praxis zu finden sein k\u00f6nnte.<\/p>\n<h3>Aufgabe<\/h3>\n<p>In diesem Beispiel ist das Ranking der Mitarbeiter in der Tabelle <strong>[AdventureWorksDW2017].<br \/>\n[DimEmployee]<\/strong> je Hierarchie-Stufe entlang der Urlaubszeiten sowie Krankheitszeiten der Mitarbeiter zu ermitteln. Zu jedem Mitarbeiter sind vier Kennzahlen zu ermitteln. F\u00fcr die Berechnung der Kennzahlen ist die Methodologie der bei den Kennzahlen angegeben SQL Server Aggregats Funktionen (Windowed Function) zu verwenden:<\/p>\n<ul>\n<li><strong>Ranking Urlaubszeit: <\/strong><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/functions\/ntile-transact-sql?view=sql-server-2017\">NTILE(3)<\/a><br \/>\nNTILE(3) teilt die zu beurteilende Menge der Mitarbeiter (je Hierarchie-Stufe) in drei gleich gro\u00dfe Gruppen ein. Die Zuordnung des Mitarbeiters zu einer der drei Gruppen erfolgt entsprechend der aufsteigenden Sortierung nach Urlaubszeiten.<\/li>\n<li><strong>Ranking Urlaubszeit: <\/strong><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/functions\/dense-rank-transact-sql?view=sql-server-2017\">DENSE_RANK<\/a><br \/>\nDENSE_RANK ermittelt zu jedem Mitarbeiter (je Hierarchie-Stufe) eine Position in einer Rangfolge. Liegen zu zwei Mitarbeitern z.B. die gleiche Anzahl Urlaubsstunden vor, erhalten beide Mitarbeiter die gleiche Position im Ranking.<\/li>\n<li><strong>Ranking Krankheitszeit: <\/strong><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/functions\/ntile-transact-sql?view=sql-server-2017\">NTILE(3)<\/a><strong><br \/>\n<\/strong>Analog zu Urlaubszeit.<\/li>\n<li><strong>Ranking Krankheitszeit: <\/strong><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/functions\/dense-rank-transact-sql?view=sql-server-2017\">DENSE_RANK<\/a><strong><br \/>\n<\/strong>Analog zu Urlaubszeit.<\/li>\n<\/ul>\n<p>Diese Aufgabe ist sowohl \u00fcber ein SQL Statement als auch \u00fcber ein SSIS-Paket zu l\u00f6sen. In einem zweiten Teil sind die so entwickelten Dokumente dahingehend zu \u00e4ndern, dass als Gruppierungskriterium nicht mehr die Urlaubs- und Krankheitszeiten, sondern das Einstellungsdatum des Mitarbeiters sowie sein Geburtsdatum zu verwenden ist.<\/p>\n<p>Bei dieser Aufgabe gibt zwei Herausforderungen:<\/p>\n<ul>\n<li>Ermittlung der Hierarchie der Mitarbeiter<\/li>\n<li>Ermittlung des Rankings<\/li>\n<\/ul>\n<h3>SQL Statement<\/h3>\n<p>Transact-SQL stellt f\u00fcr beide Herausforderungen leicht zu verwendende Methoden vor:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/queries\/with-common-table-expression-transact-sql?view=sql-server-2017\">Common Table Expression<\/a> (CTE)<\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/de-de\/sql\/t-sql\/queries\/select-over-clause-transact-sql?view=sql-server-2017\">Fensterfunktionen<\/a> (Windowed Function)<\/li>\n<\/ul>\n<p>Sind Daten \u2013 wie in der Tabelle <strong>[DimEmployee]<\/strong> \u2013 \u00fcber eine Vater-Kind-Beziehung strukturiert, k\u00f6nnen diese Daten \u00fcber eine CTE sehr effizient rekursiv ausgewertet werden:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-651 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007-1024x1017.png\" alt=\"\" width=\"1024\" height=\"1017\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007-1024x1017.png 1024w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007-150x150.png 150w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007-300x298.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007-768x763.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170007.png 1031w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/?attachment_id=975\" target=\"_blank\" rel=\"noopener noreferrer\">Source<\/a><\/p>\n<p>Dieses Statement liefert zu jedem Mitarbeiter in der Spalte <strong>[Level]<\/strong> die Hierarchiestufe sowie die geforderten Kennzahlen entlang der Urlaubszeiten sowie Krankheitszeiten. Insgesamt sind die 254 Mitarbeiter in 5 Hierarchiestufen organisiert.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-657 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008-1024x161.png\" alt=\"\" width=\"1024\" height=\"161\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008-1024x161.png 1024w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008-300x47.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008-768x121.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170008.png 1336w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Der Vergleich des Statements aus der <em>Abbildung 5: Beispiel 3 &#8211; SQL Statement<\/em> mit der ge\u00e4nderten Version wurde bereits in <em>Abbildung 1: Versionsvergleich eines SQL Satetments \u00fcber Visual Studio<\/em> dargestellt. Daher wird hier auf eine weitere Abbildung des ge\u00e4nderten Statements verzichtet.<\/p>\n<p>Beide Statements sind \u00fcber die folgenden beiden Links abrufbar:<\/p>\n<ul>\n<li><a href=\"https:\/\/staging.sql.marcus-belz.de\/?attachment_id=973\">post0019_sample3_version_1<\/a>\u00a0(Urlaubs-\/Krankheitszeiten)<\/li>\n<li><a href=\"https:\/\/staging.sql.marcus-belz.de\/?attachment_id=974\">post0019_sample3_version_2<\/a> (Einstellungs-\/Geburtstag)<\/li>\n<\/ul>\n<h3>SSIS-Paket<\/h3>\n<p>So einfach diese Aufgabe \u00fcber T-SQL zu l\u00f6sen war, so schwer und vor allem zeitraubend war die Entwicklung der L\u00f6sung in SSIS, wenn man f\u00fcr die L\u00f6sung ausschlie\u00dflich die Werkzeuge von SSIS verwenden m\u00f6chte. F\u00fcr die hier dargestellte L\u00f6sung wurde der folgende Ansatz gew\u00e4hlt:<\/p>\n<ul>\n<li>Je Aufgabe werden zwei Tabellen in der Datenbank ben\u00f6tigt.<\/li>\n<li>Der Dataflow <strong>1000 DFT Calculate<\/strong> <strong>Levels<\/strong> ermittelt ausschlie\u00dflich die Hierarchie.<\/li>\n<li>Der Dataflow <strong>3000 DFT Caculate Ranking<\/strong> ermittelt ausschlie\u00dflich das Ranking und speichert das Ergebnis in einer Tabelle.<\/li>\n<li>Das Ranking wird f\u00fcr Urlaubs-\/Krankheitszeiten jeweils \u00fcber zwei Skript-Tasks ermittelt.<\/li>\n<\/ul>\n<p>M\u00f6glicherweise gibt es auch eine viel einfachere L\u00f6sung.<\/p>\n<h4>Control Flow<\/h4>\n<p>Der Control-Flow des SSIS-Paktes gestaltet sich mit 4 Tasks noch recht einfach\u2026<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170010.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-662 size-full\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170010.png\" alt=\"\" width=\"587\" height=\"364\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170010.png 587w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170010-300x186.png 300w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/a><\/p>\n<h4>Data Flow\u00a0<em><strong>1000 DFT Calculate Levels<\/strong><\/em><\/h4>\n<p>W\u00e4hrend die L\u00f6sung \u00fcber T-SQL einen rekursiven Ansatz unterst\u00fctzt, ist dieses bei SSIS (nach meinem Kenntnisstand) nicht m\u00f6glich. Die Zuordnung der 5 Hierarchiestufen muss daher je Stufe entwickelt werden.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-658 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009-528x1024.png\" alt=\"\" width=\"528\" height=\"1024\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009-528x1024.png 528w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009-155x300.png 155w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009-768x1489.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170009.png 947w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/p>\n<h4>Data Flow\u00a0<em><strong>3000 DFT Calculate Ranking<\/strong><\/em><\/h4>\n<p>Die eigentliche Berechnung des Rankings erfolgt in Skript-Tasks durch Vergleich zwei aufeinander folgender Datens\u00e4tze\u2026<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170011.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-666 size-full\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170011.png\" alt=\"\" width=\"509\" height=\"425\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170011.png 509w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170011-300x250.png 300w\" sizes=\"auto, (max-width: 509px) 100vw, 509px\" \/><\/a><\/p>\n<h3>Anpassung des Paketes<\/h3>\n<p>Nach Fertigstellung des Paketes, wurde das Paket in <strong>Team Foundation Server<\/strong> (TFS) eingecheckt und anschlie\u00dfen so abge\u00e4ndert, dass als Ordnungskriterium f\u00fcr die Ermittlung des Rankings nun nicht mehr <strong>Urlaubs-\/Krankheitszeiten<\/strong> sondern <strong>Einstellungs-\/Geburtstage<\/strong> verwendet werden. Im Wesentlichen sind hier drei Feldnamen und ein Datentyp zu \u00e4ndern gewesen. Trotz der gr\u00f6\u00dferen Anzahl der verwendeten Tasks, hat sich der Umfang der \u00c4nderungen in Grenzen gehalten und war in wenigen Minuten erledigt. Das Ergebnis wurde ebenfalls in TFS eingecheckt.<\/p>\n<h3>Vergleich der zwei Versionen<\/h3>\n<p>Ein Vergleich der beiden in TFS eingecheckten Version ergab die folgenden \u00c4nderungen:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-667 size-large\" src=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012-1024x695.png\" alt=\"\" width=\"1024\" height=\"695\" srcset=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012-1024x695.png 1024w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012-300x204.png 300w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012-768x521.png 768w, https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170012.png 1273w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Ma\u00dfgeblich f\u00fcr die Beurteilung des Umfangs der \u00c4nderung in dem SSIS Paket ist der rechte vertikale Scroll-Balken. Rechts neben dem Scroll-Balken sind die Fundstellen der \u00c4nderungen in dem SSIS-Paket farblich in gr\u00fcner und roter Farbe hervorgehoben. Trotz des eher geringen Umfangs der \u00c4nderungen ist f\u00f6rmlich das gesamte SSIS Paket auf den Kopf gestellt worden.<\/p>\n<h3>Source Code<\/h3>\n<p>Die hier gezeigten Beispiele wurden unter Visual Studio 2017 in Verbindung mit einer SQL Server 2017 Datenbank entwickelt. Der Source Code zu dem Beispiel kann \u00fcber den folgenden Link heruntergeladen werden:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/staging.sql.marcus-belz.de\/?attachment_id=676\" target=\"_blank\" rel=\"noopener noreferrer\">Sourcen<\/a><\/p>\n<h2>Fazit<\/h2>\n<p>W\u00e4hrend die L\u00f6sung der Aufgabe in T-SQL relativ schnell entwickelt werden kann, ist die Entwicklung des SSIS-Paketes aufw\u00e4ndig und sie hat mehrere Stunden Zeit gekostet. Grund hierf\u00fcr waren im Wesentlichen die schlechte Lesbarkeit eines SSIS Paketes, aber auch die (\u00fcberraschende) Erkenntnis, dass es f\u00fcr die vermeintlich einfache Aufgabe keinen <em>OutOfTheBox<\/em>-L\u00f6sungsansatz in SSIS gibt. Nach Fertigstellung und einem Checkin der L\u00f6sung waren nur noch vergleichsweise wenige \u00c4nderungen erforderlich, um das Ordnungskriteriums f\u00fcr die Berechnung der Kennzahlen zu \u00e4ndern. Die <em>wenigen<\/em> \u00c4nderungen resultieren in zahlreichen \u00c4nderungen in dem zugrunde liegenden XML-Dokument. Ein Versions-Vergleich l\u00e4sst den Entwickler ratlos zur\u00fcck, was sich denn nun in dem SSIS Paket ge\u00e4ndert hat. Zum Vergleich mit T-SQL: Hier ist zum einen der L\u00f6sungsweg direkt lesbar und \u00c4nderungen sind nachvollziehbar.<\/p>\n<p>Am Ende bleibt nur ein Fazit m\u00f6glich:<\/p>\n<ul>\n<li>SSIS Pakete sind schwer lesbar<\/li>\n<li>SSIS Pakete sind schwer wartbar<\/li>\n<li>Ein Versionsvergleich von SSIS-Paketen ist nicht m\u00f6glich<\/li>\n<\/ul>\n<p>SSIS ist ein \u00e4u\u00dferst m\u00e4chtiges Tool Set. Allerdings ist der Umfang der Verwendung bei fast jeder Aufgabe kritisch zu hinterfragen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This Article in English&#8230; \u00dcberblick SQL Server Integration Services (SSIS) ist ein \u00e4u\u00dferst m\u00e4chtiges Tool Set f\u00fcr die Entwicklung von ETL-Strecken. Es gibt viele gute Gr\u00fcnde, die f\u00fcr einen Einsatz von SSIS sprechen. Es gibt derer aber auch gen\u00fcgend, die dagegen sprechen. Beschr\u00e4nken wir uns auf den Microsoft Produkt Stack, dann kommt als Alternative f\u00fcr &#8230; <a title=\"SSIS vs. SQL &#8211; Quellcodeverwaltung\" class=\"read-more\" href=\"https:\/\/staging.sql.marcus-belz.de\/?p=623\" aria-label=\"Mehr Informationen \u00fcber SSIS vs. SQL &#8211; Quellcodeverwaltung\">Weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[17,14,15,19,10,16,18],"class_list":["post-623","post","type-post","status-publish","format-standard","hentry","category-all-languages","category-german","tag-cte","tag-multi-developer-environment","tag-ssis","tag-ssis-vs-sql","tag-t-sql","tag-tfs","tag-windowed-function"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/staging.sql.marcus-belz.de\/?p=623\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog\" \/>\n<meta property=\"og:description\" content=\"This Article in English&#8230; \u00dcberblick SQL Server Integration Services (SSIS) ist ein \u00e4u\u00dferst m\u00e4chtiges Tool Set f\u00fcr die Entwicklung von ETL-Strecken. Es gibt viele gute Gr\u00fcnde, die f\u00fcr einen Einsatz von SSIS sprechen. Es gibt derer aber auch gen\u00fcgend, die dagegen sprechen. Beschr\u00e4nken wir uns auf den Microsoft Produkt Stack, dann kommt als Alternative f\u00fcr ... Weiterlesen\" \/>\n<meta property=\"og:url\" content=\"https:\/\/staging.sql.marcus-belz.de\/?p=623\" \/>\n<meta property=\"og:site_name\" content=\"Just another SQL blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-22T02:38:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-07T00:01:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png\" \/>\n<meta name=\"author\" content=\"marcus\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschrieben von\" \/>\n\t<meta name=\"twitter:data1\" content=\"marcus\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623\"},\"author\":{\"name\":\"marcus\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/98ab042e47d7286f64530ee18f20f675\"},\"headline\":\"SSIS vs. SQL &#8211; Quellcodeverwaltung\",\"datePublished\":\"2018-07-22T02:38:57+00:00\",\"dateModified\":\"2026-05-07T00:01:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623\"},\"wordCount\":1804,\"image\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00170005-1024x576.png\",\"keywords\":[\"CTE\",\"Multi Developer Environment\",\"SSIS\",\"SSIS vs. SQL\",\"T-SQL\",\"TFS\",\"Windowed Function\"],\"articleSection\":[\"All Languages\",\"German\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623\",\"url\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623\",\"name\":\"SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00170005-1024x576.png\",\"datePublished\":\"2018-07-22T02:38:57+00:00\",\"dateModified\":\"2026-05-07T00:01:55+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/98ab042e47d7286f64530ee18f20f675\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#primaryimage\",\"url\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00170005.png\",\"contentUrl\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00170005.png\",\"width\":1535,\"height\":864},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?p=623#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SSIS vs. SQL &#8211; Quellcodeverwaltung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/#website\",\"url\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/\",\"name\":\"Just another SQL blog\",\"description\":\"Marcus Belz \u00b7 SQL Server \u00b7 ETL \u00b7 Datenqualit\u00e4t\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/98ab042e47d7286f64530ee18f20f675\",\"name\":\"marcus\",\"url\":\"https:\\\/\\\/staging.sql.marcus-belz.de\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/staging.sql.marcus-belz.de\/?p=623","og_locale":"de_DE","og_type":"article","og_title":"SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog","og_description":"This Article in English&#8230; \u00dcberblick SQL Server Integration Services (SSIS) ist ein \u00e4u\u00dferst m\u00e4chtiges Tool Set f\u00fcr die Entwicklung von ETL-Strecken. Es gibt viele gute Gr\u00fcnde, die f\u00fcr einen Einsatz von SSIS sprechen. Es gibt derer aber auch gen\u00fcgend, die dagegen sprechen. Beschr\u00e4nken wir uns auf den Microsoft Produkt Stack, dann kommt als Alternative f\u00fcr ... Weiterlesen","og_url":"https:\/\/staging.sql.marcus-belz.de\/?p=623","og_site_name":"Just another SQL blog","article_published_time":"2018-07-22T02:38:57+00:00","article_modified_time":"2026-05-07T00:01:55+00:00","og_image":[{"url":"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png","type":"","width":"","height":""}],"author":"marcus","twitter_card":"summary_large_image","twitter_misc":{"Geschrieben von":"marcus","Gesch\u00e4tzte Lesezeit":"9\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#article","isPartOf":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623"},"author":{"name":"marcus","@id":"https:\/\/staging.sql.marcus-belz.de\/#\/schema\/person\/98ab042e47d7286f64530ee18f20f675"},"headline":"SSIS vs. SQL &#8211; Quellcodeverwaltung","datePublished":"2018-07-22T02:38:57+00:00","dateModified":"2026-05-07T00:01:55+00:00","mainEntityOfPage":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623"},"wordCount":1804,"image":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#primaryimage"},"thumbnailUrl":"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png","keywords":["CTE","Multi Developer Environment","SSIS","SSIS vs. SQL","T-SQL","TFS","Windowed Function"],"articleSection":["All Languages","German"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623","url":"https:\/\/staging.sql.marcus-belz.de\/?p=623","name":"SSIS vs. SQL - Quellcodeverwaltung - Just another SQL blog","isPartOf":{"@id":"https:\/\/staging.sql.marcus-belz.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#primaryimage"},"image":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#primaryimage"},"thumbnailUrl":"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005-1024x576.png","datePublished":"2018-07-22T02:38:57+00:00","dateModified":"2026-05-07T00:01:55+00:00","author":{"@id":"https:\/\/staging.sql.marcus-belz.de\/#\/schema\/person\/98ab042e47d7286f64530ee18f20f675"},"breadcrumb":{"@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/staging.sql.marcus-belz.de\/?p=623"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#primaryimage","url":"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005.png","contentUrl":"https:\/\/staging.sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00170005.png","width":1535,"height":864},{"@type":"BreadcrumbList","@id":"https:\/\/staging.sql.marcus-belz.de\/?p=623#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/staging.sql.marcus-belz.de\/"},{"@type":"ListItem","position":2,"name":"SSIS vs. SQL &#8211; Quellcodeverwaltung"}]},{"@type":"WebSite","@id":"https:\/\/staging.sql.marcus-belz.de\/#website","url":"https:\/\/staging.sql.marcus-belz.de\/","name":"Just another SQL blog","description":"Marcus Belz \u00b7 SQL Server \u00b7 ETL \u00b7 Datenqualit\u00e4t","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/staging.sql.marcus-belz.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/staging.sql.marcus-belz.de\/#\/schema\/person\/98ab042e47d7286f64530ee18f20f675","name":"marcus","url":"https:\/\/staging.sql.marcus-belz.de\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=623"}],"version-history":[{"count":10,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/623\/revisions"}],"predecessor-version":[{"id":981,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/623\/revisions\/981"}],"wp:attachment":[{"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/staging.sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}