本篇文章是Integration Services系列的第十五篇,详细内容请参考原文。
简介
在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到SSIS 2012.
在这一篇,我们将探讨SSIS变量的姊妹:SSIS参数。我们将展示参数配置,通过包参数管理动态属性值,以及在SSIS包执行期间参数是如何配置和使用的。
首先在SSDT-BI打开转换过的My_First_SSIS_Project,如图15.1所示:
图15.1
My_First_SSIS_Project打开,解决方案资源管理器如图15.2所示:
图15.2
SSIS Parameters 101
SSIS参数和SSIS变量非常相似。在SSIS 2012中变量和参数可以互换使用。它们之间有一些不同点:
->一旦SSIS包开始执行,参数仅供只读
->参数的作用域是项目和包级别
->参数拥有一个'敏感'属性
->参数拥有一个'必需'属性
->因为SSIS包开始执行后,参数仅供只读,不能使用表达式控制参数的值
Project Parameters
项目参数能被SSIS项目中的任何SSIS包使用/消耗。它们只能在项目部署模型中使用。
项目部署模型是SSIS 2012新引入的。项目参数是项目部署模型的一个新特性。其他的特性包括包参数、项目连接管理、SSIS 2012目录部署。
在解决方案资源管理器,双击Project.params对象,打开项目参数,如图15.3所示:
图15.3
项目参数窗口提供一个包含三个按钮的工具栏:
->添加参数
->删除参数
->将参数添加到配置中
添加参数
点击添加参数按钮添加一个新的项目参数到My_First_SSIS_Project项目:
图15.4
一个叫做"Parameter"的项目参数添加到SSIS项目,这是默认的参数名称,图15.4显示了参数的默认属性值:
数据类型:Int32
值:0
敏感:Flase
必需:Flase
说明:[空]
参数和变量共享很多数据类型,但不是全部,图15.5显示了参数和变量的所有数据类型:
图15.5
初略扫视一下发现参数的数据类型是变量的数据类型的子集。
The Value property of a parameter is checked for data type consistency once the Value cell loses focus.如果我选择数据类型为"Int32",然后在值单元键入"NaN",当我点击其他单元格时会得到图15.6所示的错误:
图15.6
敏感属性是一个布尔值且默认是Flase.将这个属性设置为True会将参数的值当作敏感。如果是True,SSIS 2012会使用项目保护级别中指定的方法加密参数的值。你可以在解决方案资源管理器下,右击项目选择属性(图15.7),访问项目保护级别属性和其他项目属性:
图15.7
点击属性会打开My_First_SSIS_Project属性页。一旦属性页显示,你可以通过点击ProtectionLevel属性文本框中的省略号设置项目保护级别,如图15.8所示:
图15.8
注意图15.8:一旦敏感属性设置为True,参数的值属性就会被隐藏。
必需属性是一个布尔值且默认是False.当设置为Flase,参数对SSIS项目执行不是必需品。当设置为True,必需为参数提供一个值。
说明属性用于解释参数的目的、使用和可选值等。
为了演示,我配置这个参数如下:
名称:Parameter
数据类型:Int32
值:0
敏感:True
必需:True
说明:Test Parameter
图15.9
删除参数
删除参数按钮会将选中的参数从项目参数中移除。如图15.10所示,显示警告信息,除非你勾选了"不再显示此消息"复选框(建议不要勾选此复选框),告知数据集成开发者项目参数删除后,使用该参数的包可能无法执行:
图15.10
包参数
在我们讨论SSIS包参数前,让我们在项目中添加一个新SSIS包。解决方案资源管理器中,右击项目名称并点击"新建SSIS包",如图15.11所示:
图15.11
重命名新SSIS包为LoadWeatherData.dtsx,如图15.12所示:
图15.12
重命名SSIS包会在SSDT-BI中打开此包。包参数在参数页签中配置,如图15.13所示:
图15.13
在我们配置SSIS包参数前,让我们获取一些真实数据。你可以访问这个地址(http://andyweather.com/data/WeatherData_Dec08.zip)获取一个真实数据文件。
解压获取的文件到你想存放的路径。它包含一个逗号分隔(CSV)文件sensor1-all.我是在My_First_SSIS_Project的SSIS解决方案目录创建一个data文件夹:
图15.14
Sensor1-all.csv包含Farmville Virginia地区收集的天气数据。我喜欢它,因为它是真实数据,而不是样例数据。It’s messy. No one’s data is as clean as most sample databases out there.
包参数的创建和项目参数类似。让我们创建一个包参数,下面是参数的属性值:
名称:SourceFilePath
数据类型:String
值:sensor1-all.csv存放位置
敏感:False
必需:True
说明:Weather data source file
图15.15
接着让我们回到控制流面板,并添加一个数据流任务,如图15.16所示:
图15.16
重命名数据流任务为"DFT Stage Temperature and Humidity",如图15.17所示:
图15.17
双击"DFT Stage Temperature and Humidity"打开数据流。从SSIS工具箱,展开其他数据源条目,拖取一个平面文件源到数据流任务面板。重命名平面文件源为"FFSrc Temperature and Humidity",如图15.18所示:
图15.18
双击"FFSrc Temperature and Humidity"打开平面文件源编辑器,如图15.19所示:
图15.19
这个SSIS包中没有平面文件连接管理器。点击新建按钮创建并配置一个新的平面文件连接管理器,如图15.20所示:
图15.20
注意:点击新建按钮会发生下面两件事:
1、连接管理器页签会添加一个新的平面文件连接管理器
2、会打开新的平面文件连接管理器编辑器
重命名连接管理器名称为"FFCM Temperature and Humidity"点击浏览,导航到sensor1-all.csv文件存放位置,打开文件对话框中修改文件类型筛选为"*.csv",就可以看到sensor1-all.csv文件,选择它并点击打开按钮,如图15.21所示:
图15.21
平面文件连接管理器常规页的文件名文本框会显示ensor1-all.csv文件的完整路径。确保勾选上在第一个数据行中显示列名称,如图15.22所示:
图15.22
列页不要做任何修改。注意你可以设置行和列分隔符,并且你可以看到变更的预览,如图15.23所示:
图15.23
图15.24显示了平面文件连接管理器编辑器的高级页。我们也不会对这个页面做任何修改,但是我们可以先观察。在这里你可以为个别列修改列名、指定列分隔符。你也可以修改数据类型属性。默认,所有的平面文件连接管理器的列都是设置为长度为50的字符串类型:
图15.24
平面文件连接管理器的预览页允许你配置连接管理器跳过部分数据行数。它同样提供网格形式预览前100行的数据,如图15.25所示:
图15.25
点击确定按钮完成文件连接管理器的配置,并返回到平面文件源编辑器,如图15.26所示:
图15.26
点击确定按钮关闭平面文件源编辑器,"DFT Stage Temperature and Humidity"数据流任务应该如图15.27所示:
图15.27
前行之前,打开SSMS连接到一个SQL Server实例。我使用的是SQL Server 2008 R2,如图15.28所示,我连接到WORK\SQL08R2实例:
图15.28
打开新建查询,键入代码15.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.'
代码15.1
第一次执行代码15.1的结果如图15.29所示:
图15.29
第二次(及随后所有)执行代码15.1的结果如图15.30所示:
图15.30
我们现在可以把温度和湿度数据导入到WeatherData数据库。返回到SSDT-BI,拖一个OLE DB目标到数据流面板,如图15.31所示:
图15.31
使用数据流路径连接"FFSrc Temperature and Humidity"平面文件源与OLE DB目标。重命名OLE DB目标为"OLEDest Stage Temperature",如图15.32所示:
图15.32
双击"OLEDest Stage Temperature"打开OLE DB目标编辑器,如图15.33所示:
图15.33
这个包暂时没有配置OLE DB连接管理器。点击新建按钮,打开"配置OLE DB连接管理器"窗口,如图15.34所示:
图15.34
我这里之前有配置一个LUEST\SQL08R2.TestDB的数据连接。点击右下方的新建按钮来创建一个新的连接管理器配置。在"服务器名",选择会输入WeatherData数据库所在的实例名称。在"选择或输入数据库名称",选择或输入WeatherData,如图15.35所示:
图15.35
点击确定按钮关闭"连接管理器",点击确定关闭"配置OLD DB连接管理器"窗口。OLE DB目标编辑器应该如图15.36所示:
图15.36
我们保留"数据访问模式"为"表或视图"。"表或视图的名称"为空,如图15.37所示:
图15.37
点击表或视图名称旁边的新建按钮打开创建表窗口,如图15.38所示:
图15.38
编辑语句,移除表名中的OLEDest及空格,同时移除列名中的空格,如代码15.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)
)
代码15.2
CREATE TABLE语句是由连接平面文件源和OLE DB目标的数据流路径传入的元数据构建。当用代码15.2修改后,创建表窗口如图15.39所示:
图15.39
当你点击确定按钮关闭创建表窗口,CREATE TABLE语句将在数据库中执行,创建StageTemperature 表。
点击OLE DB目标编辑器的映射页,如图15.40所示:
图15.40
注意在Date和Time的输入和目标列有自动映射。为什么?因为这些列有相同的名称和数据类型。
目标表是由OLE DB适配器的输入所收集的元数据创建。如果你双击数据流路径,你会发现一个元数据页,如图15.41所示:
图15.41
但是记住,我修改过目标列名称。因此输入列包含空格,而大部分目标列没有空格。
在映射页有很多方法可以映射列。一个方法是从可用输入列拖取列名到可用目标列(反之亦行)。另一张方法如图15.42所示,通过下拉分配可用输入列给目标列:
图15.42
一旦映射完成,点击确定按钮关闭OLE DB目标编辑器,你的数据流应该如图15.43所示:
图15.43
我们已经准备执行,最后一步是映射SourceFilePath包参数到"FFCM Temperature and Humidity"平面文件连接管理器的ConnectionString属性。为了完成这个,点击"FFCM Temperature and Humidity"平面文件连接管理器然后按F4显示连接管理器属性。注意ConnectionString属性指向之前选择的路径。为了动态绑定这个属性到SourceFilePath包参数,点击表达式属性值文本框的省略号,如图15.44所示:
图15.44
这将打开属性表达式编辑器,Expressions allow developers to map expressions into property values dynamically at runtime.我们通过选择ConnectionString属性将SourceFilePath包参数的值映射给"FFCM Temperature and Humidity"平面文件连接管理器的ConnectionString属性,如图15.45所示:
图15.45
点击表达式文本框中的省略号,打开表达式生成器,如图15.46所示:
图15.46
展开变量和参数虚拟文件夹,将包参数$Package::SourceFilePath拖动到表达式文本框。点击计算表达式按钮,查看$Package::SourceFilePath参数包含的值,如图15.47所示:
图15.47
点击确定按钮关闭表达式生成器,点击确定按钮关闭属性表达式编辑器,如图15.48所示:
图15.48
"FFCM Temperature and Humidity"平面文件连接管理器的ConnectionString属性现在是由SourceFilePath包参数($Package::SourceFilePath)动态生成,如图15.49所示:
图15.49
按F5执行包并测试加载数据,如果一切按计划,你的数据流应该如图15.50所示:
图15.50
停止调试器,让我们移动源文件。在文件的当前位置创建一个名叫Dec08的新文件夹并将sensor1-all.csv移动到新文件夹下,如图15.51所示:
图15.51
返回到SSIS包并按F5再次执行包。它应该会失败,显示的错误消息类似图15.52所示:
图15.52
停止调试,返回到包参数页签,修改SourceFilePath参数的值包含Dec08文件夹,如图15.53所示:
图15.53
现在再次执行包,你的结果应该类似图15.54所示:
图15.54
Test successful! We’ve made the path to the source file dynamic and used a package parameter to do so.
总结
在这一篇,我们探索了SSIS参数,参数配置,通过包参数管理动态属性值,以及在SSIS包执行期间参数是如何配置和使用的。