SSIS学习使用十五:SSIS参数概述,项目参数,包参数及使用包参数构建动态属性

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

翻译参考

本文主要参考翻译自 The Stairway to Integration Services 系列文章的原文 An Overview of SSIS Parameters - Level 15 of the Stairway to Integration Services,目的在于对 SSIS 有一个全面清晰的认识,所有内容在原文的基础上进行实操,由于版本差异、个人疑问等多种原因,未采用完全翻译的原则,同时也会对文中内容进行适当修改,希望最终可以更有利于学习和了解 SSIS,

感谢支持!


在本文中,我们将探讨 SSIS变量 的第一个表亲:SSIS参数。演示参数配置,通过 包参数 进行动态属性值管理以及在 SSIS包 执行过程中如何配置和使用参数。

首先,打开之前的第一个项目FirstSSIS

SSIS参数介绍

SSIS参数101(SSIS Parameters 101)

SSIS参数 与 SSIS变量 非常相似。在整个 SSIS 2012 中,变量和参数可以互换使用。但是有一些重要的区别:

  • SSIS包开始执行后,参数为只读。
  • 参数的作用域(或范围)在“项目”和“包”级别(Project and Package level)。
  • 参数具有敏感属性(Sensitive attribute)。
  • 参数具有必须属性(Required attribute)。
  • 由于SSIS包开始执行后,参数是只读的,因此无法使用表达式来控制参数值。

项目参数(Project Parameters)

SSIS项目中包含的任何 SSIS包 都可以使用项目参数(Project parameters)。它们只能在 项目部署模型(Project Deployment Model) 的上下文中使用。

SQL Server 2012 Integration Services 中的项目部署模型是新增的。项目参数是项目部署模型的一项新功能。其他功能包括包参数,项目连接管理器,以及部署到新的 SQL Server 2012 Integration Services 目录。

在解决方案资源管理器中,双击解决方案资源管理器中的 Project.params 对象以打开“项目参数”,如图所示:

“项目参数”窗口提供了一个包含三个按钮的工具栏:

  • 添加参数-Add Parameter
  • 删除参数-Delete Parameter
  • 将参数添加到配置-Add Parameters to Configurations

添加参数(Add Parameter)

单击 "添加参数" 按钮,将新的项目参数添加到 FirstSSIS SSIS项目。

名为 “Parameter” 的新项目参数将添加到SSIS项目。这是默认参数名称(Name),该参数的默认属性设置:

  • 数据类型-Data Type: Int32
  • 值-Value: 0
  • 敏感-Sensitive: False
  • 必需-Required: False
  • 说明-Description: [Empty String]

参数和变量 共享许多数据类型,但不是全部 —— 如下图所示,参数数据类型在左侧,变量数据类型在右侧:

对两个列表进行扫描后发现,参数数据类型是变量数据类型的子集。参数和变量共有以下数据类型:

  • Boolean
  • Byte
  • DateTime
  • Decimal
  • Double
  • Int16
  • Int32
  • Int64
  • SByte
  • Single
  • String
  • UInt32
  • UInt64

变量数据类型(Variable data types)独有的是:

  • Char
  • DBNull
  • Object

一旦 “值”单元格 失去焦点,就检查参数的“值”属性的数据类型一致性。如果选择数据类型“Int32”并在“值”单元格中输入“NaN”,则当导航到Project.params网格中的另一个单元格时,会出现下图所示的错误:

敏感属性是一个布尔值(True或False),默认为False。将此属性设置为True会将参数值标记为敏感。如果为True,则 SQL Server 2012 Integration Services 将使用 “Project ProtectionLevel” 设置中指定的方法对该值进行加密。

可以通过在解决方案资源管理器中,右键单击该项目,然后单击"属性"(Properties),来访问项目(Project)ProtectionLevel属性和其他项目属性。

单击"属性"将显示FirstSSIS属性页。显示属性页后,​​可以通过单击ProtectionLevel属性文本框中的省略号来设置 Project ProtectionLevel 属性。单击省略号将显示“项目保护级别”窗口,如下图:

请注意:当"敏感"(Sensitive)属性设置为True时,Parameter的Value属性将被屏蔽。

