如何更正我的SQL作业中的标量变量声明错误?

时间:2018-02-20 15:19:52

标签: sql sql-server user-defined-functions sp-send-dbmail

我正在使用SQL Server 2012,我有以下存储过程,它以HTML表格的形式返回所需的输出:

CREATE PROCEDURE dbo.ITB_SendEmail
AS
BEGIN
DECLARE @Body NVARCHAR(MAX),
        @Body2 NVARCHAR(MAX),
        @TableHead VARCHAR(1000),
        @TableTail VARCHAR(1000)

SET @TableTail = '</table></body></html>' ;
SET @TableHead = '<html><head>' + '<style>'
    + 'td {border: solid black;border-width: 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font: 11px arial} '
    + '</style>' + '</head>' + '<body>' + 'Report generated on : '
    + CONVERT(VARCHAR(50), GETDATE(), 106) 
    + ' <br> <table cellpadding=0 cellspacing=0 border=0>' 
    + '<tr> <td bgcolor=#E6E6FA><b>StayYear</b></td>'
    + '<td bgcolor=#E6E6FA><b>Market</b></td>'
    + '<td bgcolor=#E6E6FA><b>Jan</b></td>'
    + '<td bgcolor=#E6E6FA><b>Feb</b></td>'
    + '<td bgcolor=#E6E6FA><b>Mar</b></td>'
    + '<td bgcolor=#E6E6FA><b>Apr</b></td>'
    + '<td bgcolor=#E6E6FA><b>May</b></td>'
    + '<td bgcolor=#E6E6FA><b>Jun</b></td>'
    + '<td bgcolor=#E6E6FA><b>Jul</b></td>'
    + '<td bgcolor=#E6E6FA><b>Aug</b></td>'
    + '<td bgcolor=#E6E6FA><b>Sep</b></td>'
    + '<td bgcolor=#E6E6FA><b>Oct</b></td>'
    + '<td bgcolor=#E6E6FA><b>Nov</b></td>'
    + '<td bgcolor=#E6E6FA><b>Dec</b></td>';

SET @Body = ( SELECT td = StayYear, '',
                        td = Market, '',
                        td = Jan, '',
                        td = Feb, '',
                        td = Mar, '',
                        td = Apr, '',
                        td = May, '',
                        td = Jun, '',
                        td = Jul, '',
                        td = Aug, '',
                        td = Sep, '',
                        td = Oct, '',
                        td = Nov, '',
                        td = Dec, ''
              FROM  View1               
                FOR   XML RAW('tr'),
                      ELEMENTS
            )


SET  @Body2 = @TableHead + ISNULL(@Body, '') + @TableTail

SELECT  @Body2

END

我现在已经设置了一个SQL作业,该作业应该执行此存储过程并将输出通过电子邮件发送给收件人。我的SQL Server作业运行T-SQL查询(见下文):

DECLARE @GeneratedHTML NVARCHAR(MAX); 
EXEC ITB_SendEmail @GeneratedHTML = @Body2 OUTPUT

EXEC sp_send_dbmail 
  @profile_name='BI',
  @copy_recipients ='',
  @recipients='xxx@yyyy.com',
  @subject='ITB',
  @body= @GeneratedHTML ,
  @body_format = 'HTML' ;

但是,SQL Server作业失败,并显示以下错误消息:

  

必须声明标量变量@ Body2。 [SQLSTATE 42000](错误137)。步骤失败

我无法弄清楚标量变量声明问题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

错误并不是指您的存储过程代码中的变量,如果这是您的想法。

它说您需要在执行批处理中声明@Body2。但是你有更多的问题。您正在尝试访问存储过程的输出参数,但在存储过程中,您还没有输出参数。

阅读documentation on Output parameters将是一个良好的开端。

假设您在存储过程中正确设置@Body2作为输出参数,那么您只需要在执行语句中反转它们的顺序:

DECLARE @GeneratedHTML NVARCHAR(MAX); 

EXEC ITB_SendEmail  @Body2 = @GeneratedHTML  OUTPUT

EXEC sp_send_dbmail 
  @profile_name='BI',
  @copy_recipients ='',
  @recipients='xxx@yyyy.com',
  @subject='ITB',
  @body= @GeneratedHTML ,
  @body_format = 'HTML' ;