1696

Biml语言简介

原文:Introduction to the Biml Language

作者:Koen Verbeeck

概览

Biml或商业智能标记语言是一种用于生成Integration Services(SSIS)包的开源XML方言。

Biml可用于从元数据创建多个SSIS包,并消除Visual Studio设计器中通常需要的大量手动工作。Biml可以协助数据仓库方案,数据集成/迁移项目或需要创建遵循相同模式的许多SSIS包的每个项目。

什么时候使用Biml

如果您需要创建多个遵循相同模式的SSIS包,Biml最有效。换句话说,如果所有包具有大致相同的目标和结构,但可能只有源表和目标表发生变化。我们称之为元数据的包之间的“数据”变化。

模式的例子是:

  • 加载(持久)暂存环境
  • 将数据加载到维度或事实表中
  • 创建原始数据库

何时不使用Biml

如果您只需要少量软件包,那么首先编写Biml脚本来生成这些软件包可能是不值得的,特别是如果您可以在更短的时间内手动创建所有这些软件包。或者如果你需要为一个场合创建一个复杂,独特的包,Biml肯定不是适合这项工作的工具。

大纲

在本教程中,我们将介绍该语言的基础知识,并向您展示如何一次生成多个包。在本教程结束时,您将能够创建Biml文件,这些文件可以自动创建包以将数据从一个服务器转移到另一个服务器。本教程假设您已经知道SSIS包是什么以及它们如何工作。如果需要复习,可以查看 SQL Server Integration Services(SSIS)教程或 SQL Server Integration Services SSIS 2016教程

高级大纲如下:

  • 可用的工具和安装
  • Biml语言基础知识
  • 生成一个简单的包
  • BimlScript基础知识
  • 使用GetDatabaseSchema检索元数据
  • 处理关系对象
  • Biml和分层方法
  • 创建目标表
  • 一次生成多个包

您可以使用左侧的轮廓浏览教程或使用箭头“上一个”和“下一个”。

附加信息

Biml教程可用的工具和安装

概览

在我们开始教程之前,我们需要一个开发环境和示例数据。本章介绍如何设置机器以使用Biml。

开发Biml代码

在第一章中,提到Biml是一种开源XML方言。该语言由Varigence开发 ,它们提供了与Biml一起使用的各种工具:

  • BimlExpress 是Visual Studio的免费插件。它可以免费使用,但需要先注册。我们将在本教程中使用此工具。
  • BimlOnline 是一个免费使用的在线工具,用于开发Biml脚本。它不需要您安装任何软件。
  • BimlStudio 是Varigence出售的专有工具。它是Biml的一个成熟的开发环境,并且具有许多免费替代方案中没有的功能,例如生成Analysis Services模型,生成文档和元数据模型。

在BimlExpress之前,Biml附带了开源Visual Studio扩展 BidsHelper (现在已经重命名为 BI Developer Extensions)。如果您有较旧版本的Visual Studio(2005或2008),则可以使用BidsHelper插件来创建Biml脚本。但是,建议使用BimlExpress,因为它具有更好的语法突出显示和自动完成功能。

首先,您需要在计算机上安装Visual Studio版本。如 SQL Server Integration Services SSIS版本和工具一章中所述 ,您可以使用安装了SQL Server数据工具(SSDT)模板的完整版Visual Studio(专业版,社区版,…),也可以使用shell只安装SSDT时的Visual Studio。最新版本的SSDT可以在 这里下载 。但是,在撰写本文时,BimlExpress扩展尚不适用于Visual Studio 2017。

BimlExpress可以在这里下载 。安装完成后,BimlExpress菜单将添加到标题栏:

bimlexpress菜单

您还可以选择添加BimlExpress工具栏:

工具栏

在新项目中,单击左侧的第三个图标,将新的Biml文件添加到项目中。

新的Biml文件

Biml教程Biml语言基础知识

Biml文件的顶部是实际的Biml代码,底部是编译代码的预览。现在,它们是相同的,但在本教程的其余部分中,我们将了解预览窗格的用途。

样本数据

在本教程中,我们将使用AdventureWorks2017数据库作为登台环境的源。您可以从 Github网站下载备份文件 。

附加信息

  • 您可以在Varigence网站上找到所有Biml产品的概述 。

Biml教程Biml语言基础知识

概览

在本章中,我们将了解Biml语言的基础。

这都是XML

如前所述,Biml基本上是XML。这意味着它遵循XML的层次结构。让我们用一个例子来说明。这篇Biml描述了一个包含一个连接和一个执行SQL任务的简单包:

