Search code examples
sqlsql-server-2008dbmail

I want to send dbmail showing the number of affected rows after an update sql agent job runs


I have a SQL agent job that runs several UPDATE statements. What I want is to have it send of an email after it runs everyday. I get the emails but it doesn't show the number of rows affected or anything. Here is what I have.

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

This will kind of work but what I would rather have is

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

However, i get syntax errors due to the '+' after @@ROWCOUNT.


Solution

  • After any INSERT, UPDATE, DELETE or SELECT statement @@ROWCOUNT is populated for that statement.

    Say you execute a statement

    SELECT * FROM dbo.foo
    
    SELECT @@ROWCOUNT   --<-- here it will show number of rows affected by select
    

    now if you you even declare a variable and assign value to it

    DECLARE @Test_Var INT = 1;
    
    SELECT @@ROWCOUNT   --<-- here @@ROWCOUNT will show you 1
    

    Therefore where ever you are in you code, onec you have executed a statement and you are interested in the number of rows being affected by that statement , make that statement followed by a variable to store the value of @@ROWCOUNT

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

    Now you can use this variable anywhere . Do as vladimir has explained to show the message you want to show , but the value of @@ROWCOUNT at the point is saved in a variable safely.

    Your Code

    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 = '[email protected]'         --<-- 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';
    

    Update

    Your update statement

    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