{"id":732,"date":"2018-08-30T12:58:41","date_gmt":"2018-08-30T10:58:41","guid":{"rendered":"https:\/\/sql.marcus-belz.de\/?p=732"},"modified":"2020-05-10T16:49:12","modified_gmt":"2020-05-10T14:49:12","slug":"ssis-vs-transact-sql-source-code-management","status":"publish","type":"post","link":"https:\/\/sql.marcus-belz.de\/?p=732","title":{"rendered":"SSIS vs. SQL \u2013 Source Code Management"},"content":{"rendered":"<p><a href=\"https:\/\/sql.marcus-belz.de\/?p=623\" target=\"_blank\" rel=\"noopener noreferrer\">Dieser Artikel in Deutsch&#8230;<\/a><\/p>\n<h2>Overview<\/h2>\n<p><strong>SQL Server Integration Services<\/strong> (SSIS) is a very powerful graphical tool set belonging to the Microsoft BI Stack along with SQL Server, SQL Server Analysis Services (SSAS), SQL Server Reporting Services (SSRS), etc. It supports a broad variety of data migration, integration and transformation tasks. With that, you will find a bunch of good reasons why to utilize this tool set. However, there are a plenty of reasons why not to use SSIS. With Transact SQL (T-SQL) Microsoft provides with respect to transformation tasks an equivalent technique.<\/p>\n<p>This article belongs to a <a href=\"https:\/\/sql.marcus-belz.de\/?p=678\">series of articles<\/a> that are dealing with some important criteria for choosing the right technology(ies) \u2013 SSIS and\/or T-SQL.<\/p>\n<p>&#8212;<\/p>\n<p>Source code management enables the storage of source code in different versions. After a change, the changed file can be saved as a new version. With the changed version of the file, metadata such as the date and time of the change, user ID of the person who made the change, reference to a change request, etc. are also saved. Older versions of a document can be restored with it.<\/p>\n<p>In addition, source code management systems offer additional features that are essential for working in a multi-developer team and also for release management. In short: Source code management is essential for professional software development. Well-known source code management systems in the Microsoft environment are the <strong>Team Foundation Server<\/strong> (TFS) or <strong>Azure DevOps Server<\/strong> or <strong>Git<\/strong> and can be integrated into the Visual Studio development environment.<\/p>\n<p>An important feature of a source code management is the comparison of two versions of a file. A comparison of two versions of the same file determines the differences between the two versions. A use case for this is the 4-eyes principle. One developer works on a document and another carries out a review of the changed document. Only the changes in the new version are relevant for the review and these can be determined by comparing the versions.<\/p>\n<p>However, the comparison of two versions of a file is only helpful, if the changes can both be determined clearly and the meaning interpreted. A comparison of binary files is usually not helpful since is not readable and the meaning behind the modified binary code remains unclear. When comparing two versions of a text file, there is a good chance that both are recognizable. However, comparing text files can be challenging if the data in the text file is stored hierarchically and in a structured manner. SSIS packages are stored in a hierarchical structure in XML files with the extension <strong>*.dtsx<\/strong>, while SQL statements are usually saved as (flat) script files with the extension <strong>*.sql<\/strong>.<\/p>\n<p>This article describes the comparison of two version of SQL scripts and SSIS packages using three examples.<\/p>\n<ul>\n<li>Comparison of two versions of a SQL script<\/li>\n<li>Comparison of two versions of a simple SSIS package<\/li>\n<li>Comparison of complex development artifacts<\/li>\n<\/ul>\n<h2>Comparison of two versions of a SQL script<\/h2>\n<p>The following screenshot shows the result of a comparison of two versions of a SQL script in Visual Studio. Deviations are highlighted in red and green color.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-731 size-large\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-1024x576.png\" alt=\"\" width=\"1024\" height=\"576\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-1024x576.png 1024w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-300x169.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-768x432.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005.png 1535w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The screenshot shows the SQL statement before the change on the left and the changed SQL statement on the right. In the changed SQL statement, lines that contain a change are highlighted in light green. Changes themselves are highlighted in a bolder green. In the previous version, the corresponding texts are highlighted in red.<\/p>\n<p>To the right of the vertical scroll bar, the changed areas are indicated throughout the document. A good description of the use of the file comparison can be found in the <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/repos\/tfvc\/compare-files?view=azure-devops&amp;viewFallbackFrom=vsts\">online documentation<\/a> from Microsoft.<\/p>\n<h2>Comparison of two versions of a simple SSIS package<\/h2>\n<p>The ETL processes developed with SSIS are saved in SSIS packages with the extension <strong>*.dtsx<\/strong>. SSIS packages are saved as XML documents. Microsoft has published the following article in the online documentation with reference to the documentation of SSIS packages: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/integration-services\/ssis-package-format?view=sql-server-2014\">SSIS Package Format<\/a> and explains among other things:<\/p>\n<p style=\"padding-left: 40px;\"><em>&#8222;In the current release of Integration Services, significant changes were made to the package format (.dtsx file) to make it easier to read the format and to compare packages. You can also more reliably merge packages that don&#8217;t contain conflicting changes or changes stored in binary format.&#8220;<\/em><\/p>\n<p>This quote is taken from the very first (!) section of the article. Microsoft emphasizes that the format has been further developed in order to be able to compare packages more easily, among other things.<\/p>\n<p>The following two screenshots show two versions of a control flow of an SSIS package, in which only the name of the second script task was changed from <strong>B SCT script task<\/strong> to <strong>D SCT script task<\/strong>. The screenshots were taken from a control flow of a simple SSIS package, that contains some random control flow tasks without a full blown configuration. The example is a simple and therefore only striking example.<\/p>\n<h3>Version 1<\/h3>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190002.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-742\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190002.png\" alt=\"\" width=\"792\" height=\"242\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190002.png 792w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190002-300x92.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190002-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:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190003.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-743\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190003.png\" alt=\"\" width=\"792\" height=\"242\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190003.png 792w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190003-300x92.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190003-768x235.png 768w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/a><\/p>\n<h3>Result of the comparison<\/h3>\n<p>The comparison of both versions reveals astonishing things. The change of the name of a script task results in an incredible 8 changed areas of the SSIS package \/ XML document, which are displayed to the right of the vertical scroll bar.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-750\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004-1024x876.png\" alt=\"\" width=\"1024\" height=\"876\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004-1024x876.png 1024w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004-300x257.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004-768x657.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190004.png 1039w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Lines <strong>60<\/strong> to <strong>77<\/strong> represent (among other things) the script task <strong>B SCT script task<\/strong> in the previous version. According to the comparison, this script task was renamed to <strong>C SCT script task<\/strong> and not to <strong>D SCT script task<\/strong>. Lines <strong>78<\/strong> to <strong>95<\/strong> represent (among other things) the script task <strong>C SCT script task<\/strong> in the previous version. According to the comparison, this script task was renamed <strong>D SCT script task<\/strong>.<\/p>\n<p>Reminder: only the name of the script task <strong>B SCT script task<\/strong> was changed to <strong>D SCT script task<\/strong>.<\/p>\n<p>The comparison simply produces a wrong result.<\/p>\n<h2>Comparison of complex development artifacts<\/h2>\n<p>This section focusses on a more complex example that could be found in practice in a similar form.<\/p>\n<h3>Requirement<\/h3>\n<p>In this example, the ranking of the employees in table <strong>[AdventureWorksDW2017].[DimEmployee] <\/strong>is to be determined for each hierarchy level along the vacation times and sick times of the employees. Four key figures must be determined for each employee. The methodology of the SQL Server aggregate functions (windowed function) specified for the key figures must be used to calculate the key figures:<\/p>\n<ul>\n<li><strong>Ranking vacation hours: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/functions\/ntile-transact-sql?view=sql-server-2017\">NTILE(3)<\/a><\/strong><br \/>\nNTILE(3) distributes the number of employees by hierarchy level into three groups of equal size and partitions the employees by their vacation hours.<\/li>\n<li><strong>Ranking vacation hours: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/functions\/dense-rank-transact-sql?view=sql-server-2017\">DENSE_RANK<\/a><\/strong><br \/>\nDetermine the rank of employees by hierarchy level ordered by vacation hours. Employees that have the same amount of vacation hours have the same rank.<\/li>\n<li><strong>Ranking sick leave hours: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/functions\/ntile-transact-sql?view=sql-server-2017\">NTILE(3)<\/a><\/strong><br \/>\nNTILE(3) distributes the number of employees by hierarchy level into three groups of equal size and partitions the employees by their sick leave hours.<\/li>\n<li><strong>Ranking sick leave hours: <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/functions\/dense-rank-transact-sql?view=sql-server-2017\">DENSE_RANK<\/a><\/strong><br \/>\nDetermine the rank of employees by hierarchy level ordered by sick leave hours. Employees that have the same amount of sick leave hours have the same rank.<\/li>\n<\/ul>\n<p>This task will be solved using an SQL statement as well as an SSIS package. After the development of both artifacts will be changed in a way that the grouping criterion is no longer the periods of vacation and illness, but the date of employment of the employee and his date of birth.<\/p>\n<p>There are two challenges to this task:<\/p>\n<ul>\n<li>Determining the hierarchy of employees<\/li>\n<li>Determination of the ranking<\/li>\n<\/ul>\n<h3>SQL Statement<\/h3>\n<p>Transact-SQL introduces easy-to-use methods for both challenges:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/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\/en-us\/sql\/t-sql\/queries\/select-over-clause-transact-sql?view=sql-server-2017\">Fensterfunktionen<\/a> (Windowed Function)<\/li>\n<\/ul>\n<p>If data is hierarchically organized in a father-child relationship &#8211; as it is in the table <strong>[DimEmployee]<\/strong> &#8211; you can easily query the structure recursively using a CTE:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-769 size-large\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013-1024x1017.png\" alt=\"\" width=\"1024\" height=\"1017\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013-1024x1017.png 1024w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013-150x150.png 150w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013-300x298.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013-768x763.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190013.png 1031w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>This statement provides each employee in the <strong>[Level]<\/strong> column with the hierarchy level as well as the required key figures along the vacation and sick times. The 254 employees are organized in 5 hierarchical levels.<\/p>\n<p><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-770\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014-1024x161.png\" alt=\"\" width=\"738\" height=\"116\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014-1024x161.png 1024w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014-300x47.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014-768x121.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190014.png 1336w\" sizes=\"auto, (max-width: 738px) 100vw, 738px\" \/><\/a><\/p>\n<p>The comparison of the two versions of the SQL statement has already been shown in the first screenshot. Therefore, there is no further illustration of the amended statement here.<\/p>\n<p>Both statements are available via the following two links:<\/p>\n<ul>\n<li><a href=\"https:\/\/sql.marcus-belz.de\/?attachment_id=971\">post0020_sample3_version_1<\/a> (Vacation times \/Ill times)<\/li>\n<li><a href=\"https:\/\/sql.marcus-belz.de\/?attachment_id=972\">post0020_sample3_version_2<\/a> (Hire date\/Birth date)<\/li>\n<\/ul>\n<h3>SSIS Package<\/h3>\n<p>The above solution was not too tricky! However, finding an SSIS approach that relies only on SSIS data flow tasks and that is as easy as the above solution was something of a challenge. It took me quite a few hours to develop the below solution. I chose the following:<\/p>\n<ul>\n<li>The solution requires two tables in the database.<\/li>\n<li>The data flow <strong>1000 DFT Calculate Levels<\/strong> only determines the hierarchy.<\/li>\n<li>The data flow <strong>3000 DFT Caculate Ranking<\/strong> only determines the ranking and stores the result in a table.<\/li>\n<li>The ranking for vacation hours and sick leave hours by hierarchy level will be calculated in two script tasks.<\/li>\n<\/ul>\n<p>Possibly there is a much better and easier solution for the task.<\/p>\n<h4>Control Flow<\/h4>\n<p>The control flow of the SSIS package just contains 4 tasks and appears to be simple thing.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190010.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-781 size-full\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190010.png\" alt=\"\" width=\"587\" height=\"364\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190010.png 587w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190010-300x186.png 300w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/a><\/p>\n<h4>Dataflow <em><strong>1000 DFT Calculate Levels<\/strong><\/em><\/h4>\n<p>While T-SQL offers an easy to use approach, SSIS does not support a generic approach for a recursive query nor is there an easy to configure task in the SSIS data flow toolbox available. The determination of the 5 hirarchy levels must be developed level by level:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-783\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009-528x1024.png\" alt=\"\" width=\"528\" height=\"1024\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009-528x1024.png 528w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009-155x300.png 155w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009-768x1489.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190009.png 947w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/p>\n<h4>Dataflow <em><strong>3000 DFT Caculate Ranking<\/strong><\/em><\/h4>\n<p>The rankings will be calculated in two script tasks by comparing consecutive records.<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190011.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-787\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190011.png\" alt=\"\" width=\"509\" height=\"425\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190011.png 509w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190011-300x250.png 300w\" sizes=\"auto, (max-width: 509px) 100vw, 509px\" \/><\/a><\/p>\n<h4>Modifications to the package<\/h4>\n<p>After having completed the development of the package, I checked in the package in <strong>Team Foundation Server<\/strong> (TFS). The next step was to modify the order criteria for ranking the employees by hierarchy level from <strong>holiday \/ sick leave hours<\/strong> to <strong>hiring date \/ birth date<\/strong> and then check in the modified version of the package.<\/p>\n<p>What were the modifications in detail?<\/p>\n<ul>\n<li>Modification of field names<\/li>\n<li>Modification of the data typs of two columns\/variables<\/li>\n<\/ul>\n<p>Despite the larger number of tasks used in the package, the scope of changes has been limited and the work was done within minutes.<\/p>\n<h4>Comparing the original and the modified version<\/h4>\n<p>A comparison of both versions produced the following result:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-791\" src=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012-1024x695.png\" alt=\"\" width=\"1024\" height=\"695\" srcset=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012-1024x695.png 1024w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012-300x204.png 300w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012-768x521.png 768w, https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/09\/post00190012.png 1273w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Have a look at the right hand part of the vertical scroll bar. The modified spots are highlighted with green\/red color. Wow! Those few modifications resulted in quite a few modifications in the underlying XML document.<\/p>\n<h4>Source Code<\/h4>\n<p>The examples in this article were developed with <strong>Visual Studio 2017<\/strong> and <strong>SQL Server 2017<\/strong>. The source code can be downloaded from here:<\/p>\n<p><a href=\"https:\/\/sql.marcus-belz.de\/?attachment_id=976\" target=\"_blank\" rel=\"noopener noreferrer\">Source Code<\/a><\/p>\n<h2>Summary<\/h2>\n<p>While the T-SQL solution was developed within a short period of time, the development of the SSIS package took me several hours.<\/p>\n<p>As there is no <em>Out-Of-The-Box<\/em> SSIS solution that would meet the requirements I first had to figure out an approach that produces the expected result. In the beginning I was playing around with a single formular expression that calculates the hierarchy level. But after two or three hours I waived the white flag and chose to follow the approach shown in this article at the cost of readability and fexibility of the the SSIS package. I have also shown that minor modifications usually result in major modifications in the underlying XML document. In contrast to the complexity of developing SSIS packages the development and modification of the SQL statement appeared to be rather easy.<\/p>\n<p>Most of that leaves me with the following conclusion:<\/p>\n<ul>\n<li>SSIS packages are hard to read<\/li>\n<li>SSIS packages are difficult to maintain<\/li>\n<li>Comparison of SSIS packages is not possible<\/li>\n<\/ul>\n<p>SSIS is a very powerful toolset. However, whether or not to use SSIS for data transformation is questionable for <strong>most<\/strong> every day requirements. If you are familiar with T-SQL you would probably prefer SQL statements and Stored Procedures over complex SSIS Packages.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Artikel in Deutsch&#8230; Overview SQL Server Integration Services (SSIS) is a very powerful graphical tool set belonging to the Microsoft BI Stack along with SQL Server, SQL Server Analysis Services (SSAS), SQL Server Reporting Services (SSRS), etc. It supports <a href=\"https:\/\/sql.marcus-belz.de\/?p=732\" class=\"read-more\">Read More &#8230;<\/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,6],"tags":[17,14,15,19,10,16,18],"class_list":["post-732","post","type-post","status-publish","format-standard","hentry","category-all-languages","category-english","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 \u2013 Source Code Management - 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:\/\/sql.marcus-belz.de\/?p=732\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SSIS vs. SQL \u2013 Source Code Management - Just another SQL blog\" \/>\n<meta property=\"og:description\" content=\"Dieser Artikel in Deutsch&#8230; Overview SQL Server Integration Services (SSIS) is a very powerful graphical tool set belonging to the Microsoft BI Stack along with SQL Server, SQL Server Analysis Services (SSAS), SQL Server Reporting Services (SSRS), etc. It supports Read More ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sql.marcus-belz.de\/?p=732\" \/>\n<meta property=\"og:site_name\" content=\"Just another SQL blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-30T10:58:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-10T14:49:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-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=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732\"},\"author\":{\"name\":\"marcus\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/7b46a383907dc48ca44fae32ceb24744\"},\"headline\":\"SSIS vs. SQL \u2013 Source Code Management\",\"datePublished\":\"2018-08-30T10:58:41+00:00\",\"dateModified\":\"2020-05-10T14:49:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732\"},\"wordCount\":1959,\"image\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00190005-1024x576.png\",\"keywords\":[\"CTE\",\"Multi Developer Environment\",\"SSIS\",\"SSIS vs. SQL\",\"T-SQL\",\"TFS\",\"Windowed Function\"],\"articleSection\":[\"All Languages\",\"English\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732\",\"url\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732\",\"name\":\"SSIS vs. SQL \u2013 Source Code Management - Just another SQL blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00190005-1024x576.png\",\"datePublished\":\"2018-08-30T10:58:41+00:00\",\"dateModified\":\"2020-05-10T14:49:12+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/7b46a383907dc48ca44fae32ceb24744\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#primaryimage\",\"url\":\"https:\\\/\\\/sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00190005.png\",\"contentUrl\":\"https:\\\/\\\/sql.marcus-belz.de\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/post00190005.png\",\"width\":1535,\"height\":864},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?p=732#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sql.marcus-belz.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SSIS vs. SQL \u2013 Source Code Management\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/#website\",\"url\":\"https:\\\/\\\/sql.marcus-belz.de\\\/\",\"name\":\"Just another SQL blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sql.marcus-belz.de\\\/#\\\/schema\\\/person\\\/7b46a383907dc48ca44fae32ceb24744\",\"name\":\"marcus\",\"url\":\"https:\\\/\\\/sql.marcus-belz.de\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SSIS vs. SQL \u2013 Source Code Management - 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:\/\/sql.marcus-belz.de\/?p=732","og_locale":"de_DE","og_type":"article","og_title":"SSIS vs. SQL \u2013 Source Code Management - Just another SQL blog","og_description":"Dieser Artikel in Deutsch&#8230; Overview SQL Server Integration Services (SSIS) is a very powerful graphical tool set belonging to the Microsoft BI Stack along with SQL Server, SQL Server Analysis Services (SSAS), SQL Server Reporting Services (SSRS), etc. It supports Read More ...","og_url":"https:\/\/sql.marcus-belz.de\/?p=732","og_site_name":"Just another SQL blog","article_published_time":"2018-08-30T10:58:41+00:00","article_modified_time":"2020-05-10T14:49:12+00:00","og_image":[{"url":"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-1024x576.png","type":"","width":"","height":""}],"author":"marcus","twitter_card":"summary_large_image","twitter_misc":{"Geschrieben von":"marcus","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sql.marcus-belz.de\/?p=732#article","isPartOf":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732"},"author":{"name":"marcus","@id":"https:\/\/sql.marcus-belz.de\/#\/schema\/person\/7b46a383907dc48ca44fae32ceb24744"},"headline":"SSIS vs. SQL \u2013 Source Code Management","datePublished":"2018-08-30T10:58:41+00:00","dateModified":"2020-05-10T14:49:12+00:00","mainEntityOfPage":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732"},"wordCount":1959,"image":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732#primaryimage"},"thumbnailUrl":"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-1024x576.png","keywords":["CTE","Multi Developer Environment","SSIS","SSIS vs. SQL","T-SQL","TFS","Windowed Function"],"articleSection":["All Languages","English"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/sql.marcus-belz.de\/?p=732","url":"https:\/\/sql.marcus-belz.de\/?p=732","name":"SSIS vs. SQL \u2013 Source Code Management - Just another SQL blog","isPartOf":{"@id":"https:\/\/sql.marcus-belz.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732#primaryimage"},"image":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732#primaryimage"},"thumbnailUrl":"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005-1024x576.png","datePublished":"2018-08-30T10:58:41+00:00","dateModified":"2020-05-10T14:49:12+00:00","author":{"@id":"https:\/\/sql.marcus-belz.de\/#\/schema\/person\/7b46a383907dc48ca44fae32ceb24744"},"breadcrumb":{"@id":"https:\/\/sql.marcus-belz.de\/?p=732#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sql.marcus-belz.de\/?p=732"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/sql.marcus-belz.de\/?p=732#primaryimage","url":"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005.png","contentUrl":"https:\/\/sql.marcus-belz.de\/wp-content\/uploads\/2018\/08\/post00190005.png","width":1535,"height":864},{"@type":"BreadcrumbList","@id":"https:\/\/sql.marcus-belz.de\/?p=732#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sql.marcus-belz.de\/"},{"@type":"ListItem","position":2,"name":"SSIS vs. SQL \u2013 Source Code Management"}]},{"@type":"WebSite","@id":"https:\/\/sql.marcus-belz.de\/#website","url":"https:\/\/sql.marcus-belz.de\/","name":"Just another SQL blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sql.marcus-belz.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/sql.marcus-belz.de\/#\/schema\/person\/7b46a383907dc48ca44fae32ceb24744","name":"marcus","url":"https:\/\/sql.marcus-belz.de\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=732"}],"version-history":[{"count":10,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/732\/revisions"}],"predecessor-version":[{"id":994,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=\/wp\/v2\/posts\/732\/revisions\/994"}],"wp:attachment":[{"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sql.marcus-belz.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}