0

我有一个运行多个 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 之后的“+”,我得到了语法错误。

4

2 回答 2

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',
于 2014-04-04T13:35:33.527 回答
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
于 2014-04-04T13:47:19.297 回答