微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用派生列在 SSIS 中将字符串转换为小数?

如何解决如何使用派生列在 SSIS 中将字符串转换为小数?

我在 SSIS 中工作以填充临时区域数据库。我想传输以下数据:

-------------------------------------------------------------------
| ShipName (String) | MaxContainers (int) | FuelCapacity (String) |
-------------------------------------------------------------------
| Ship1             | 1000                | 74.60 Liters          |
| Ship2             | 1500                | 121.28 Liters         |
-------------------------------------------------------------------

如您所见,FuelCapacity 列是一个包含数字和字母的字符串列。 新数据库的布局如下:

-------------------------------------------------------------------
| ShipName (String) | MaxContainers (int) | FuelCapacity (decimal)|
-------------------------------------------------------------------
| Ship1             | 1000                | 74.60                 |
| Ship2             | 1500                | 121.28                |
-------------------------------------------------------------------

我怎样才能做到这一点。我相信我需要为此使用派生列,但我无法弄清楚如何。

PS:字符串列是数据库中的nvarchar数据类型

解决方法

要重申这个问题,您需要根据第一个空格的位置拆分源列。我们需要将前半部分从空格中保留下来,然后将其转换为小数(或保留为字符串并使用 Gordon 的方法进行隐式转换)。在这一点上对我来说无关紧要。

当我看到这样的问题时,我想知道哪里会出现影响我设计的问题。

考虑到这一点,我将在我的数据流中添加 3 个派生列表达式来解决这个问题。

设置

我在我的包中添加了一个 OLE DB 源并使用以下查询

SELECT '74.60 Liters' AS FuelCapacity
UNION ALL SELECT '121.28 Liters' AS FuelCapacity
UNION ALL SELECT '341.56 DeciLiters' AS FuelCapacity
UNION ALL SELECT '0.0 Liters'
UNION ALL SELECT NULL

最后 3 个未提供,但对于域来说似乎是合理的值。

DER 空间

这个组件的目的是识别入站文本中的空格。我将向名为 SpaceOrdinal 的数据流添加一个新列,因为它将基于以下表达式

FINDSTRING([FuelCapacity]," ",1)

DER 获取第一个字符串

这个组件的目的是根据我们在上一步得到的序数位置切出我们想要的数据。我创建了一个名为 FirstString 的新列,因为它将包含第一段字符串数据。

LEFT([FuelCapacity],[SpaceOrdinal])

Der 转换为十进制

这一步是可选的,因为您可以让隐式转换发生,也许您愿意/不希望它发生。名为 LitersOfFuel 的新列;

(DT_NUMERIC,10,2)FirstString

这适用于提供的数据。

但是如果 0.0 升只是 0 升呢?这里的转换会失败,因为转换非常脆弱。但是您可以添加一个前导步骤,将数据转换为使用默认类型转换效果更好的数据。

,

您可以只加载数据:

insert into real_table (ShipName,MaxContainers,FuelCapacity)
    select ShipName,FuelCapacity
    from staging;

SQL Server 将隐式进行转换。我不是隐式转换的忠实粉丝,但如果您知道数据是正确的,那么一次性操作可能没有坏处。

但是,您可能希望先验证数据:

select fuelCapacity
from staging
where try_convert(numeric(?,?),fuelCapacity) is null and
      fuelCapacity is not null;

这将返回不正确的值。

编辑:

对于提供的数据,您显然需要字符串中的前导数字:

insert into real_table (ShipName,left(FuelCapacity,charindex(' ',FuelCapacity) - 1)
    from staging;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。