【问题标题】:SSIS Execute SQL Task error no rows returnedSSIS 执行 SQL 任务错误没有返回行
【发布时间】:2016-09-12 04:27:08
【问题描述】:

我对 SSIS 有点陌生,我接到了一项任务,即根据采购订单 -> PONumber 向特定商店发送邮件。

步骤如下:

1)从特定文件夹中获取 XML 文件

2) 从该文件中获取 PONumber

3) 编写查询以获取 PONumbers 的所有商店电子邮件地址

4)向特定餐厅发送邮件

下面的截图是我创建的一个包。我唯一遇到的问题是 Execute SQL Task ,不确定确切原因是什么?

您能帮我调试一下吗?这之前工作正常,但突然开始显示错误。

IMAGE1

IMAGE5

【问题讨论】:

    标签: ssis ssis-2008


    【解决方案1】:

    执行 SQL 任务期待查询的结果,但没有得到任何结果。也许您可以使用 SQL Server 探查器来捕获在 SQL Server 上执行的确切 SQL。然后,您可以在查询窗口中使用该 SQL 来解决它返回的内容或为什么它没有给出任何结果。

    编辑。 您当前的附加信息有趣的地方是“参数映射”页面,您没有包括在内。正如马特解释的那样,您应该将 SSIS 变量链接到其中的查询参数。 SSIS 不会链接您在 SSIS 中的变量并自动查询,即使它们具有相同的名称。

    【讨论】:

    • 您好,请在 SQL 执行任务和 SSMS 中查看上面的代码。它在 SSMS 上运行良好,但在 SQL Execute 任务上运行良好。
    • 不知道为什么这个答案被某人否决了这是正确的问题是 OP 没有得到结果,在回答时没有其他信息可以引导社区确定更多确切的原因。
    【解决方案2】:

    @dvlpr 是正确的,您的问题是当执行 SQL 任务 1 需要单个结果时,您没有得到任何结果。

    您粘贴的代码有点不清楚哪个代码在哪里,但我假设第一部分是您在 SSIS 执行任务中使用的代码,后者是 SSMS 中的示例。如果是这种情况,问题是您在脚本本身中为变量分配了值 0,我假设没有 PONUMBER 为 0:

    Declare @POID as Varchar(50)
    Set @POID = 0
    WHERE    (BizTalk_POA_HEADER.PONUMBER = @POID)
    

    如果您想从您的第一个数据流任务中传递 PONUMBER,您需要将其加载到一个变量中,然后在您的执行 SQL 任务中使用该变量,并确保在执行此操作时正确设置参数映射。这是一个关于参数的 SO 问题,这将有助于 How to pass variable as a parameter in Execute SQL Task SSIS? 这里是在数据流任务中使用表达式任务来设置变量值 SSIS set result set from data flow to variable (注意使用后来添加的不接受的答案,用于2012 年以上,而原版是 2008 年)

    接下来,除非您保证只有 1 个结果,否则您还需要将 TOP 1 添加到您的 select 语句中,因为如果您获得超过 1 个结果,您将再次收到不同的错误。

    按所有 cmets 编辑:

    所以配置看起来像您正在使用允许您使用命名参数的 ADO.NET 连接。如果您不使用它(https://msdn.microsoft.com/en-us/library/cc280502.aspx),则会受到限制。参数映射看起来正确,结果集应该没问题。至于您的错误,我不知道,因为您没有发布确切的错误,所以我不知道问题出在哪里。如果您在图像中将 ADO.Net 与当前的执行 SQL 任务配置一起使用,您确实会遇到一些问题。 1 您试图声明要作为无效参数传递的变量,您需要删除该 DECLARE 语句。我怀疑您真正需要做的就是将您的 SQL 输入修改为:

    SELECT    DISTINCT  BizTalk_POA_HEADER.PONUMBER, FAN_Suppliers.SupplierName,      
    FAN_Company_Details.CompanyName, FAN_Company_Details.[PrimaryEmail],   
    BizTalk_POA_HEADER.[DeliveryDate]
    FROM BizTalk_POA_HEADER INNER JOIN
    FAN_PO_Details ON BizTalk_POA_HEADER.PONUMBER =   
    CONCAT('PO',FAN_PO_Details.PoNumber) INNER JOIN
    FAN_PO ON FAN_PO_Details.PurchaseOrderID = FAN_PO.PurchaseOrderID 
    INNER JOIN FAN_SupplierDetails ON FAN_PO.SupplierDetailsID =    
    FAN_SupplierDetails.SuppliersDetailsID INNER JOIN
    FAN_Suppliers ON FAN_SupplierDetails.SupplierID = FAN_Suppliers.SupplierID  
    INNER JOIN FAN_Company_Details ON FAN_PO.CompanyID =   
    FAN_Company_Details.CompanyDetailsID
    WHERE    (BizTalk_POA_HEADER.PONUMBER = @POID)
    

    只需去掉声明 @POID 和 SET = 0 有几个原因 1 因为在设置参数映射时它是多余的,2 SSIS 不喜欢它并且会抛出错误,3 因为你正在设置它的值为 0,这意味着它将始终为 0.....

    【讨论】:

    • 嗨,马特,谢谢,但我在上面添加了一个额外的屏幕截图,其中包含一个结果集和 PONUMBER。我还需要传递参数吗?
    • 屏幕截图显示结果集而非参数。参数映射是您定义要使用的值的地方。如果您按照第一个链接“如何通过...”,您将看到如何这样做。用一个 ?而不是命名参数可能是最简单的,但你必须知道哪个顺序?标记在里面。如果您有更多困难,我建议您粘贴您的确切执行 SQL 任务以及要粘贴为变量的变量。
    • 嗨,马特,我添加了执行 SQL 任务,其中包含所有属性。执行 SQL 任务代码是您确定的第一个以 Declare POID as varchar.... 开头的代码。
    • Matt 对以上内容有什么想法吗?
    • 屏幕截图仍然显示结果集,“参数映射”是问题所在。您不断显示如何获取返回数据的配置,您需要显示如何传递参数的配置。巧合的是,您使用 PONUMBER 变量作为结果和参数,这可能不是最好的主意,但只要它是相同的就没有关系。按照我的答案中的第一个链接查看我所指的内容。
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多