我一直在与SSIS 2016一起创建一些数据流。我的目标之一是能够捕获任何截断问题并填充一个错误表,突出显示发生截断的位置。部分原因是由于我们导入JSON数据,并且某些字段中包含的数据可能比我们已经在数据库中设置的数据更长。
仅提供一些背景知识,我们的简化流程是:
由于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源和一个指向生产表的OLEDB目标。我也有一个错误流从“源”流到一个错误表,其中的每一列都已设置为在截断时重定向行。
这时,SSIS警告我,验证目标任务时可能会截断,目标任务上带有一个黄色三角形:
[PRD_SYSTEM [189]]警告:由于插入数据可能会发生截断 从长度为11的数据流列“ RECIPIENT_NAME”到数据库 列“ RECIPIENT_NAME”,长度为10。
在使用一些示例数据进行测试时,我故意在RECIPIENT_NAME的JSON字段中放置一个包含20个字符的行。不会将其标记为截断问题,并且会继续填充生产表(尽管已被截断)。
但是,如果我右键单击源>显示高级编辑器>输入和输出属性> OLEDB源输出并展开输出列,并在RECIPIENT_NAME列(最初为11)的数据类型属性下修改“长度”,将其更改为应该在生产表中,一个10,然后重新运行该过程,的确确实将行重定向到错误表!
有趣的是,警告发生了变化,在源任务上显示了一个黄色三角形:
[LND_VW_SYSTEM [81]]警告:由于检索而可能发生截断 来自数据库列“ RECIPIENT_NAME”的数据,长度为11 流列“ RECIPIENT_NAME”,长度为10。
现在,我的理解是SSIS应该在我设置截断时捕获截断,而不必在高级编辑器中编辑各个列-是我所描述的那样还是想要的行为?