【问题标题】:SSIS SQL Execute task error caused by single row result set but no rows were returned单行结果集导致的SSIS SQL Execute任务错误但没有返回行
【发布时间】:2014-06-07 13:29:46
【问题描述】:

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

SELECT productcode
FROM products
WHERE eancode = ?

如果与对应的 eancode 匹配,该代码将返回表 products 中的 productcode。 ? 是 SSIS 中从图像文件名派生的变量。

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

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

如何处理此类错误以使循环不会停止?

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

  1. 使用 ISNULL(productcode,'replacement') 不是一个选项。结果 set 将用于一个变量,该变量将用于重命名 图像的文件名。这将导致每个没有结果的图像得到 “替换”名称。此外,它只是不会返回任何东西,不 甚至是 isnull 替换。

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

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

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

理想的情况是如果 sql 任务因为没有结果集而失败,当前循环将保留 SQL 步骤并继续下一轮。

谢谢

【问题讨论】:

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


    【解决方案1】:

    这应该保证每次都返回一行,然后您可以在后续步骤中计算如何忽略 NULL。

    但是当你点击参数按钮时,SSIS 可能太笨了,无法计算出参数的去向。

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

    【讨论】:

    • PS SSIS 可能是错误的工具。创建程序逻辑不是那么灵活,即使你这样做了,它也被埋在表达式和约束等中。
    • 感谢@ElectricIama,我会尝试查询并在下一步中找到处理空值的方法。我相信你有一点关于 ssis 不是这个的最佳工具。您是否碰巧知道任何值得一看的更灵活的工具?
    • 就我个人而言,我会使用 VBScript,但实际上它是您熟悉的任何语言。现代的替代品是 Powershell。如果你想学习一些新的东西并且你认为你会做更多这样的 windows 脚本,你应该学习 powershell。我认为人们认为如果是与 SQL Server 数据相关的您需要使用 SSIS,但事实并非如此。
    【解决方案2】:

    您可以评估从查询中填充的变量值,并将条件添加到成功约束以检查变量的值。我整理了一个简单的示例,但希望对您有所帮助。

    我用过这个功能:

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

    【讨论】:

    • 我展示的是 SSIS 2012,但该功能也存在于 2008 年,用于将表达式添加到约束中。
    • 感谢@Vinnie,我在 2008 年尝试过,但问题仍然存在。 Execute SQL 任务仍然返回无结果错误,因此它不能在约束中放置任何值。我发现这个视频用 foreach 循环内的序列容器解决了这个问题:youtu.be/CqLjL44DSQk
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2023-04-04
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多