我有一个运行多个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之后的'+',我会收到语法错误。
答案 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