简单的Biml文件

该脚本以Biml根节点开始,然后添加子节点。简化后,Biml的层次结构可以用这个模式表示:

Biml的层次结构

Biml节点可以具有连接,文件格式(与平面文件一起使用)和包。包具有任务,容器和容器可以包含任务。

数据流是一项特殊任务,它有自己的一组子节点:

数据流的层次结构

此架构仅代表SSIS包的基础知识。使用Biml,您可以指定您还可以在Visual Studio中手动创建的每个构造:事件处理程序,日志提供程序,连接管理器,程序包参数,变量,表达式,脚本任务等。唯一值得注意的例外是 项目参数,可以在Biml中指定,但实际上不会生成。

您可以在官方文档中找到有关Biml语言元素的更多信息 。

由于它是XML,Biml必须遵守一些规则。每个元素都有一个开头和一个结束标记,或者它是一个空标记。元素可以具有零个或多个属性。

带有元素和属性的xml结构

请记住,某些字符是XML中的保留字符。它们需要用转义码替换:

字符 逃脱代码
双引号“ "
单引号’ 者;
< &LT;
> &GT;
&安培;

您也可以在Biml中指定注释,就像在XML中一样:

在Biml发表评论

为何选择XML?

Biml使用XML,因为SSIS包也是幕后的XML。您可以通过右键单击包并选择“ 查看代码”来验证这一点。

查看代码

但是,Biml的XML比用于SSIS包的XML模式简化得多。它当然更具可读性; 你可以根据需要手动编写它。这使得Biml成为自动创建SSIS包的理想起点。比较Biml文件(例如通过源代码控制)和重用代码也更容易。在下一章中,我们将编写一些Biml代码来生成我们的第一个包。

附加信息

Biml教程生成一个简单的包

概览

在上一章中,我们看到了可用于编写Biml代码的工具以及此XML方言的基础知识。现在让我们弄清楚并写一些Biml代码来生成一个包。在本章中,我们将编写Biml,它将创建一个简单的staging包。

创建连接

第一步是定义连接。以下Biml脚本创建两个连接:一个连接到AdventureWorks数据库,另一个连接到登台数据库。确保连接字符串对您的环境有效。

连接字符串

尝试键入Biml元素以了解intellisense的工作原理。您可以使用本章末尾的Biml代码下载整个脚本。

连接元素的CreateInProject属性指定连接是否需要是项目连接管理器。如果不是,则连接管理器将添加到引用它的每个包中。

下一步是创建实际的包。在这里,我们将Person.Person表中的数据从AdventureWorks传输到登台数据库。首先,我们需要创建Packages元素,然后创建一个 Package节点。在包中,我们在其自己的元素中指定各种Tasks。

Biml中一个简单的staging包的结构

Package元素的ConstraintMode属性指定控制流内的所有任务是默认为并行还是线性。我们还添加了一个将截断目标表的执行SQL任务。在这个例子中,我们使用DirectInput方法,但其他选项也可以工作(从变量或文件)。DirectInput标记之间的内容是将由任务执行的实际T-SQL语句。在任务中,我们还需要指定它将使用哪个连接,这通过将Target指定为连接名称来完成。

现在我们需要添加数据流。在这里,我们保持简单:只有一个OLE DB源和目标。在源组件中,我们通过DirectInput和源连接指定T-SQL语句。在目标中,我们指定目标连接和我们要写入数据的表。这是使用ExternalTableOutput元素完成的 。

如果未指定任何映射,Biml将使用列名自动映射目标中的列。默认情况下,OLE DB目标将使用快速加载选项。

对于数据流,我们使用了属性AutoAdjustBufferSize 和DefaultBufferMaxRows。您可以 通过SSIS AutoAdjustBufferSize属性了解有关提高数据流性能的更多信息 。

我们需要做的就是编译Biml代码并让它生成包。您可以通过右键单击Biml文件并选择Generate SSIS Packages来完成此操作

生成ssis包

输出窗口将显示Biml代码的扩展何时完成且包已生成:

输出窗口

打开包装时,您会发现它与任何其他SSIS包一样。没有迹象表明它是从头开始生成的。

生成包