"必需"(Required)属性是一个布尔值(True或False),默认为False。设置为False时,SSIS项目执行不需要该参数。当设置为True时,必须为SSIS项目执行提供参数值。

"说明"(Description)属性提供了一种记录参数目的、使用和可选值的描述。

a means of documenting the purpose, usage, and optional values

出于演示目的,将参数配置为:

  • Name: Parameter
  • Data Type: Int32
  • Value: 0
  • Sensitive: True
  • Required: True
  • Description: Test Parameter

删除参数(Delete Parameter)

“删除参数”按钮将从存储在Project.params对象中的“项目参数”集合中删除所选参数。

如图所示,会显示警告,通知数据集成开发人员使用项目参数的程序包可能无法执行,除非通过选中“不再显示此消息”复选框将其覆盖(建议不要选中此复选框)。

包参数(Package Parameters)

配置新SSIS包

创建SSIS包

在开始讨论 SSIS包参数 之前,让我们向项目添加一个新的SSIS包。

在解决方案资源管理器中,右键单击项目名称下的"SSIS包",然后单击 “新建SSIS包”(New SSIS Package),如图所示:

重命名新包名为 "LoadWeatherData"。打开该包,包参数(Package parameters) 的配置位于 "参数"(Parameters) 选项卡下。

在配置SSIS包参数之前,我们先获取一些真实数据。你可以通过访问该链接访问包含实际数据的文件(andyweather.com/data/Weathe…

将文件解压缩到选择的位置。它包含一个名为 sensor1-all 的逗号分隔值(comma-separated values——CSV)文件。如下,在 FirstSSIS 的SSIS解决方案目录中创建了一个名为 data 的新文件夹:

Sensor1-all.csv 包含从我在弗吉尼亚州法姆维尔的个人气象站收集的测量值。每当我训练人们使用SSIS开发数据集成解决方案时,我都会使用这些数据。我喜欢它,因为它是真实数据,而不是示例数据。它是混乱的。没有人能像大多数样本数据库那样干净地收集数据。

包参数

包参数的定义与项目参数几乎相同。设置以下参数属性,创建一个包含 sensor1-all.csv 的存储路径的包参数,如图所示:

  • Name: SourceFilePath
  • Data Type: String
  • Value: <the location of sensor1-all.csv on your system>
  • Sensitive: False
  • Required: True
  • Description: Weather data source file

配置数据流

返回控制流,添加一个"Data Flow Task",重命名数据流任务 "DFT Stage Temperature and Humidity",如下:

双击 “DFT Stage Temperature and Humidity” 以打开编辑器。在SSIS工具箱中,展开 “其他源” 类别,然后将 "平面文件源"适配器 拖到 “数据流任务” 画布上。重命名平面文件源 “FFSrc Temperature and Humidity”。

双击 “FFSrc Temperature and Humidity” 平面文件源适配器以打开编辑器,如图所示。

在此SSIS包中没有配置平面文件连接管理器。单击"新建"按钮以创建和配置新的平面文件连接管理器。

请注意,单击“新建”按钮会发生两件事:

  1. 新的平面文件连接管理器已添加到“连接管理器”选项卡中(在图中指示的);
  2. 此新的平面文件连接管理器的编辑器已打开。

重命名连接管理器“FFCM Temperature and Humidity”。单击浏览按钮,导航到存储 sensor1-all.csv 文件的文件夹,然后在 “打开文件” 对话框中将文件类型过滤器从“*.txt”(默认)更改为“*.csv”。然后 sensor1-all.csv 文件将在文件列表框中显示以供选择,如图所示:

选择 sensor1-all.csv 文件,然后单击“打开”按钮。

现在,“平面文件连接管理器的常规”页面在 “文件名” 文本框中显示sensor1-all.csv文件的完整路径。确保选中 “在第一个数据行中显示列名称” 复选框。

不要在 “列”(Columns) 页面上进行任何更改。注意,可以设置行和列分割符,下方提供了更改的预览,如图所示:

下面显示了 Flat File Connection Manager 编辑器的 "高级"(Advanced) 页面。我们不会在此页面上进行任何更改,但是会进行一些观察。

你可以在此处更改列名称,为各个列指定列定界符(Column Delimiter,分隔符)。还可以更改数据类型属性。默认情况下,所有"平面文件连接管理器"列均设置为长度为50的字符串数据类型:

平面文件连接管理器的“预览”页面允许你配置连接管理器以跳过一些数据行。它还提供了一个网格,可预览前100行数据,如图所示:

单击“确定”按钮,以完成 "FFCM Temperature and Humidity" 平面文件连接管理器配置,并返回到 "DFT Stage Temperature and Humidity" 数据流任务中的平面文件源编辑器。

单击"确定"按钮,以关闭平面文件源适配器编辑器。

创建数据库

在继续之前,请打开 SQL Server Management Studio(SSMS) 并连接到 SQL Server 实例。

在SSMS中打开一个新的查询窗口,然后输入如下 Listing 1 所示的文本:

-- Listing 1
Use master
go
If Not Exists(Select name
              From sys.databases
                  Where name = 'WeatherData')
 begin
  print 'Creating database WeatherData'
  Create Database WeatherData
  print 'WeatherData database created'
 end
Else
 print 'WeatherData database already exists.'
复制代码

Listing 1中包含的 Transact-SQL(T-SQL)检查 SQL Server 实例上是否存在名为 WeatherData 的数据库。如果 WeatherData 存在,则会返回一条存在的消息。如果 SQL Server 实例中不存在 WeatherData 数据库,则会出现“正在创建数据库”的信息,然后创建数据库,完成后返回一条消息,通知已经创建了数据库。

为什么我用这种方式编写T-SQL?这是一个很好的问题。

这是幂等脚本(idempotent script)的示例。幂等意味着可以重复操作而不会改变结果。在数学中,,将 0 加到任何数字,都将永远不会改变总和的值。它是幂等的。

Listing 1中的 Transact-SQL 脚本可以执行和重新执行。无论是第一次还是第十次执行, WeatherData 数据库都将在执行完成时存在。它是幂等的。

在SSMS执行此脚本以确保数据库存在。

现在我们可以将 "temperature and humidity" 数据导入 WeatherData 数据库。

添加OLE DB目标

返回到SSDT-BI。将 "OLE DB目标"(OLE DB Destination)适配器 拖到 Data Flow 页面上,从 “FFSrc Temperature and Humidity” 平面文件源适配器连接一个数据流路径到 “OLE DB目标适配器”,并重命名 "OLE DB目标" 为 "OLEDest Stage Temperature"。如图所示:

双击OLE DB Destination适配器 “OLEDest Stage Temperature”,以打开编辑器。

在此SSIS包中没有配置 "OLE DB连接管理器"(OLE DB Connection Managers)。

单击 “OLE DB连接管理器” 下拉菜单旁边的 “新建” 按钮,打开 “配置OLE DB连接管理器” 窗口,如图所示。

"配置OLE DB连接管理器"中列出了当前项目下其他SSIS包中的OLE DB连接管理器。

单击“新建”按钮,创建新的连接管理器配置。在“服务器名称”下拉列表中,选择或输入包含 WeatherData 数据库的 SQL Server 实例的名称。在“选择或输入数据库名称”下拉列表中,选择或输入WeatherData,如图所示。

单击"确定"按钮,关闭连接管理器编辑器。单击"确定"按钮,关闭“配置OLE DB连接管理器”窗口。现在应显示 “OLEDest Stage Temperature” OLE DB目标编辑器,如图所示:

我们将保留 “数据访问模式” 下拉列表的“表或视图”设置。 “表或视图的名称”(Name of the table or the view)下拉列表为空,点击右侧的"新建,打开 "创建表"(Create Table) 窗口:

编辑该语句,从表名中删除“OLEDest”和空格,并从列名中删除空格,如下面的清单2所示。

-- Listing 2
CREATE TABLE [StageTemperature] (
    [Date] varchar(50),
    [Time] varchar(50),
    [MinT] varchar(50),
    [MaxT] varchar(50),
    [AverageT] varchar(50),
    [MinH] varchar(50),
    [MaxH] varchar(50),
    [AverageH] varchar(50),
    [ComfortZone] varchar(50),
    [MinDP] varchar(50),
    [MaxDP] varchar(50),
    [AverageDP] varchar(50),
    [MinHI] varchar(50),
    [MaxHI] varchar(50),
    [AverageHI] varchar(50)
)
复制代码

CREATE TABLE语句是使用将平面文件源适配器连接到OLE DB目标适配器的数据流路径发送到OLE DB目标适配器的元数据构建的。

当单击“确定”按钮以关闭“创建表”窗口时,将对数据库执行数据定义语言(DDL)CREATE TABLE语句,从而创建 StageTemperature 表。

单击 OLE DB Destination Editor 中的 Mappings 页面,如图所示。

请注意,自动映射发生在 “Date和Time” 输入列和目标列之间。为什么?因为这些列分别具有相同的名称和数据类型。

暂时不确定自动映射的规则。如果输入和目标列之间的列名和数据类型匹配,则会发生自动映射。如果没有,则有时会发生自动映射,有时不会。为什么?

我对规则的最佳猜测是:如果输入列名称与目标列名称匹配,并且SSIS可以将输入数据类型强制为目标数据类型,则会发生自动映射。我根据八年的观察得出了这个假设。我相信,什么是强制性的,什么不是强制性的,这些年来已经发生了变化。我唯一确定的是:我不知道。

目标表是根据从 "OLE DB目标" 适配器的输入中收集的元数据创建的。如果双击从 “FFSrc Temperature and Humidity” 平面文件源适配器和 “OLEDest Stage Temperature” OLE DB目标适配器连接的数据流路径,你将找到一个"元数据"页面。

但是,我通过删除空格来更改了列名。因此,输入列名称包含空格,而大多数目标列名称不包含空格。

有两种方法可以在“映射”页面上映射列。一种方法是将列名从“可用输入列”网格拖放到“可用目标列”网格上(或从“可用目标列”网格拖放到“可用输入列”网格上-拖放映射双向起作用)。下图显示了另一种方法。可以通过下拉列表将各个 Input 列分配给 Destination 列。

映射完成后,单击“确定”按钮,关闭OLE DB目标编辑器。

使用包参数

我们几乎可以执行了。最后一步是将 SourceFilePath包参数 映射到 “FFCM Temperature and Humidity” 平面文件连接管理器的 ConnectionString 属性中。

为此,请单击 “FFCM Temperature and Humidity” 平面文件连接管理器,然后按F4键以显示连接管理器属性。请注意,ConnectionString属性当前被硬编码为我们之前选择的路径。要将此属性动态绑定到SourceFilePath包参数,请在 Expressions 属性值文本框中单击省略号,如图所示:

"属性表达式编辑器"将会显示。表达式(Expressions)使开发人员可以在运行时将表达式动态映射到属性值

"属性"列先选择 ConnectionString 属性,将 SourceFilePath 包参数的值映射到 “FFCM Temperature and Humidity” 平面文件连接管理器的 ConnectionString 属性中。单击“表达式”文本框中的ConnectionString属性的省略号以显示“表达式生成器”窗口:

展开“变量和参数”虚拟文件夹,然后将包参数 $ Package::SourceFilePath 拖到“表达式”文本框中。并点击"确定",关闭生成器窗口。

也可以单击“计算结果值”(Evaluated value)按钮以查看$Package::SourceFilePath参数中包含的值。

单击"确定"按钮,关闭属性表达式编辑器。

现在,“FFCM Temperature and Humidity”平面文件连接管理器的ConnectionString属性动态地与SourceFilePath包参数($Package::SourceFilePath)的值耦合。

按F5键执行SSIS包并测试加载程序,如果一切按计划进行,那么你的数据流应该看起来和如下图所示类似:

停止调试器,然后移动源文件。在文件的当前位置,创建一个名为Dec08的新文件夹,并将sensor1-all.csv文件移动到新的Dec08文件夹中。

返回到SSIS包,然后按F5键重新执行该包。它应该会失败,并显示与图中所示类似的错误。

停止调试器。返回"包参数"(Package Parameters)选项卡,并更改 SourceFilePath 参数的值以包括Dec08文件夹,如图所示。

现在重新执行该包。结果应如图所示。

测试成功!我们已经将源文件的路径设置为动态,并使用 package parameter 来做到这一点。

总结

在本文中,我们探讨了SSIS参数,参数配置,通过包参数进行动态属性值管理以及在SSIS包执行过程中如何配置和使用参数。

猜你喜欢

转载自juejin.im/post/7033196447008817189
今日推荐