2014-01-23 173 views
0

我有一个存储过程,它执行查询并调用dbmail。邮件消息包含执行的查询结果。我想在这两个地方向查询传递一个参数/变量:存储过程和dbmail中的@query。以下是我想如何运行它,但由于参数(@Threshold)未传递到dbmail块,所以出现错误。我怎样才能做到这一点?需要将存储过程中的参数传递给sp_send_dbmail @query

ALTER PROCEDURE [dbo].[spMyProcedure] @Threshold float 

AS 

IF EXISTS (SELECT Fields FROM Table 
WHERE DataValue < @Threshold AND LocalDateTime >= DATEADD(hour, -24, SYSDATETIME()) 
GROUP BY Fields) 

BEGIN 

SET NOCOUNT ON 

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'Profile', 
@from_address = '[email protected]', 
@recipients = '[email protected]', 
@subject = 'Data Warning', 
@body = 'The following results are outside the defined range.', 
@query = 'SELECT Fields FROM Table 
WHERE DataValue < @Threshold AND LocalDateTime >= DATEADD(hour, -24, SYSDATETIME()) 
GROUP BY Fields' ; 

END 

回答

1

您正在将一个字符串传递给@query参数,因此它不知道@Threshold的值。您需要创建一个字符串变量并包含实际值。然后您可以将该变量传递给sp_send_dbmail过程。

DECLARE @qry varchar(MAX) 
SET @qry = 'SELECT Fields FROM Table WHERE DataValue < ' 
+ cast(@Threshold as varchar) + 
' AND LocalDateTime >= DATEADD(hour, -24, SYSDATETIME()) GROUP BY Fields' 
+0

在我看来,像你的解决方案应该工作,但我得到这个错误: 消息22050,级别16,状态1,行0 错误格式查询,可能是无效的参数 消息14661,级别16 ,状态1,过程sp_send_dbmail,行517 查询执行失败:消息105,级别15,状态1,服务器WIN-O9R9U2CPD6B,第2行 字符串'i '后未使用引号。 Msg 102,Level 15,State 1,Server WIN-O9R9U2CPD6B,Line 2 'i '附近的语法不正确。 – user3229811

+0

我使@qry字符串的大小太小,并且截断了字符串。我相应地更新了示例。 – cdev

+0

是的,我设置了@qry VARCHAR(500),它工作得很好。谢谢。 – user3229811

相关问题