错误"由于ssis中的编译错误,无法分析批次"在使用存储过程的输出参数传递时执行sql任务

时间:2017-12-26 15:26:26

标签: sql-server ssis etl

我使用sp_send_dbmail获取mailitem_id作为输出。当我使用输出参数

运行查询时

enter image description here

它投掷以下错误而没有输出它工作正常。

  

错误:执行SQL任务]错误:执行查询" exec? = sp_send_dbmail @ profile_name = ?, @recipien ..."失败,出现以下错误:
  由于编译错误,无法分析批次   可能的失败原因:查询问题," ResultSet"属性设置不正确,参数设置不正确或连接未正确建立。

查询:

exec ? = sp_send_dbmail @profile_name = ?, @recipients = ?, 
                        @copy_recipients = ?, @subject = ?,
                        @body = ?, @importance = ?,
                        @body_format = ?@mailitem_id = ? OUT

@mailitem_id是存储过程中的OUTPUT参数,INT类型的参数。

我尝试了不同的方法来传递输出参数但仍然得到相同的错误...是否因为传递输出参数无法获取数据类型不匹配或语法错误而失败..

请帮我解决问题..我在屏幕截图中添加了参数映射窗口。我在Short的参数映射中尝试使用ULarge_integerLarge_integerLong类型代替mailitem_id

2 个答案:

答案 0 :(得分:2)

可能是错误消息中描述的几个内容之一,或者所有内容。我将按照显示的顺序处理错误消息。

解决错误消息

  

查询问题

  1. 使用EXEC @return_status = ...语法时,必须使用@符号定义T-SQL变量。该变量也必须声明,因此EXEC ?只有在参数0作为@return_value等值传入时才合乎逻辑。
  2. 正如marc_s评论的那样,脚本缺少两个参数之间的逗号:@body_format = ?@mailitem_id
  3. @mailitem_id = ? OUT不是此输出参数的正确语法,除非?的参数位置被定义为脚本中声明的变量(类似于问题#1)。
  4. 查询应该看起来像这样:

    DECLARE @return_status INT, @mailitem_id INT;
    EXEC @return_status = sp_send_dbmail @profile_name = ?, @recipients = ?, 
        @copy_recipients = ?, @subject = ?,
        @body = ?, @importance = ?,
        @body_format = ?, @mailitem_id = @mailitem_id OUTPUT
    SELECT @return_status AS return_status, @mailitem_id AS mailitem_id;
    

    有关执行此存储过程的一些示例,请参阅sp_send_dbmail documentation

      

    “ResultSet”属性设置不正确

    执行SQL任务编辑器常规标签中,ResultSet组中Result Set的值是多少?

    选项包括:

    • None - 查询返回无结果
    • Single row - 查询只返回一行
    • Full result set - 查询返回多行
    • XML - 查询以XML格式返回结果集

    确保所选选项与脚本提供结果集的方式一致,并将任务配置的其余部分配置为处理它。

      

    参数设置不正确

    执行SQL任务编辑器左侧的结果集标签是查询中的参数应映射到SSIS变量的位置。确保根据您在常规标签中选择的ResultSet在此处映射您期望的映射变量。

    全部放在一起

    使用我在“查询问题”下提供的代码,然后在执行SQL任务编辑器的常规标签中设置ResultSet属性将成为Single row。然后,在结果集选项卡中,您将从脚本(return_statusmailitem_id)返回的列值映射到SSIS变量(例如User::Status和{ {1}}如屏幕截图所示。

答案 1 :(得分:0)

现在它可以正常使用以下查询并将mailitem_id作为输出。

exec sp_send_dbmail @profile_name=?,@recipients=?,@copy_recipients=?,@subject=?,@body=?,@importance=?,@body_format=?,@mailitem_id= ? OUTPUT