SSIS SQL执行由单行结果集引起的任务错误,但未返回任何行

时间:2014-04-22 23:20:21

标签: sql sql-server-2008 tsql foreach ssis

在SSIS 2008中,我在Foreach循环中有一个执行SQL任务,它将从表中获取一个结果值并将其放入文件系统任务的变量中。 SQL代码类似于:

SELECT productcode
FROM products
WHERE eancode = ?

如果代码与相应的eancode匹配,代码将从表产品返回产品代码。 ?是源自图像文件名的SSIS中的变量。

基本上,包(loop + sqltask + FStask)会将文件名从eancode更改为productcode。

有时程序包会失败,因为SQL任务会尝试获取产品代码,但无法返回结果。如果表中不存在eancode,则会发生这种情况。

可以采取哪些措施来处理此类错误,以便循环不会停止?

我想到了这些可能的解决方案:

  1. 使用ISNULL(产品代码,'替换')不是一个选项。结果     set将用于一个将用于重命名的变量     图像的文件名。这将导致每个无结果图像得到     更换'名称。而且,它只是不会返回任何东西,而不是     甚至是isnull替代品。

  2. 更改exec SQL任务或ForEach循环的属性设置, 所以它跳到下一个但是哪一个到什么?

  3. 从sql任务添加失败的优先约束到另一个(子) 任务。但它应该导致什么任务呢?如果在sql任务中没有设置结果,它基本上没有任何内容。

  4. 将约束更改为“完成”,但这会导致FileSystem任务发出错误,因为它缺少目标文件路径名的值。如果sql任务失败,则不应在下一个任务中重命名该文件。

  5. 理想的情况是,如果sql任务由于没有结果集而失败,则当前循环将按原样离开SQL步骤并继续下一轮。

    由于

3 个答案:

答案 0 :(得分:1)

这应该保证每次返回一行,然后你可以在后续步骤中找出如何忽略NULL。

但是当你点击参数按钮时,SSIS可能太笨了,无法确定参数的位置。

SELECT TOP 1 productcode
FROM (
SELECT productcode
FROM products
WHERE eancode = ?
UNION ALL 
SELECT NULL
) As F
ORDER BY productcode DESC

答案 1 :(得分:0)

您可以评估从查询填充的变量值,并向成功约束添加条件以检查变量的值。我把一个简单的例子放在一起,但希望它有所帮助。

我使用了这个功能:

LEN(@[User::Variable]) > 0

enter image description here

enter image description here

答案 2 :(得分:0)

唯一的原因是你在Result set中设置了一些数据。因此,结果集可能与您的sql执行任务不匹配。所以请检查结果集并且传递变量都应匹配