阅读 130

SSIS学习使用十三:SSIS变量概述:变量的介绍使用、断点和状态,指定了多个代码页(1252和936)错误

翻译参考

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

感谢支持!


本篇将演示 SSIS变量 部分、变量配置和通过表达式管理动态值。在之前许多练习中我们使用了SSIS变量,但是并没有给与太多的关注。下面将重点介绍下SSIS变量。

新建SSIS项目

打开原本的解决方案。

点击顶部菜单栏中的文件——新建——项目。然后在"商业智能"中选择 Integration Services,新建一个 Integration Services项目

如下,项目名称命名为My_Second_SSIS_Project,同时选择“创建新解决方案”。根据需要指定位置。

点击“确定”创建。

重命名SSIS包 Package.dtsxVariablesAndParameters.dtsx,如下:

从变量开始(Beginning with Variables)

变量的使用和操作

右键"控制流"画布的空白处,选择“变量”。打开 “变量”(Variables) 窗口

第一个按钮是"添加变量"(Add Variable),点击并新建一个变量,重命名为MyVariable

注意变量的 作用域(Scope) 是SSIS包的名字:VariablesAndParameters。一个好的类比是作用域相当于容器(containers)。

如下,有三种作用域:

  1. Task

  2. Container

  3. Package

Tasks, ContainersPackages 是可执行文件(或可执行的)。可执行文件是SSIS中某种类型的对象,拥有属性并可以引发事件。

一个任务总是位于一个容器中(A task always resides within a Container)。“等等,安迪;如果只是将 '执行SQL任务' 放在控制流上是什么情况?”很好的问题:包(Package)也是一个容器

SSIS公开其他容器,即 序列容器(Sequence Container),For循环容器(For Loop Container) 和 Foreach循环容器(Foreach Loop Container)。这些容器都可以容纳 任务(task),并且每种类型的 容器(如包) 也都是可执行文件。

SSIS提供其他方式来可视化作用域(scope)。为了演示,从SSIS工具箱添加一个序列容器到控制流,然后添加一个 "执行SQL任务" 到序列容器,如下

