在SSIS 2008中,我在Foreach循环中有一个执行SQL任务,它将从表中获取一个结果值并将其放入文件系统任务的变量中。 SQL代码类似于:
SELECT productcode
FROM products
WHERE eancode = ?
如果代码与相应的eancode匹配,代码将从表产品返回产品代码。 ?
是源自图像文件名的SSIS中的变量。
基本上,包(loop + sqltask + FStask)会将文件名从eancode更改为productcode。
有时程序包会失败,因为SQL任务会尝试获取产品代码,但无法返回结果。如果表中不存在eancode,则会发生这种情况。
可以采取哪些措施来处理此类错误,以便循环不会停止?
我想到了这些可能的解决方案:
使用ISNULL(产品代码,'替换')不是一个选项。结果 set将用于一个将用于重命名的变量 图像的文件名。这将导致每个无结果图像得到 更换'名称。而且,它只是不会返回任何东西,而不是 甚至是isnull替代品。
更改exec SQL任务或ForEach循环的属性设置, 所以它跳到下一个但是哪一个到什么?
从sql任务添加失败的优先约束到另一个(子) 任务。但它应该导致什么任务呢?如果在sql任务中没有设置结果,它基本上没有任何内容。
将约束更改为“完成”,但这会导致FileSystem任务发出错误,因为它缺少目标文件路径名的值。如果sql任务失败,则不应在下一个任务中重命名该文件。
理想的情况是,如果sql任务由于没有结果集而失败,则当前循环将按原样离开SQL步骤并继续下一轮。
由于
答案 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
答案 2 :(得分:0)
唯一的原因是你在Result set中设置了一些数据。因此,结果集可能与您的sql执行任务不匹配。所以请检查结果集并且传递变量都应匹配