2014-01-23 218 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

相關問題