如何更正我的 SQL 作业中的标量变量声明错误?
How to correct the scalar variable declaration error in my SQL job?
我正在使用 SQL Server 2012,我有以下存储过程,它以 HTML table:
的形式返回所需的输出
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 服务器作业运行 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 服务器作业失败并显示以下错误消息:
Must declare the scalar variable @Body2. [SQLSTATE 42000] (Error 137). The step failed
我无法弄清楚标量变量声明问题。我做错了什么?
错误不是指存储过程代码中的变量,如果那是您的想法。
它说您需要在执行批处理中声明 @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' ;
我正在使用 SQL Server 2012,我有以下存储过程,它以 HTML table:
的形式返回所需的输出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 服务器作业运行 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 服务器作业失败并显示以下错误消息:
Must declare the scalar variable @Body2. [SQLSTATE 42000] (Error 137). The step failed
我无法弄清楚标量变量声明问题。我做错了什么?
错误不是指存储过程代码中的变量,如果那是您的想法。
它说您需要在执行批处理中声明 @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' ;