当然,通过编写Biml代码手动创建包不是有效的,当然也不比在Visual Studio设计器中自己创建它们更快。在接下来的章节中,我们将学习如何通过使用BimlScript(Biml和C#的混合物)和元数据来实现自动化。

附加信息

  • 您可以从本章下载脚本BIML 这里

Biml教程BimlScript基础知识

概览

在本教程的这一部分中,我们将介绍BimlScript。这是C#和Biml代码的混合,它允许我们一次创建多个对象。

自动化Biml

手动创建许多SSIS包很繁琐。手动编写Biml代码也很繁琐。但是,通过将C#代码块插入Biml代码,我们可以自动执行大部分Biml代码。让我们用一个例子来说明。

在下面的Biml脚本中,我们插入了一个简单的 for循环,从1开始到5结束。在循环的每次迭代中,我们创建一个新的包。

Bimlscript的例子

在循环内部,常规Biml代码用于创建包元素。C#和常规Biml的组合称为BimlScript。保存代码后,预览窗口将显示扩展的Biml。这是在验证,编译和执行所有C#代码时收到的Biml代码:

扩展Biml

使用C#非常强大,因为语言的所有功能都可用于生成Biml代码。您可以使用所有可以使用的程序集(可能需要添加一些引用),函数,类等。您可以从数据库中读取,写入文件,创建列表等。请注意,也可以使用Visual Basic而不是C#。这需要在Biml文件的顶部指出:

请改用VB

与XML一样,C#也有需要转义的特殊字符。

字符 逃脱代码
双引号“ \”
单引号’ \”
反斜线 \\

与任何编程语言一样,您可以在代码中添加注释,这是记录Biml代码的好习惯。

BimlScript中的评论

指令和代码块

Biml文件中的编程语言元素称为指令和代码块。指令是关于如何处理Biml文件的Biml引擎的指令。它们包含在<#@#>之间。在上一段中,我们展示了语言指令:切换到VB编程语言。您还可以使用指令导入程序集或名称空间。一些例子:

指令示例

有不同类型的代码块。第一个是具有<##> 标签的控制代码块。这个块通常包含标准的C#代码。

不同的掘金

另一个金块是文本代码块。此块通常会计算表达式并将其作为字符串返回。它有<#= 和#>标签。在上面的例子中,这样的nugget检索变量i的值。

类代码块是用来定义编程对象,诸如类或方法。它们通常用于在Biml解决方案中重用C#代码。他们有<#+#> 标签。下面的示例创建一个名为NumberOfColumns的函数,该函数返回表的列数。

类代码块

要生成包含有用内容的多个包,C#代码需要使用实际的元数据。在下一章中,我们将找出可以检索元数据的位置。

附加信息

  • BimlScript 网站有关于如何创建脚本BIML教程吨,代码片段和演练的。

Biml教程使用GetDatabaseSchema检索元数据

概览

当您可以使用元数据生成包时,BimlScript会变得非常有趣。例如,您可以从元数据存储库中读取源表和目标表详细信息,并为每个条目创建SSIS包。在本章中,我们将了解如何使用扩展函数轻松检索数据库模式。

获取元数据

Biml有几个扩展功能可以帮助您进行开发。其中一个函数是GetDatabaseSchema函数。此函数将读取给定连接的整个数据库架构。您还可以传递参数以排除模式或表。此外,您还可以指定是否需要包含视图,列默认值,外键等。

让我们尝试阅读AdventureWorks数据库的数据库模式。

读取数据库架构

首先,我们需要创建一个连接对象,我们称之为SourceConnection。然后我们调用GetDatabaseSchema函数,不带任何参数。这将从数据库中读取所有元数据对象。我们可以通过在XML注释中显示模式和表名来验证这一点。预览窗格显示完整的表列表:

所有的表格

GetDatabaseSchema函数也可以处理输入参数。我们只读取HumanResources架构的元数据并跳过某些元数据对象,例如外键和列默认值:

带有导入选项的getdatabaseschema

使用ImportOptions,您可以控制GetDatabaseSchema函数的行为。您可以在博客文章 Biml Extension Methods:GetDatabaseSchema中找到有关它们的更多信息 。

其他方法

GetDatabaseSchema不是将元数据读入Biml的唯一选项。有类似的方法: ImportTableNodes和ImportDB。ImportTableNodes只能从一个模式的表中导入元数据。ImportDB类似于GetDatabaseSchema,但使用通配符而不是列表来限制元数据。但是,GetDatabaseSchema的灵活性和性能使该功能成为首选。

其他选项是在某处手动输入元数据,例如在Excel文件,表格或主数据服务中。使用C#功能,您只需将您需要的数据读入Biml。当您需要来自关系数据库(如SQL Server)的元数据时,可以使用元数据视图,如sys.columns(来自SQL Server)或INFORMATION_SCHEMA.COLUMNS(受不同数据库供应商支持)。所有这些选项的详细处理超出了本教程的范围。

在下一章中,我们将使用GetDatabaseSchema的结果在Biml中创建关系对象。

附加信息

  • 本章中使用的脚本可以在此处下载 。

Biml教程使用Biml创建关系对象

概览

在本教程之前,它并没有真正详细解释过,但是在Integration Services包旁边,Biml也可以生成其他对象。如果使用BimlStudio,则可以创建Analysis Services模型,但也可以在内存中创建关系对象(如表和列)。将这些对象放在内存中可以帮助您稍后创建包。

创建数据库和模式

来自关系数据库的任何对象都可以在Biml中建模。让我们从目的地开始:登台数据库。我们可以使用以下代码定义数据库和模式:

在Biml中创建数据库和模式

数据库链接到我们首先定义的连接。dbo架构也链接到数据库。由于只有一个数据库和模式,我们手动输入代码。表格将根据元数据创建。

创建表

现在我们将使用我们在前一章中学到的GetDataseSchema函数。以下代码段从AdventureWorks数据库中获取所需的所有元数据。

获取元数据

现在我们将遍历所有表并在Biml中创建它们以及它们各自的列。后一部分是使用GetBiml完成的,GetBiml是一种生成创建对象所需的Biml代码的扩展方法。

创建表和列

这些表链接到先前定义的模式和数据库。保存脚本后,可以在预览中检查展开的Biml代码。

在内存中创建表

如您所见,GetBiml方法创建了必要的Biml代码,以将列添加到表中。您可能会注意到,某些列没有定义数据类型。这是典型的Biml行为:如果未指定属性,则采用默认值。对于列,默认数据类型为 Int32

所有这些表和列现在都存在于内存中,这意味着您可以在代码中的其他位置引用它们。例如,您可以获取特定表或CREATE TABLE语句的SELECT语句。在下一章中,我们将创建一个SSIS包,它将在目标数据库中创建所有目标表。但首先,我们将讨论Biml解决方案的分层方法。

Biml Tutorial Biml和分层方法

概览

通常,您的Biml解决方案不会存在于一个大型Biml脚本中,而是存在于几个Biml文件中,其中每个文件都有特定用途。在本章中,我们将介绍通常可以在Biml项目中找到的不同层。

Biml和Tiers

在Biml中,您可以引用先前创建的对象。例如,您可以引用连接并将该连接用于GetDatabaseSchema 函数,而不是创建新连接。例如,在前面的章节中我们有以下代码:

创建新连接

在此代码示例中,创建了一个名为sourceConnection的新连接。但是,您的SSIS包中已经使用了相同的连接。那么为什么要创建一个新的,而不是使用现有的连接管理器?假设我们已经在一个单独的文件中创建了一个名为Source的Biml连接对象:

环境文件

然后代码可以更改为:

重用连接管理器

这使您的代码更短,更易读,更可重用。但是,当您尝试此代码时,可能会出现以下错误:

空连接

怎么了?Biml找不到我们在另一个Biml文件中定义的Source连接。很可能Biml编译器首先消耗错误的Biml文件,因此它在内存中找不到Source连接。我们可以通过指定来解决这个问题。层指示Biml编译器应以何种顺序扩展Biml文件。例如,我们创建连接的环境文件变为第10层,而另一个文件变为第20层:

biml源代码

Biml然后处理从最低层到最高层的文件。如果未指定任何层,则不包含BimlScript的Biml文件具有层0,而具有BimlScript的文件具有层1.一旦开始在不同Biml文件之间引用对象,建议明确指定层。

Biml和不同的层次

当我们手动创建SSIS包时,我们需要遵循特定的顺序。首先,我们创建源表和目标表(如果它们尚不存在)。然后我们创建包,最后我们可以选择创建一个执行所有其他包的主包。在Biml中,我们需要遵循相同的步骤:

  1. 设置环境:创建连接,也可以创建静态对象,例如数据库和模式。
  2. 读取元数据并在内存中创建表对象。
  3. 创建目标表。如果OLE DB目标中使用的表不存在,则Biml无法生成SSIS包。
  4. 创建包。

通常,我们可以在一个步骤中组合步骤1和2,如上一节所述。只有在定义了层时它才会起作用。一次编译多个Biml文件是通过在选择Biml文件时按住CTRL同时选择文件来完成的。然后右键单击文件并选择“ 生成SSIS包”

一次编译多个文件

当我们想要生成SSIS包时,我们还需要包含环境文件(步骤1),否则无法创建连接管理器。如果项目包含许多Biml文件,那么哪个Biml文件包含在哪个步骤中会让人感到困惑。您可以使用以下命名约定来帮助您。

  • 1-2环境
  • 1-2阅读元数据和创建表
  • 1-x创建目标表
  • x-2创建分段包

1-2表示步骤1和步骤2需要该文件.1-x告诉我们仅步骤1需要Biml代码.x-2表示只有步骤2需要Biml文件。带符号1的文件-xx-4表示步骤1和步骤4中需要Biml文件。

在下一章中,我们将使这些层工作并在登台数据库中生成目标表。

附加信息

Biml教程创建目标表

概览

我们差不多都在教程的最后。我们现在知道如何读取我们想要传输的表的元数据以及如何在内存中创建这些表的代表对象。下一步是在目标表中创建所有这些表。如果表实际上不存在,Biml无法生成SSIS包。

创建目标表

解决方案是创建一个SSIS包,其中包含我们要创建的每个表的执行SQL任务。第一步是创建一个包含连接,数据库和模式的环境文件。为了简单起见,我们将保留与AdventureWorks数据库中相同的模式。此文件具有 第10层

创造环境

下一个Biml文件从AdventureWorks数据库中获取元数据,正如我们在前面的章节中看到的那样。它使用环境文件中的Source连接。这些表也在内存中创建。该文件具有第20层

导入元数据并在内存表中创建

第三个文件将创建实际的SSIS包。甲的foreach环被放置在内部任务元件,因此它可以创建新的执行SQL任务的循环的每次迭代。此文件具有第30层

用于创建目标表的biml

如您所见,实际的Biml代码非常短。神奇来自 GetDropAndCreateDdl扩展方法。它创建一个有效的DDL语句,如果目标表已经存在,将删除该目标表,然后再次创建该表。扩展的Biml看起来像这样:

create table包的预览

剩下的就是选择所有三个Biml文件并生成包。

生成包

一个包添加到项目中。它为AdventureWorks的每个表包含一个执行SQL任务。

最后的包裹

运行包后,我们可以看到已在目标数据库中创建了表:

创建了所有表格

附加信息

  • 您可以在 此处下载本章中使用的三个Biml文件 。

Biml教程一次生成多个包

概览

在本教程的最后一章中,我们将完成用于生成暂存环境的Biml解决方案。在上一章中,我们创建了三个文件:

  • 一个创造环境
  • 一个用于获取元数据并在内存中创建表
  • 一个用于创建将创建目标表的SSIS包

运行SSIS包后,我们有一个带空表的临时数据库。现在我们将生成所有SSIS包 – 每个临时表一个 – 将数据从AdventureWorks传输到临时数据库。

生成SSIS包

假设我们已经有了介绍中提到的三个Biml文件,我们需要做的就是创建一个最终的Biml文件来生成那些SSIS包。 可以在本章末尾找到下载所有文件的链接。

该文件包含以下代码:

用于生成登台包的biml

该文件具有第40层。使用的模式是直截了当的:

  • 截断目标表。
  • 在数据流中,读取源表中的所有数据并将其写入登台表。

同样,扩展方法用于简化代码。该GetSelectSql 方法创建从表中获取所有列的SQL SELECT语句。该包的ConstraintMode设置为线性,这意味着第二个任务在第一个任务之后。

扩展的Biml看起来像这样:

扩展Biml

文件名是“x-2 Generating Staging Packages.biml”。名称中的x表示解决方案的第一步(创建目标表)不需要Biml脚本。要生成所有临时包,请选择环境文件,元数据文件和新Biml文件,右键单击并选择“ 生成SSIS包”

生成所有包

在编译期间,编译器可能会询问您是否要覆盖项目连接管理器(在生成目标表的包时创建)。

覆盖项目

它将为每个生成的包询问此问题,因为每个包都尝试创建项目连接管理器。因为它已经存在,点击全选 在顶部,然后再次单击它来删除所有选择。

当Biml编译了所有软件包 – 这可能需要一些时间 – 它们都被添加到项目中。

生成所有包

包的控制流程如下所示:

控制流

数据流:

数据流

结论

我们已经到了本教程的最后。很明显,Biml可以帮助在瞬间生成相同模式的许多包。使用Biml将清除您日程安排中繁琐的手动工作,因此您可以专注于数据项目中更难的挑战。

附加信息

 

25 total views, 2 views today

Author: Albert

Leave a Reply