我想发送dbmail,显示更新sql代理作业运行后受影响的行数

时间:2014-04-04 13:29:36

标签: sql sql-server-2008 dbmail

我有一个运行多个UPDATE语句的SQL代理作业。我想要的是让它在每天运行后发送一封电子邮件。我收到了电子邮件,但它没有显示受影响的行数或任何内容。这就是我所拥有的。

--Print @tableHTML
DECLARE @eSubject varchar(250)
DECLARE @emailTo varchar(250)
SET @eSubject = 'Number of rows updated'   
SET @emailTo = 'me@me.com' 
EXEC msdb.dbo.sp_send_dbmail @recipients=@emailTo,
    @subject = @eSubject,
    @body = @@ROWCOUNT,
    @body_format = 'HTML';

这将是一种工作,但我宁愿拥有

--Print @tableHTML
DECLARE @eSubject varchar(250)
DECLARE @emailTo varchar(250)
SET @eSubject = 'Number of rows updated'   
SET @emailTo = 'me@me.com' 
EXEC msdb.dbo.sp_send_dbmail @recipients=@emailTo,
    @subject = @eSubject,
    @body = @@ROWCOUNT + 'row(s) affected by UPDATE',
    @body_format = 'HTML';

但是,由于@@ ROWCOUNT之后的'+',我会收到语法错误。

2 个答案:

答案 0 :(得分:0)

更改此行

@body = @@ROWCOUNT + 'row(s) affected by UPDATE',

是这个

@body = CONVERT(varchar(10),@@ROWCOUNT) + 'row(s) affected by UPDATE',

问题是数据类型不匹配,因此sql server不知道如何处理+符号。

另外@@ROWCOUNT仅返回上一个执行语句的行数,在它的情​​况下它是SET语句。因此它将始终返回1;

只需添加另一个变量,然后在select语句后添加SET @RowCountVariable = @@ROWCOUNT

之后可以修改

@body = CONVERT(varchar(10),@RowCountVariable)+ 'row(s) affected by UPDATE',

答案 1 :(得分:0)

在任何INSERT,UPDATE,DELETE或SELECT语句之后填充该语句的@@ ROWCOUNT。

假设你执行一个陈述

SELECT * FROM dbo.foo

SELECT @@ROWCOUNT   --<-- here it will show number of rows affected by select

现在,如果您甚至声明变量并为其赋值

DECLARE @Test_Var INT = 1;

SELECT @@ROWCOUNT   --<-- here @@ROWCOUNT will show you 1

因此,如果你在代码中,你已经执行了一个语句并且你对该语句影响的行数感兴趣,那么使该语句后跟一个变量来存储@@ ROWCOUNT的值

DECLARE @rcount INT

SELECT * FROM dbo.foo
SELECT @rcount = @@ROWCOUNT;

现在您可以在任何地方使用此变量。当vladimir解释显示您要显示的消息时,此时@@ ROWCOUNT的值将安全地保存在变量中。

您的代码

DECLARE @eSubject varchar(250)
DECLARE @emailTo varchar(250)
SET @eSubject = 'Number of rows updated' --<-- this would have reset the value of @@ROWCOUNT to 1
SET @emailTo = 'me@me.com'         --<-- this would have reset the value of @@ROWCOUNT to 1 again
EXEC msdb.dbo.sp_send_dbmail @recipients=@emailTo,
    @subject = @eSubject,
    @body = @@ROWCOUNT,
    @body_format = 'HTML';

<强>更新

您的更新声明

DECLARE @Rcount NVARCHAR(1000);
UPDATE foo
   SET Colfoo = 'foo'

 -- now use the variable to store the value

SET @Rcount = CAST(@@ROWCOUNT AS NVARCHAR(10)) + ' row(s) affected by UPDATE';

SELECT @Rcount;  --<-- test it