暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SSIS 数据类型:简单示例指南

原创 谭磊Terry 恩墨学院 2022-08-04
2373

考虑这个简单的集成服务包。这很简单,因为任务是将 CSV 文件上传到 SQL Server。没有转变。

image.png

请注意 OLE DB 目标中的警告。这是一个字符串截断警告。源列有 50 个字符,但目标只有20个。那么,什么?该软件包可能会运行而不会出现错误。但这只是问题的一半。这是源代码的屏幕截图:
image.png

看起来也很简单。但执行结果包括:

[OLE DB Destination [27]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description: "Invalid character value for cast specification".

[OLE DB Destination [27]] Error: There was an error with OLE DB Destination.Inputs[OLE DB Destination Input].Columns[ DateFounded] on OLE DB Destination.Inputs[OLE DB Destination Input]. The column status returned was: "The value could not be converted because of a potential loss of data."

那很糟。罪魁祸首?SSIS 无法转换日期格式 (MMDDYYYY)。

这些只是您需要处理的一些问题。但是有一种方法可以解决这些问题。而且一点也不难。在以下部分中找到它们。

但在我们处理这个问题之前,让我们先讨论一下 SSIS 数据类型的核心。有了这个,您就可以应对未来的挑战。

SSIS 中的数据类型有哪些?

SSIS 数据类型与其他平台没有太大区别。许多数据类型对应于 SQL Server 数据类型。其他数据格式也是如此。但这不是一对一的映射。

以下是分类的数据类型。

字符串

这些是支持字母、数字和符号的类型。或者它是所有这些的组合。它还处理涉及日语或韩语等字符的 Unicode 字符串。在 SSIS 中,字符串可以是 DT_STR、DT_WSTR、DT_TEXT 或 DT_NTEXT。

数字

这些是支持数字进行数学计算的类型。它要么是整数,要么是带有小数部分的数字。在 SSIS 中,DT_I1、DT_I2、DT_I4、DT_I8 用于有符号整数。货币价值还有 DT_CY。还有 DT_NUMERIC(精确数字)、DT_R4 和 DT_R8(浮点数)。

日期/时间类型

这些是处理日期、时间或两者组合的类型。在 SSIS 中,有 DT_DATE、DT_DBDATE、DT_DBTIME、DT_DBTIME2、DT_DBTIMESTAMP、DT_DBTIMESTAMPOFFSET 和 DT_FILETIME。

处理日期和时间可能很棘手。如果您还处理小数秒和时区,这是正确的。当您比较2个日期/时间值时会出现问题。如果您确实需要这些详细信息,请了解您的数据需求。然后,设计您的 SSIS 表达式并相应地设置数据类型。

布尔值

SSIS 中的布尔值是 DT_BOOL。它非真即假。

二进制

这些是处理二进制值的类型。在 SSIS 中,这可以是 DT_BYTES 或 DT_IMAGE。请注意,某些其他数据库数据类型将映射到图像类型。一个示例是 SQL Server 地理空间数据类型。

身份标识

全局唯一标识符 (GUID) 是 SSIS 中的 DT_GUID。

如需进一步阅读:请访问 官方文档 以获取 SSIS 数据类型的完整列表。

那么,使用哪种数据类型?

您可能想知道:在所有不同类型的字符串中,使用哪一种?这也适用于数字和日期。

这很简单。无论源和目标使用的数据类型是什么。除非目标需要不同的数据类型或具有更大大小的相同数据类型,否则不要更改它。

在我们前面的示例中,CSV 文件中的 FastFoodChain 列使用大小为 50 的 DT_STR。同时,SQL Server 对应项使用长度为 20 的 DT_STR。它们具有相同的类型。不要改变它。但是两者的长度应该是较大的值,即 50。因此,将目标列的大小从 20 个字符更改为 50 个字符。这样做将解决截断问题。

那么,问题是目标的数据类型是什么?答案是您将使用的数据类型。

但这不限于表格列。变量、文字值和表达式评估也处理 SSIS 数据类型。因此,如果您要使用变量来设置列值,请根据目标的数据类型正确设置它们。

但还有另一个坏消息。SSIS 可能会“秘密地”转换类型。正如您将在下一节中看到的那样。

如何更改 SSIS 中的数据类型?

那么,下一个问题是:如何更改 SSIS 中的数据类型?

如果需要更改数据类型,则需要了解 SSIS 是如何进行数据转换的。SSIS 可以进行两种类型的转换:隐式和显式。

SSIS 数据类型的隐式转换

隐式转换是 SSIS 为您做的事情。这也是 SSIS “秘密”转换类型的方式。它发生在你不知道的幕后。这就是为什么隐式转换也称为自动类型转换的原因。为此,SSIS 使用了 2 个东西:表达式求值器和数据流引擎。

SSIS 使用表达式求值器来了解用于表达式的最佳类型。表达式可能包含文字值、函数、变量和列。它们中的每一个都可能有不同的数据类型。因此,表达式评估器确保满足您所需的类型。

同时,数据流引擎转换来自任何数据格式的任何数据。它在数据流中第一次打开数据时起作用。

那么,在什么情况下会发生隐式转换呢?

  • 数据第一次进入数据流。所有列都会隐式转换为 SSIS 数据类型。
  • 在比较 2 个值或表达式时。如果将 DT_I8 与 DT_I4 进行比较,则 DT_I4 数据首先转换为 DT_I8。只有在那之后才会进行比较。SSIS 也对其他数据类型执行相同的操作。
  • 当 SSIS 将数据写入目标列时。在我们之前的示例中, DateFounded 列使用了一种奇怪的格式。因此,SSIS 不能隐式转换它。并且发生了错误。

稍后,您可能需要查看 SSIS 数据类型转换表。这将使您了解某些 SQL 数据类型转换为什么 SSIS 数据类型。

SQL 到 SSIS 数据类型转换表

并非所有 SQL 平台都是相同的。因此,它们的数据类型在 SSIS 中的映射可能不同。下面的映射显示了 SSIS 数据类型如何映射到已知的 SQL 平台。在这里,我们有以下内容:

  • SSIS 数据类型映射到 SQL Server
  • SSIS 数据类型映射到 MySQL
  • SSIS 数据类型映射到 Oracle
  • SSIS 数据类型映射到 PostgreSQL

请注意,下表仅作为指导而非严格的映射。它与 官方文档中使用的类似。还要注意使用的数据访问组件(SQLOLEDB、SqlClient、OracleClient 和 ODBC)。
image.png

SQL Server 和 Oracle 的映射来自官方文档。同时,MySQL 和 PostgreSQL 的转换取自一个实际的包。这是通过检查 ODBC 源的输入和输出属性来完成的。您可以 在源数据的高级编辑器中看到这一点。用于源的表包含不同数据类型的列。空表没有其他用途,只能在高级编辑器中阅读和检查。

下面是 PostgreSQL 中的布尔数据类型如何映射到 SSIS 中的 DT_STR 的屏幕截图。

image.png

这里使用了源组件的输出列 。

这是 PostgreSQL 表结构。注意col_boolean 列的数据类型 。

CREATE TABLE IF NOT EXISTS public."SomeTable"
(
    col_bigint bigint,
    col_int integer,
    col_smallint smallint,
    col_bit bit(1),
    col_varchar character varying(20) COLLATE pg_catalog."default",
    col_char "char",
    col_real real,
    col_boolean boolean,
    col_datetime date,
    col_time time without time zone,
    col_money money,
    col_timestamp timestamp with time zone,
    col_json json,
    col_text text COLLATE pg_catalog."default",
    col_uuid uuid,
    col_double_prec double precision,
    col_bytea bytea
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."SomeTable"
    OWNER to postgres;

同时,您还需要检查目标表的数据类型。为此,请使用目标组件的外部列。通过匹配源和目标的数据类型,您可以最大限度地减少运行时的错误。

SSIS 数据类型的显式转换

显式数据转换是告诉 SSIS 遵循您的数据转换方式。所以,当 SSIS 认为它是 DT_I4(整数)时,你说 NO。这次你是老板,你告诉 SSIS 它是一个 DT_WSTR(Unicode 字符串)。

这适用于源的数据类型与目标不同的情况。而且您不确定 SSIS 是否可以在不丢失数据或错误的情况下进行隐式转换。要显式转换,您可以使用 2 个 SSIS 组件。请在下一节继续。

用于更改数据类型的 SSIS 组件

从一种数据类型转换为另一种数据类型的 2 个组件是 派生列 转换和 数据转换 转换。

使用派生列修复错误

为了解决我们前面示例中的问题,让我们使用派生列转换。

但在此之前,下面是目标表的结构。FastFoodChain 列也更改为 VARCHAR(50) 以避免截断。

CREATE DATABASE FastFoodChain;
GO

USE FastFoodChain
GO

CREATE TABLE FastFoodRestaurant
(
	ID INT NOT NULL PRIMARY KEY,
	FastFoodChain VARCHAR(50) NOT NULL,
	DateFounded DATE NOT NULL,
	Founders VARCHAR(50) NOT NULL
)
GO

现在,下面是之前场景中更好的 SSIS 包:
image.png

派生列将添加一个具有以下表达式的新列:

(DT_DBDATE)(SUBSTRING(TRIM([ DateFounded]),1,2) + "/" + SUBSTRING(TRIM([ DateFounded]),3,2) + "/" + SUBSTRING(TRIM([ DateFounded]),5,4))

让我们检查一下这个表达式。请记住,表达式的输出应该是 DT_DBDATE。这与 SQL Server 中的目标列相同。

因此,表达式的第一部分是转换为 DT_DBDATE。

然后,CSV 中的 DateFounded 的值将被解析为 MM/DD/YYYY。回想一下前面的格式是没有反斜杠的 MMDDYYYY。这导致了目的地的错误。因此,解析的第一部分是提取月份。那就是 SUBSTRING(TRIM([ DateFounded]),1,2)。我们需要修剪以删除任何前导和尾随空格。相信我。有空格。

然后,将结果与反斜杠组合。

接下来,提取月份中的日期。那就是 SUBSTRING(TRIM([ DateFounded]),3,2)。月份从第三个字符位置开始。所以,我们以 3 作为起点。然后,提取2个字符。

然后,将结果与另一个反斜杠组合。

接下来,提取年份。那就是 SUBSTRING(TRIM([ DateFounded]),5,4)。年份从第五个字符位置开始。因此,我们以 5 作为起点。然后,提取最后 4 个字符。

表达式求值器将首先进行解析。然后,当形成日期字符串时,将其转换为日期数据类型。

正是如此。

现在,您需要将该派生列映射到目标。这是一个屏幕截图。
image.png

此更改后,截断和转换错误将消失。

使用数据转换转换

您可以使用 SSIS 数据转换转换将列数据类型转换为另一种数据类型。

因此,这是在派生列转换中使用 CAST 操作的替代方法。但不是像 (DT_I4) 那样键入强制转换,而是设置属性。

您可能更喜欢一目了然的转换。这个组件是可视的,当您查看 SSIS 包时它就在那里。同时,您需要双击 Derived Column 才能看到相同的转换。

无论如何,这里是如何在视觉上进行转换。请参阅下面的示例包。
image.png

它使用相同的源和目标。但这一次,我们使用了数据转换转换。我们仍然使用派生列转换来重新格式化 DateFounded 列。派生列表达式与前面的相同,但没有 CAST。并且 ID 和重新格式化的 DateFounded 列使用数据转换进行转换。因此,将转换后的数据加载到目的地不需要隐式转换。

以下是数据转换转换的配置方式:
image.png

请注意具有转换后数据类型的2个新列。

这是目标组件中的列映射。
image.png

这就是使用数据转换转换是多么容易。

注意:转换 ID 列的另一个选项是 在平面文件源的输出列中更改它。将 DT_STR 更改为 DT_I4。您只能在高级编辑器中看到它。但请注意,如果数据不需要其他转换,则只能使用此方法。由于它隐藏在高级编辑器中,因此最好在 SSIS 包中添加注释。

结论

这就是您使用 SSIS 数据类型的方式。

您检查数据提取期间完成的数据类型。然后,检查目标的数据类型。如果数据类型不匹配,则进行一些显式转换。您可以使用派生列和数据转换转换来做到这一点。

原文标题:SSIS Data Types: The No-Sweat Guide with Easy Examples
原文作者:DAC Team
原文地址:https://blog.devart.com/ssis-data-types-the-no-sweat-guide-with-easy-examples.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论