包资源管理器(Package Explorer) 在树视图控件中描绘了 作用域(scope)。表示的含义为:包(VariablesAndParameters)包含一个容器(序列容器),该容器又包含一个任务(执行SQL任务

树状视图可帮助我们形象地说明在作用域内“上”或“下”的意思。从“执行SQL任务”的角度来看,“序列容器”位于其“上方”。如果从序列容器开始,则“执行SQL任务”的作用域是“在其下方”或“包含在其中”。

指出 “执行包任务”(Execute Package Task) 包含在 VariablesAndParameters 包中在技术上是正确的,但是该语句忽略了“序列容器”(Sequence Container),并提供了包与任务之间关系的不完整描述。为了更加准确,可以这样声明:“ VariablesAndParameters包 包含一个序列容器,其中包含一个执行SQL任务。”

变量的作用域由变量所作用的可执行文件定义。我们名为 MyVariable 的变量的作用域为 VariablesAndParameters(或包) 作用域。有时可以将这些变量称为包作用域变量。

关于 “包资源管理器”(Package Explorer) 中的树视图的另一点是:我认为这是对所谓的“执行堆栈”(Execution Stack)的公平表示。我更愿使用术语“执行树”(Execution Tree),但该术语已经在SSIS中的其他地方被使用。

执行堆栈是指可执行文件之间的关系。可执行文件的执行通常将堆栈“向下”从包流到容器再到任务。一些消息(例如在“高级日志记录”中观察到的事件)在堆栈中“向上移动”,可以对照参考第12部分介绍的高级日志中的事件。正如可以从那些示例中了解到的那样,Package Explorer可以让我们受益匪浅。

SSIS变量 在 SSIS 2012 中默认为包作用域。可以更改 SSIS变量 的作用域,但是到目前为止,还没有可以在包(package)级别以下设置变量作用域的好用例。

通过单击“变量”窗口工具栏中的第二个按钮“移动变量”,可以将变量移至另一个作用域,如图所示:

选择 MyVariable 变量,然后点击 “移动变量”(Move Variable) 按钮,显示选择新的作用域窗口。

如上图,我们将看到一个树状视图,其中显示了在 VariablesAndParameters 包中可用的作用域 —— 可执行文件。你可以选择所需的范围,然后单击“确定”按钮。出于演示目的,选择“序列容器”,然后单击“确定”。

请注意,MyVariable 的范围已更改为 “序列容器”,如图所示:

在“控制流”中,单击“序列容器”及其子可行性程序。 MyVariable才会在“变量”窗口中可见。这是因为 SSIS的默认行为是仅显示当前作用域或更高作用域的变量

可能你会想“我可以改变这个行为吗?” 当然,通过点击变量窗口工具栏中的第四个按钮 —— 网格选项(Grid Options),你可以改变这个行为。

“变量网格选项”窗口包含“变量”窗口的许多选项。我们要选中标记为 “显示所有作用域的变量” 的复选框,如图所示:

点击"确定"按钮,返回控制流和变量窗口。点击控制流的空白区域,此时你仍然能看到变量窗口中的 MyVariable 变量 —— 尽管它位于包的下面(位于序列容器作用域)。

关于依作用域而隐藏变量的小测试

注:变量依据执行堆栈从低向上获取的

我不是很认同因为作用域而隐藏变量。

为什么我不同意隐藏执行堆栈之下或之外的变量?如果我不小心在低于包的作用域内创建了一个变量,则可以创建第二个变量来进行补偿。允许两个变量在不同范围内具有相同的名称,但它们不是相同的变量。

为了演示,删除“执行SQL任务”,在它的位置添加一个“脚本任务”(Script Task)。创建一个新的名为 "MyVariable" 的变量,其作用域自动为包作用域。

为了演示目的,此处故意为变量提供了不同的的默认值。

双击“脚本任务”,打开编辑器。设置脚本语言属性为 "Microsoft Visual C# 2010"。点击 "ReadOnlyVariables" 属性的值文本框中的省略号。当选择变量窗口显示时,注意仅仅一个 MyVariable 变量列出来。

选择 "MyVariable" 变量并点击OK按钮。

点击脚本任务编辑器中的 "编辑脚本"(Edit Script) 按钮,打开 VSTAProjects 脚本编辑器,找到 Main() 函数。在 "Add your code here" 注释的下面,添加一行代码:

MessageBox.Show(Dts.Variables["User::MyVariable"].Value.ToString()); 复制代码

关闭 VSTAProject 脚本编辑器,并点击 "脚本任务编辑器" 的"确定"按钮。

按F5在调试器中执行SSIS包。消息框将会显示"MyVariable"变量的值。显示的是哪个值?

如果你从一开始就跟着做,则会显示“序列容器”中提供的MyVariable的默认值。为什么这个变量赢了?

考虑一下我前面提到的"执行堆栈",并考虑事件如何从原始可执行文件(任务,容器或包——task, container, or package)遍历堆栈。还记得这是如何工作的吗?事件向上传送,也就是事件冒泡。

变量的行为类似。在执行脚本任务之前,SSIS尝试锁定(lock)MyVariable变量。 “锁定它,安迪?”是的,将其锁定。 “为什么?”很好的问题。

请考虑一下,如果两个可执行文件试图同时使用同一变量,会发生什么情况。如果其中一个可执行文件正在写入变量值,而另一个可执行文件仅读取值该怎么办?在读取过程中,很可能希望该变量的值保持静态。为确保变量值的确保持静态(或确定性(deterministic)),SSIS在变量上设置了锁,因此在可执行文件使用过程中该值不能被无意间操纵。

思考变量在SSIS中如何锁定的一种方法是想象锁定机制(在此类比中为“钥匙持有者”)轮询执行堆栈,用以搜索名为 MyVariable 的变量。

钥匙持有者从"脚本任务"开始,并询问它:“脚本任务,你是否有一个名为MyVariable的变量?”脚本任务回答“否”。因此,钥匙持有者进入上一个执行堆栈,并询问"序列容器"。“序列容器,你是否有一个名为MyVariable的变量?”序列容器回答“是”。钥匙持有者停止查找。它找到了它想要的变量。

如果我的变量是隐藏的(在SSIS的所有版本中都是默认值),则我可能没有意识到我有两个名为MyVariable的变量在不同的作用域。我可能不小心将MyVariable的作用域设置为序列容器而忘了它,然后在以后创建了一个包作用域的MyVariable(想想“我是否已经创建了此变量?”)。

此外,“显示所有作用域的变量”复选框 的状态不会作为解决方案或项目属性的一部分永久保存。当我关闭 SQL Server 数据工具并重新打开它时,该设置将恢复为默认值。

这就是为什么我不喜欢在不同范围内隐藏变量的默认行为的原因:无法通过脚本任务访问名为 MyVariable 的包作用域变量。当我选择 ReadOnlyVariables 时,它不会出现在我的列表中。我无法指定 VariablesAndParameters.User::MyVariable。该选项根本不存在。而且,除非启用了“在所有范围内显示变量”,否则我不知道该变量是否存在,因为它不是默认值。

如果默认行为是将所有变量都设置为包作用域,则默认也应为在所有作用域中显示变量。

变量数据类型(Variable Data Types)

SSIS变量有几种可用的数据类型:各种数字数据类型,日期,字节,布尔值,字符串和字符。也许最有趣的是 Object 数据类型:

SSIS变量的Object数据类型的可以保存各种值,包括标量,例如单个整数,字符串和日期。Object也可以容纳对象。例如集合,数组,记录集和数据集(collections, arrays, recordsets and datasets)。此处不会进行详细介绍和练习,但是鼓励您阅读并练习我写的一篇文章中的示例,名为:SSIS 101: Object Variables, ResultSets, and Foreach Loop Containers。

变量值(Variable Values)

“变量” 窗口的 “值” 列显示变量的默认值。

作为最佳实践,即使将SSIS包部署到生产环境中,我也将默认值设置为用于开发 SSIS 包的值。做出此决定的原因有很多,我们将在以后的文章中介绍更多内容;但是主要原因是,如果在生产包执行过程中发生“不好的事情”,或者产生了一个错误,我宁愿用生产数据加载我的开发环境,而不是用开发数据加载我的生产环境

如下显示了到目前为止我们使用的两个变量的默认值:

变量表达式(Variable Expressions)

SSIS表达式语言很难学习。对我来说,它看起来像是花括号语言(C#,Java等)和 Transact-SQL 的混合体。如果你认为 SSIS 被定位为企业数据集成平台,则这非常适合。

我们可以使用表达式来操纵 SSIS 变量的值。为了演示,在MyVariable 的 "表达式"(Expression) 文本框中单击省略号。

"表达式生成器"(Expression Builder) 窗口显示并包含四个区域:变量和参数(Variables and Parameters),表达式语言函数和运算符(Expression Language functions and operators),表达式(Expression)和计算结果值(Evaluated Value)。

如图所示:

"变量和参数"树视图包含用于表达式的所有可用变量和参数的列表。由于变量位于SSIS包,“变量和参数”虚拟文件夹中的唯一变量是包作用域的 MyVariable ,如图所示:

为什么我们看不到序列容器作用域的MyVariable?因为 序列容器 作用域的 MyVariable 是我们正在设置 "表达式"列 的变量。

我们如何确定?可以将变量从“变量和参数”拖动到“表达式”文本框中,然后单击 “计算表达式”(Evaluate Expression) 按钮,如图所示:

记住,包作用域的变量 MyVariable 的默认值为0。 “序列容器”作用域的 MyVariable 的默认值为42。因此,这是包作用域内的MyVariable

表达式语言树 视图包含SSIS表达式语言 运算符和函数,

从表达式文本框中删除 "@[User::MyVariable]"。从 "日期/时间函数"(Date/Time Functions) 节点下拖拽 "DATEPART"函数 到 表达式文本框。

在“表达式”文本框中,用 "ss"(双引号包括) 覆盖<<datepart>>。在 SSIS表达式语言树 视图中,单击 GETDATE()函数 并将其拖到 “表达式”文本框 中。将鼠标悬停在<<date>>占位符上,然后将GETDATE()函数放到<<date>>占位符上。表达式应该为 DATEPART("ss",GETDATE()),如下:

该表达式会将当前日期和时间中的秒数放入“序列容器”作用域MyVariable值中。关闭Expression Builder,并注意变量窗口。

注意变量名称左侧的 fx(“x的函数”,“x的f”或“f sub x”)图标。这表示表达式正在控制变量的值。

我们配置的表达式出现在“变量”窗口的“表达式”列中。

为了演示,请按 F5键 以在 SSIS调试器 中启动包。脚本任务将显示一个消息框,其中包含 MyVariable 变量的值。它是介于0和59之间的数字,是当前日期和时间的秒数,如图所示:

很酷的东西,那让我们开始实践吧!

在开始讨论其他内容之前,让我们先整理一下。如果 SSIS包 正在SSDT中运行,请停止调试器。从序列容器中删除"脚本任务"。删除两个 MyVariable 变量。

使用变量建立动态的连接(Building Connections Using Variables)

让我们把已经学会的综合起来。变量可用于构建其他变量值。

让我们通过使用 变量 来 创建 包含一些数据的文本文件的 路径 来演示这一点。

通过创建下面的名为 Songs.csv 的文本文件开始:

Id,Artist,Song "0","Waylon Jennings","Lonesome, On'ry, and Mean" "1","Willie Nelson","Blue Eyes Cryin' in the Rain" "2","Kris Kristofferson","Sunday Mornin', Coming Down" 复制代码

添加 平面文件源适配器

在 SQL Server 数据工具(SSDT)中,将数据流任务添加到控制流,并将 优先约束 从 序列容器 连接到 新 数据流,如下:

打开数据流任务并添加一个 文本文件源(平面文件源Flat File Source)适配器 到界面。

打开 平面文件源编辑器,并通过单击 “平面文件连接管理器” 下拉菜单右侧的 “新建” 按钮来创建一个新的 平面文件连接管理器,如图所示:

显示 平面文件连接管理器编辑器 后,将 “连接管理器名称”(Connection manager name) 属性设置为 “Songs Flat File”,并将 “文件名”(File name)属性 设置为上面保存的文件的位置。

在 “文本限定符”(Text qualifier)属性 中添加双引号,如图所示:

英文界面:

点击"确定"按钮,关闭 平面文件连接管理器编辑器。可能需要点击点一下左侧的"列"(Columns) 才能点击 "确定"

注意 Songs Flat File 现在出现在 "平面文件连接管理器"(Flat file connection manager) 属性的下拉框中。

点击"确定",关闭平面文件源编辑器。

创建数据库TestDB

可能你在 Microsoft SQL Server 实例中没有名为 “TestDB” 的数据库,你可以使用任何数据库进行测试或开发,也可以使用下面的 T-SQL 脚本创建自己的 TestDB:

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

关于幂等(幂等脚本可以类比幂等函数、幂等接口、幂等操作)

上面是一个幂等脚本的示例。

现在我要坦白一下:我不知道这个词是什么意思。就像我所知道的许多事情一样,我是从 Jamie Thomson(博客| @jamiet) 学到的。但是 杰米(Jamie) 解释说,它意味着可以重复执行代码。如果你的实例和SQL Server中都没有名为TestDB的数据库,并且运行了上面的脚本两次,它将在第一次执行脚本时创建该数据库,并在第二次(及后续)执行时通知该数据库已经存在。

这里有两点:

  1. 幂等脚本是安全且有用的;

  2. 杰米(Jamie)真的很聪明。

幂等(idempotent、idempotence)

在编程中一个幂等操作的特点是其任意 ****。幂等函数,或幂等方法,是指多次执行所产生的影响均与一次执行的影响相同可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

OLE DB 源适配器

配置连接

返回 SSDT,拖拽一个 OLE DB 源适配器到 数据流 界面,在 平面文件源 和 OLE DB目标 之间连接一个数据流路径。如下:

打开 OLE DB目标编辑器,点击 "OLE DB连接管理器"(OLE DB connection manager) 下拉框右侧的 "新建" 按钮,创建一个新的 OLE DB连接管理器,打开 配置OLE DB连接管理器 窗口。

点击 "新建" 按钮,显示 "连接管理器编辑器"(Connection Manager editor)。在 "服务器名"(Server name) 属性下拉框中输入 SQL Server服务器名和实例名,在 "连接到一个数据库"(Connect to a database) 下拉框中输入数据库名,如下:

点击"确定",关闭 连接管理器编辑器 窗口。配置OLE DB连接管理器窗口显示新的连接,如下:

在 "数据连接"(Data connections) 列表中选择刚才新建的连接,并点击"确定"按钮。OLE DB目标编辑器中,“OLE DB连接管理器”属性下拉列表中显示了选择的 连接管理器 的名称。

单击 “表或视图的名称” 属性下拉列表右侧的 “新建” 按钮,显示 “创建表” 窗口。该窗口显示了根据数据流中的 "元数据"(metadata) 构建的 数据库定义语言(DDL) 语句。

表的名称是从 OLE DB目标适配器 的名称派生的 —— 将其更改为"Songs"。列的定义是从 "平面文件源" 和 "OLE DB目标" 之间的数据流路径派生的:

对表名进行编辑后,单击“确定”按钮。注意,单击“确定”按钮将对你的数据库执行此DDL语句。这就是为什么表格显示在 “表格或视图的名称” 属性下拉列表中的原因,如图所示:

在"OLE DB目标编辑器"的底部,有警告信息提示。

上面显示的警告消息告诉我们,下一步是 映射“映射页面” 上的列(map the columns on the Mappings page)。

但请注意,“确定”按钮是启用的。这是 SSIS 2012 中的新功能。也是 Microsoft称为“灵活创作顺序”(Flexible Order of Authoring) 或 FOA 的一个示例。

我对FOA感触良多。我不喜欢"OLE DB目标"。为什么?现在,我可以单击“确定”按钮,并在数据流中保留半配置的(partially-configured,部分配置的)"OLE DB目标"。在以前的版本中,这是不可能的,因为直到执行映射后(我们将在一分钟内完成)之前,“确定”按钮都是被禁用的。

但是,当我配置 "查找转换"(Lookup transformations) 时,我真的很喜欢FOA。"查找转换" 有五个页面,当发生悲剧性事件时(例如由于 Unicode 和 非Unicode 字符串导致映射失败,请耐心等待……),我讨厌必须记住在以前的界面中所做的所有操作。 FOA给予,FOA拿走。(FOA gives and FOA takes away.)

返回SSDT,单击 "OLE DB目标编辑器" 上的 "映射" 页。执行此操作时,将发生自动映射,如图所示:

自动映射

你可能会想,“什么是自动映射?” 很高兴你这样问!可用的输入列表示从连接到 OLE DB目标 输入的数据流路径流入 OLE DB目标 的数据的架构。可用目标列表示在配置为目标的表或视图中的可用的列。在当前例子中,我们之前创建了目标表 —— OLE DB目标从哪里获取元数据来创建该表?

要回答此问题,请首先单击“确定”按钮,以完成 OLE DB目标适配器 的配置。接下来,右键单击将 平面文件源适配器 连接到 OLE DB目标适配器 的 数据流路径,然后单击 “编辑” 以打开 “数据流路径编辑器”。单击“元数据”页面以显示 数据流路径 的结构属性,如图所示:

看起来熟悉吗?我认为这看起来像表定义,有列名,数据类型和长度。当我们单击“新建”按钮以在"OLE DB目标编辑器"中创建新表时,此元数据提供了架构信息。

由于 “可用目标列” 中的列(上上图)是根据 “可用输入列” 的 元数据 构建的,因此这些列匹配名称和数据类型,并且字段名称和数据类型的这种对齐允许发生自动映射。

(this alignment of field name and data type allows auto-mapping to occur)

单击"确定"按钮,以关闭数据流路径编辑器。

表达式中的变量(Variables in Expressions)

打开 “SSIS变量” 窗口,并添加一个名为 FileDirectory 的新的包作用域的 String 变量。将FileDirectory 变量的 Value 属性设置为存储 Songs.csv文件的文件夹;

创建另一个名为 FileName 的包作用域的String变量。将 FileName 变量的 Value 属性设置为“Songs.csv”;

再添加一个包作用域的String变量,命名为FilePath。如图所示:

点击"FilePath"变量"表达式"(Expression)的省略号,打开 "表达式生成器"(Expression Builder) 窗口。展开左上部分的 "变量和参数"(Variables and Parameters) 虚拟文件夹。

从 变量和参数树 视图中点击和拖拽 "User::FileDirectory" 到 “表达式” 文本框中。

在变量名称(“@[User::FileDirectory]”)之后,添加一个空格,后跟加号(“+”)。加号充当字符串的串联运算符。然后再添加 反斜杠字符串 和 加号"+"。单击 User::FileName 变量并将其拖到 Expression 文本框中,如图所示:

点击 计算表达式Evaluate Expression 按钮,查看表达式的值:

backslash 反斜杠。此处连接反斜杠时使用的是两个反斜杠。原因在于反斜杠是转义字符(escape character——A backslash plus another character indicates some special text)。反斜杠加上另一个字符表示一些特殊文本。单独使用"\"将会报错。

单击"确定"按钮,关闭表达式生成器。

动态属性表达式中的变量(Variables in Dynamic Property Expressions)

现在,我们有一个变量 —— FilePath —— 包含源文件的完整路径。FilePath 变量上的表达式从其他两个变量构造此路径:FileDirectoryFileName

让我们使用这个完整路径将 平面文件连接管理器(名为“Songs Flat File”) 动态定向 到该文件。单击 Songs Flat File平面文件连接管理器,然后按F4键以显示连接管理器属性(如图所示):

单击“表达式”值文本框中的省略号,以显示“属性表达式编辑器”。单击Property下拉列表,然后选择 ConnectionString 属性,如图所示:

单击 ConnectionString 属性旁边的 Expression 文本框中的省略号,以显示 Expression Builder。在“变量和参数”树视图中展开 “变量和参数” 虚拟文件夹。将 FilePath 变量拖到 Expression文本框 中,如图所示:

单击“确定”按钮,关闭 “表达式生成器” 窗口,然后单击“确定”按钮,关闭“属性表达式编辑器”。

如果在“属性”窗口中展开 Expressions 属性集合,则可以查看 ConnectionString 属性,如图所示:

介绍断点和变量状态(Introducing Breakpoints and Variable State)

在SSIS调试器执行过程中,断点很方便进行故障排除(或仅查看状态)。如本系列中的 "控制流任务错误处理"、"高级日志记录" 中所述,SSIS使用事件/侦听器模式(event/listener pattern)。事件处理程序、日志记录、“进度/执行结果”选项卡 和 断点 都是处理事件侦听器的例子。

Event handlers, logging, the Progress / Execution Results tab, and breakpoints are examples of event listeners.

在本节中,我们设置一个断点,以在数据流任务引发 PreExecute 事件时暂停执行。

在运行测试执行之前,返回 “控制流” 并右键单击 “数据流任务”,然后单击 “编辑断点…”(Edit Breakpoints),如图所示:

当 "设置断点——数据流任务"(Set Breakpoints – Data Flow Task) 窗口显示后,点击 "当容器接收到OnPreExecute事件时断开"(Break when the container receives the OnPreExecute event) 截断条件。

在 "数据流任务"(Data Flow Task) 引发 PreExecute事件 时启用断点,将导致数据流任务在执行之前暂停执行。

单击“确定”按钮,以关闭“设置断点-数据流任务”窗口。

"数据流任务" 上出现一个 栗色 的点,表明已设置断点:

注,上上图中"数据流任务"显示有红叉错误。应该在无错误状态下配置和测试执行。此处演示的红叉在点击 "数据流任务" 中的 "OLE DB目标" 打开其编辑器后,仅再点击一次确定,就消失了。

通过单击"play"按钮,或按F5来启动调试器。

包验证错误。数据流任务 OLE DB 目标 [22]: 由于为列“Id”指定了多个代码页(1252 和 936),无法处理此列。

执行 SSIS 时报错"包验证错误"。

如下,在执行时遇到了包验证的错误

错误 1 验证错误。数据流任务 OLE DB 目标 [22]: 由于为列“Id”指定了多个代码页(1252 和 936),无法处理此列。   VariablesAndParameters.dtsx 0 0 复制代码

936为汉语代码,1252为拉丁文代码。用哪个代码要在 "平面文件连接管理器编辑器" 中设置。一般中文版系统(和SQL Server)中,会默认选择中文,此时就会产生错误。

之前配置时选择的区域设置和代码页码为:英语(美国)和1252。最开始选择它的原因是:文本文件Songs.csv中的内容都是英文和字符。

区域设置和代码页码的正确设置应该是:中文(简体,中国)和936。即和Windows系统的区域设置一致。

如下,编辑 "Songs Flat File"平面文件连接管理器:

和系统设置一致,中文-936

测试执行包

修改好后,重新执行 SSIS 包。

debug执行

执行 SSIS包 操作会在 "数据流任务" 引发 PreExecute事件 时,在 "数据流任务" 处运行会暂停,这由 断点指示器(栗色的点)中出现的 黄色箭头 指示,如图所示:

要查看 FilePath 变量的状态,请在菜单上单击"调试"(DEBUG),将鼠标悬停在 "窗口"(Windows)上 ,然后单击 "局部变量"(Locals) 窗口,如图所示。

注意,你还可以按住Ctrl和Alt键,然后按V再按L打开 "局部变量"(Locals) 窗口。以这种方式按多个键有时被称为 和弦(a chord)

显示后,在“局部变量”窗口中展开 “变量”节点(Variables)。滚动直到找到 User::FilePath 变量,如图所示:

“值”(Value) 字段包含 SSIS包 的调试执行到此时的 变量值。请注意,该值在 FilePathFileDirectory 变量值字段中将反斜杠表示为双反斜杠。

在调试器中继续执行SSIS包,按F5键或单击“继续(Play)”按钮。包执行完成,我们从 Songs.csv 文件加载三行,如图所示:

检查执行结果

上面执行完成后。可以返回SSMS,查看加载到 Songs 表中的数据。如下:

可以看到已正确导入。

此处列出对比的原因是,可以对照查看 "平面文件连接管理器" 或 "平面文件源" 中的列的预览效果:

可以看到这些预览是不完整的。必须以实际测试效果为准

总结

本篇,我们演示了SSIS变量、变量配置和通过表达式动态管理值的多个方面。


作者:代码迷途
链接:https://juejin.cn/post/7032446620046360590


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