如何在调试过程中强制 SSIS 数据流出错或停止?
Posted
技术标签:
【中文标题】如何在调试过程中强制 SSIS 数据流出错或停止?【英文标题】:How to force error or stoppage in SSIS data flow during the debugging process? 【发布时间】:2021-12-17 17:53:30 【问题描述】:问题是:我对两个表进行左连接,然后我需要将整个数据加载到另一个表,但前提是第一个表中的每一行都在第二个表中匹配,所以,简而言之,没有 NULL在一个确切的列中。 如果至少有一个空值,我想让我的数据流失败,这样它就不会将任何数据加载到最终表中,然后通过执行 sql 任务发送一封带有错误的电子邮件。
经过多次尝试,我只能在有空值时出错,但这个错误不是致命的。我怎样才能引发致命错误,而不是使用无法完成的数据转换之类的愚蠢?我试图在更改某些变量后创建断点但被 ssis(
【问题讨论】:
【参考方案1】:如果我理解正确,数据流会将数据加载到 Table1。执行 SQL 任务使用 Table1 填充 Table2。
业务规则是,执行 SQL 任务应该仅在之前数据加载的列没有 NULL 时触发。
处理这个问题的懒惰方法是将逻辑放在查询本身中。类似于以下内容,是的,有一些方法可以优化它
INSERT INTO dbo.Table2 SELECT * FROM dbo.Table1 WHERE NOT EXISTS (SELECT * FROM dbo.Table1 WHERE MyColumn IS NOT NULL)
为了使这仅在 SSIS 中发生,
向包中添加一个名为 NullRowCount 的变量并将其初始化为零。 在数据流中,在加入和目标之间添加多播。沿着一条路径到达目的地 在数据流中,将条件拆分连接到来自多播的新路径。将条件拆分配置为具有“无数据”的输出名称并使用 IsNull([MyColumn]) 之类的表达式。这是一个布尔值,是/否。 在数据流中,将行计数转换添加到条件拆分并将其附加到“无数据”管道(默认管道将包含在 MyColumn 中具有值的行)。在行计数转换中使用 @[User::NullRowCount]。 最后,双击数据流和执行 SQL 任务之间的先例约束。使其回到 On Success 约束,然后将评估选项从Constraint
更改为 Constraint and Expression
。在这里,我们将使用@[User::NullRowCount] == 0
的表达式
用简单的英语,我们将让数据流计算我们集合中有多少行在MyColumn
中有 NULL。 Precedent Constraint 将允许/禁止 Execute SQL Task 运行,我们指定的标准是数据流必须成功运行并且其中包含 NULL 的行数为零。
如果说您想在计数不为零时执行操作(发送电子邮件或其他警报),那么您将添加另一个任务并使用表达式和约束对其进行配置,但现在使用 @[User::NullRowCount] > 0
表达式
根据评论
我可以在数据源中加载数据之前在数据流中停止它(强制出错)吗?因为这个 sql 文本发送一封电子邮件,所以我希望所有 etl 过程都在一个数据流中完成
不,不是真的。假设您使用显式引发错误的脚本任务或强制除以零的派生列任务更改了上面的行数 - 其中任何一个都会中断数据流,但是你没有不知道是数据流的第一行导致异常还是十亿分之一。在后一种情况下,数据已经流入目的地(除非您的提交大小为 0,这会导致其他问题)并且您已经部分加载了数据。
最终,您需要对数据进行预处理,以确定是否存在不符合预期的数据。我会进行上述更改 - 如果您有任何错误数据,但不要将数据放入表中,而是将其放入 Raw File 中。原始文件是数据的紧凑二进制文件,所以是的,您将支付磁盘 IO 损失,但如果数据有效,它将为您节省重新处理数据的时间。
然后,您使用上述先例约束方法添加一个新的数据流任务,该任务仅在您的空计数为零时才有效。这个新的数据流只是原始文件源到“原始目标”。现在,只有在原始数据的情况下,您才能在表中彻底分离数据,而不必担心部分加载。
【讨论】:
谢谢,你太棒了。老实说,我添加了强制除以零的派生列任务,因为在加载之前我在真实案例中进行了一些转换。奇怪的是 ssis 没有通常的方法来强制出错,你甚至不能除以零,我必须除以我的列*0以上是关于如何在调试过程中强制 SSIS 数据流出错或停止?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过在SSIS中调用函数或存储过程来使用拆分转换过滤和拆分数据?
PL/SQL 里,在TEST窗口调试,想停止了时候,不能停止,怎么回事