首页 > 解决方案 > 在 SSIS 流中捕获截断

问题描述

我一直在使用 SSIS 2016 创建一些数据流。我的目标之一是能够捕获任何截断问题并填充错误表,突出显示截断发生的位置。部分原因是我们导入了 JSON 数据,并且某些字段可能包含比我们已经在数据库中设置的数据更长的数据。

只是给你一些背景知识,我们的简化流程是:

  1. 将 JSON 批量插入表中
  2. 在顶部创建登陆视图,将 JSON 路径提取到视图结构中
  3. 创建将视图数据流入生产表的数据流
    1. 突出显示从登陆到生产之间发生的任何截断

由于 SQL Server 处理 JSON 的方式,字段的长度为 MAX,在创建视图时,我们在 CROSS APPLY 中设置字段长度,例如,我们在生产表中将 RECIPIENT_NAME 设置为 VARCHAR(10),但是如果 RECIPIENT_NAME如果在 JSON 文件中有一行长度为 15,则在创建此视图时,我们不知道 15 被截断为 10。为了解决这个问题,我们在着陆视图中将 RECIPIENT_NAME 长度设置为 11应用,当行从着陆移动到生产 RECIPIENT_NAME 从 11 变为 10 时,如果此时确实有任何截断,SSIS 会突出显示它,我可以沿着红色错误路径捕获该行。

在 SSIS 中,我有一个指向着陆视图的 OLEDB Source 和一个指向生产表的 OLEDB Destination。我还有一个错误从源流出到一个错误表中,其中每一列都设置为在截断时重定向行。

此时 SSIS 警告我在验证目标任务时可能会发生截断,目标任务上有一个黄色三角形:

[PRD_SYSTEM [189]] 警告:由于从长度为 11 的数据流列“RECIPIENT_NAME”插入长度为 10 的数据库列“RECIPIENT_NAME”中的数据,可能会发生截断。

在使用一些示例数据进行测试时,我特意在 RECIPIENT_NAME 的 JSON 字段中放置了一行包含 20 个字符的行。这不会被标记为截断问题并继续填充生产表,尽管已截断。

但是,如果我右键单击源 > 显示高级编辑器 > 输入和输出属性 > OLEDB 源输出并展开输出列并将 RECIPIENT_NAME 列(最初为 11)的数据类型属性下的“长度”修改为它应该在生产表,a 10 然后重新运行该过程,该行确实被重定向到错误表!

有趣的是,警告发生了变化,源任务上出现了一个黄色三角形:

[LND_VW_SYSTEM [81]] 警告:由于从长度为 11 的数据库列“RECIPIENT_NAME”到长度为 10 的数据流列“RECIPIENT_NAME”检索数据,可能会发生截断。

现在我的理解是,SSIS 应该在我设置它时捕获截断,而不必在高级编辑器中编辑单个列 - 这是考虑到我所描述的预期行为还是我错过了什么?

标签: sql-serverssissql-server-2016ssis-2016

解决方案


推荐阅读