Sql 需要将存储过程中的参数传递给sp_send_dbmail@query
我有一个存储过程,它执行一个查询,然后调用dbmail。邮件消息包括执行的查询结果。我想在两个位置向查询传递一个参数/变量:存储过程和dbmail中的@query。下面是我希望如何运行它,但我得到一个错误,因为参数@Threshold没有传递给dbmail块。我该怎么做Sql 需要将存储过程中的参数传递给sp_send_dbmail@query,sql,sql-server,stored-procedures,sp-send-dbmail,Sql,Sql Server,Stored Procedures,Sp Send Dbmail,我有一个存储过程,它执行一个查询,然后调用dbmail。邮件消息包括执行的查询结果。我想在两个位置向查询传递一个参数/变量:存储过程和dbmail中的@query。下面是我希望如何运行它,但我得到一个错误,因为参数@Threshold没有传递给dbmail块。我该怎么做 ALTER PROCEDURE [dbo].[spMyProcedure] @Threshold float AS IF EXISTS (SELECT Fields FROM Table WHERE DataValue &l
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 = 'data@data.com',
@recipients = 'data@data.com',
@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
您正在向@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'
在我看来,您的解决方案应该可以工作,但我得到了以下错误:Msg 22050,级别16,状态1,第0行错误格式化查询,可能是无效参数Msg 14661,级别16,状态1,过程sp_send_dbmail,第517行查询执行失败:Msg 105,级别15,状态1,服务器WIN-O9R9U2CPD6B,第2行字符串“i”后的未闭合引号。Msg 102,级别15,状态1,服务器WIN-O9R9U2CPD6B,第2行“i”附近的语法不正确。我将@qry字符串大小设置得太小,它正在截断字符串。我相应地更新了示例。是的,我设置了@qry VARCHAR500,效果很好。谢谢