Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Generate SSIS packages automatically with Biml and BimlScript (SQLKonferenz 2015)

2,573 views

Published on

Generate SSIS packages automatically with Biml and BimlScript (Presented at SQLKonferenz February 5th 2015)

Published in: Data & Analytics
  • Be the first to comment

Generate SSIS packages automatically with Biml and BimlScript (SQLKonferenz 2015)

  1. 1. Generate SSIS packages automatically with Biml and BimlScript Cathrine Wilhelmsen February 5th 2015
  2. 2. Session description SSIS is a powerful tool for extracting, transforming and loading data, but creating the actual SSIS packages can be both tedious and time-consuming. Even if you use templates and follow best practices you often have to repeat the same steps over and over again. There are no easy ways to handle metadata and schema changes, and if there are new requirements you might have to go through all the packages one more time. It's time to bring the Don't Repeat Yourself principle to SSIS development. In this session I will use the free BIDS Helper add-in to show you the basics of Biml and BimlScript, how to generate SSIS packages automatically from databases, how easy those packages can be changed, and how to move common code to separate files that can be included where needed. See why they say Biml allows you to complete in a day what once took more than a week!
  3. 3. Cathrine Wilhelmsen @cathrinew cathrinewilhelmsen.net Data Warehouse Architect Business Intelligence Developer
  4. 4. Who are you? (*) SSIS and ETL Developer? Easily bored? Tired of repetitive work? ( * Probably not a cat )
  5. 5. Why are you here? Long development time? Many SSIS packages? Slow GUI editor? (Drag, drop, drag, drop, connect, drag, drop, connect, resize, align, drag, drop, connect, resize, align…)
  6. 6. project done! new standards yay Have you ever experienced this?
  7. 7. How can Biml help you? Timesaving: Many SSIS Packages from one Biml file Reusable: Write once and run on any platform (2005 – 2014) Flexible: Start simple, expand as you learn (Of course I can create 200 packages! What do you need me to do after lunch?)
  8. 8. What is Business Intelligence Markup Language? Easy to read and write XML dialect Specifies business intelligence objects Databases, schemas, tables, columns SSIS packages SSAS cubes, facts, dimensions (Mist only)
  9. 9. Highlights in Biml History Scott Currie works on Microsoft's Project Vulcan 2008: Varigence creates Biml and Mist 2011: Biml compiler added to BIDS Helper (2015: Everyone wonders what we did before Biml?) (Live Long And Prosper)
  10. 10. How does it work?
  11. 11. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml>
  12. 12. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml> Biml Declaration = Root Element
  13. 13. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml> Logical Objects = Elements
  14. 14. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml> Child Elements
  15. 15. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml> Empty Elements
  16. 16. Biml syntax <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <OleDbConnection Name="Source" ConnectionString="…" /> </Connections> <Packages> <Package Name="EmptyPackage" ConstraintMode="Linear"> … </Package> </Packages> </Biml> Attributes
  17. 17. Demo – Biml
  18. 18. Getting started with Biml 1. Download and install BIDS Helper (http://bidshelper.codeplex.com) 2. Right-click on SSIS project and click Add New Biml File
  19. 19. Intellisense Intellisense while typing CTRL+Space to AutoComplete or show Intellisense
  20. 20. Errors Red squiggly line: Error Blue squiggly line: Missing attribute or child element Error spelling Missing attribute: ConstraintMode
  21. 21. Errors Hovering over errors will show descriptive text Missing attribute: ConstraintMode Error spelling
  22. 22. Right-click to Check Biml for Errors
  23. 23. Your first SSIS Package from Biml Right-click on Biml file and click Generate SSIS Packages Packages will appear under SSIS Packages
  24. 24. From Biml to SSIS
  25. 25. From Biml to SSIS
  26. 26. .biml vs .dtsx human-readable vs. ALL THE CODE!
  27. 27. I create SSIS packages faster than that
  28. 28. But wait!
  29. 29. The magic is in the Extend Biml with C# or VB.NET code blocks Import database structure and metadata Loop over tables and columns Add expressions to replace static values (And anything else you can do in C# or VB)
  30. 30. BimlScript code blocks <#@ … #> Directives <# … #> Control Blocks <#= … #> Expression Control Blocks
  31. 31. BimlScript syntax <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #> <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <# foreach (var table in RootNode.Tables) { #> <Package Name="Load<#=table.Name#>"> </Package> <# } #> </Packages> </Biml>
  32. 32. BimlScript syntax <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #> <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <# foreach (var table in RootNode.Tables) { #> <Package Name="Load<#=table.Name#>"> </Package> <# } #> </Packages> </Biml> Directive
  33. 33. BimlScript syntax <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #> <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <# foreach (var table in RootNode.Tables) { #> <Package Name="Load<#=table.Name#>"> </Package> <# } #> </Packages> </Biml> Control Blocks
  34. 34. BimlScript syntax <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #> <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <# foreach (var table in RootNode.Tables) { #> <Package Name="Load<#=table.Name#>"> </Package> <# } #> </Packages> </Biml> Expression Control block
  35. 35. Demo – BimlScript
  36. 36. Basic for loop <Packages> <# for (int count = 1; count <= 5; count++) { #> <Package Name="Load_Person_Person_<#=count#>"> </Package> <# } #> </Packages>
  37. 37. foreach (table in a database) loop <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #> <# var conAW2014 = SchemaManager.CreateConnectionNode("AW2014", "Data Source..."); #> <# var AW2014DB = conAW2014.ImportDB("","", ImportOptions.ExcludeViews); #> <Packages> <# foreach (var table in AW2014DB.TableNodes) { #> <Package Name="Load_<#=table.Schema#>_<#=table.Name#>"> </Package> <# } #> </Packages>
  38. 38. Don't Repeat Yourself Move common code to separate files Centralize and reuse in many projects Update code once for all projects 1. Split and combine Biml files 2. Include files 3. CallBimlScript with parameters
  39. 39. Split and combine Biml files Multiple Biml files can be compiled together Control compile order by specifying tiers in files <#@ template tier="2" #> Files are compiled into RootNode from lowest to highest tier Higher tiers can use objects in RootNode from lower tiers
  40. 40. Behind the scenes: compile and load objects into RootNode RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages>
  41. 41. <Connections> <Databases> <Schemas>RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> compile Behind the scenes: compile and load objects into RootNode
  42. 42. <Connections> <Databases> <Schemas>RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> use Behind the scenes: compile and load objects into RootNode
  43. 43. <Connections> <Databases> <Schemas> <Tables> <Columns> RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> compile Behind the scenes: compile and load objects into RootNode
  44. 44. <Connections> <Databases> <Schemas> <Tables> <Columns> RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> use Behind the scenes: compile and load objects into RootNode
  45. 45. <Connections> <Databases> <Schemas> <Tables> <Columns> <Packages> RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> compile Behind the scenes: compile and load objects into RootNode
  46. 46. <Connections> <Databases> <Schemas> <Tables> <Columns> <Packages> RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> generate Behind the scenes: compile and load objects into RootNode
  47. 47. RootNode <#@ template tier="0" #> <Connections> <Databases> <Schemas> <#@ template tier="1" #> <Tables> <Columns> <#@ template tier="2" #> <Packages> Behind the scenes: compile and load objects into RootNode
  48. 48. Demo – Split and combine Biml files
  49. 49. Split and combine multiple Biml files Create tiered files:
  50. 50. Split and combine multiple Biml files Select all the tiered files Right-click and click Generate SSIS Packages Behind the scenes: Objects will be compiled and loaded into RootNode from lowest to highest tier
  51. 51. Split and combine multiple Biml files All packages will be generated at the same time Load packages from 302LoadAllTables.biml Master package from 303MasterPackage.biml
  52. 52. Include files Include common code in multiple files and projects Use the include directive <#@ include file="CommonCode.biml" #> Include directive will be replaced by content of file Can include several file types: .biml .txt .sql .cs
  53. 53. Demo – Include files
  54. 54. CallBimlScript with parameters Works like a parameterized include File to be called (callee) specifies input parameters <#@ property name="Parameter" type="String" #> Callee can use parameter values as regular variables and to control logic File that calls (caller) provides input parameters <#=CallBimlScript("CommonCode.biml", Parameter)#> CallBimlScript code block is replaced by Biml returned by callee
  55. 55. Demo – CallBimlScript with Parameters
  56. 56. View compiled Biml Credits: Marco Schreuder (@in2bi) http://blog.in2bi.eu/biml/viewing-or-saving-the- compiled-biml-file-s/ Helper file with high tier (tier="100") Saves output of RootNode.GetBiml() to file
  57. 57. What do you do next? 1. Download BIDS Helper 2. Identify your SSIS patterns 3. Rewrite one SSIS package to Biml to learn the basics 4. Expand with BimlScript 5. Get involved in the Biml community
  58. 58. Biml on Monday... …BimlBreak the rest of the week 
  59. 59. Thank you!  @cathrinew cathrinewilhelmsen.net no.linkedin.com/in/cathrinewilhelmsen contact@cathrinewilhelmsen.net cathrinewilhelmsen.net/biml Biml resources over there!

×