Send specific message if no results available using sp_send_dbmail - sql

I would like to have a specific message sent if no results are available. Right now if my job executes and there is nothing to report the email just show up blank.
SP is below
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'Mail_profile',
#recipients = 'myemail#somename.com',
#subject = 'Weekly',
#query = N'EXEC PTW.dbo.SP_Weekly',
#attach_query_result_as_file = 1,
#query_result_width = 150,
#query_result_header= 1,
#query_attachment_filename = 'Weekly.txt',
#importance = 'High',
#query_result_no_padding = 1,
#query_result_separator = ' ';
If there are no records available when this is ran, I would like to show No records available at this time
I have tried to insert an ISNULL before #query but this is something I'm stumped on. Any suggestions?
Would also like the message always show No records found for 'Yesterdays date'
Thinking id have to add dateadd(day, datediff(day, 0, getdate()), -1) somewhere in there but where?

declare #subject1 varchar(max)
declare #body1 varchar(max)
EXEC PTW.dbo.SP_Weekly
if ##rowcount=0
begin
set #subject1='No data or any message that suits you'
set #body1='some message'
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'Mail_profile',
#recipients = 'myemail#somename.com',
#subject = #subject1,
#importance = 'High',
#body=#body1,
#query_result_separator = ' ';
return
end
else
begin
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'Mail_profile',
#recipients = 'myemail#somename.com',
#subject = 'Weekly,
#query = N'EXEC PTW.dbo.SP_Weekly',
#attach_query_result_as_file = 1,
#query_result_width = 150,
#query_result_header= 1,
#query_attachment_filename = 'Weekly.txt',
#importance = 'High',
#query_result_no_padding = 1,
#query_result_separator = ' ';
end

Related

SQL sending email with data

I am trying to send a table via email in a table like shape. What I mean is to style nicely the text that I am receiving in email, because now it looks ugly, not like a table. Any help would be much appreciated.
ALTER PROCEDURE [dbo].[testEmail]
AS
BEGIN
DECLARE #SubjectText VARCHAR(100) = 'Day ' + CONVERT(VARCHAR,(CONVERT(DATE,GETDATE())))
DECLARE #tab char(1) = CHAR(9);
BEGIN
EXEC msdb.dbo.sp_send_dbmail
#query = 'SELECT IDDruzyny, nazwa FROM TEST.dbo.Druzyna',
#body = '
<html>
<body>
<br/><b><font color=red>Hiho</font></b>
</body>
</html>
',
#Body_format = 'HTML',
#subject = #SubjectText,
#profile_name = 'SIT',
#recipients = 'safemail#onet.eu',
#attach_query_result_as_file = 0,
#query_result_separator = #tab,
#query_result_header = 1
END
END

SSIS Error: Unable to retrieve destination column descriptions from the parameters of the SQL command

I am getting an error :
[Load updated records to Table_vwAs_FixedIdentifier [85]] Error: Unable to retrieve destination column descriptions from the parameters of the SQL command.
when I execute the SSIS task in the image. It fails on the lower left "Load updated records to Table_vwAs.." oleDb update task. It has the following sql statement and also has a trigger also shown below. I have not been able to identify the cause of this issue till now. When I disabled the trigger, the task ran successfully. Any help will be eye-opening.
UPDATE
[dbo].[Sec]
SET
[SecID]=?
,[SECURITY_NAME]=?
,[SECURITY_SECTYPE_ID]=?
,[SECURITY_EXCHANGE_ID]=?
WHERE
[MasterID]=?
Trigger code is as follows:
alter trigger [dbo].[TrTable_Fixed_AFTERUPDATE] on [dbo].[Sec]
after insert ,update
as
set NOCOUNT on
declare #DBMailDistributionListId varchar(50)
declare #ProfileName varchar(max)
declare #Recipients varchar(max)
declare #CopyRecipients varchar(max)
declare #BlindCopyRecipients varchar(max)
set #DBMailDistributionListId = 'Crossadyne1'
set #ProfileName = SharedCode.dbo.FnGetDBMailDistributionListProfileName(#DBMailDistributionListId)
set #Recipients = SharedCode.dbo.FnGetDBMailDistributionListRecipients(#DBMailDistributionListId)
set #CopyRecipients = SharedCode.dbo.FnGetDBMailDistributionListCopyRecipients(#DBMailDistributionListId)
set #BlindCopyRecipients = SharedCode.dbo.FnGetDBMailDistributionListBlindCopyRecipients(#DBMailDistributionListId)
declare #Subject varchar(max)
declare #Body varchar(max)
set #Body = ''
select distinct #Body = #Body + 'Master Sec ID: ' + convert(nvarchar(50) ,i.MasterId) + char(13) + char(10)
+ 'New Legal Entity ID: ' + convert(nvarchar(50) ,i.[INTERNAL_SECURITY_LEGALENTITY_ID])
from INSERTED i
inner join DELETED d
on i.MasterId = d.MasterId
where i.[INTERNAL_SECURITY_LEGALENTITY_ID] <> d.[INTERNAL_SECURITY_LEGALENTITY_ID]
and i.Security_Change_Date = i.LegalEntityChangeDate
and i.LegalEntityChangedBy not in (2 ,5)
if (#Body <> '')
begin
set #Subject = 'WARNING: Crossadyne Security Legal Entity changed'
exec msdb.dbo.sp_send_dbmail
#profile_name = #ProfileName
, #recipients = #Recipients
, #copy_recipients = #CopyRecipients
, #blind_copy_recipients = #BlindCopyRecipients
, #subject = #Subject
, #body = #Body
end
set #DBMailDistributionListId = 'test'
set #ProfileName = SharedCode.dbo.FnGetDBMailDistributionListProfileName(#DBMailDistributionListId)
set #Recipients = SharedCode.dbo.FnGetDBMailDistributionListRecipients(#DBMailDistributionListId)
set #CopyRecipients = SharedCode.dbo.FnGetDBMailDistributionListCopyRecipients(#DBMailDistributionListId)
set #BlindCopyRecipients = SharedCode.dbo.FnGetDBMailDistributionListBlindCopyRecipients(#DBMailDistributionListId)
set #Body = ''
select distinct #Body = #Body + 'Master ID: ' + convert(nvarchar(50) ,i.MasterId) + char(13) + char(10)
+ 'Previous Legal Entity ID: ' + convert(nvarchar(50) ,d.[INTERNAL_SECURITY_LEGALENTITY_ID])
from INSERTED i
inner join DELETED d
on i.MasterId = d.MasterId
where i.[INTERNAL_SECURITY_ID] <> d.[INTERNAL_SECURITY_LEGALENTITY_ID]
if (#Body <> '')
begin
set #Subject = 'WARNING: Crossadyne Security Legal Entity changed'
exec msdb.dbo.sp_send_dbmail
#profile_name = #ProfileName
, #recipients = #Recipients
, #copy_recipients = #CopyRecipients
, #blind_copy_recipients = #BlindCopyRecipients
, #subject = #Subject
, #body = #Body
end
set NOCOUNT off
The issue was being caused due to
exec msdb.dbo.sp_send_dbmail
in the trigger code, because it is not configured on the QA server. Resolved after I commented those lines.

Send sp_send_dbmail only if results are available

I want to send an e-mail from my database only if the executed query has output and is not empty.
I was wondering how I can do this and where to embed this into my code. On top of my head, I thought of counting the results and having count > 0 or maybe something with the query in conjunction with ##rowcount > 0. What would you suggest?
Here is my code:
ALTER proc dbo.spBornBefore2000 as
set nocount on
DECLARE #sub VARCHAR(100),
#qry VARCHAR(max),
#msg VARCHAR(250),
#query NVARCHAR(max),
#tab char(1) = CHAR(9)
SELECT #sub = 'before 1990 -' + cast(getdate() as varchar(100))
SELECT #msg = N'blablabla.....'
SELECT #query = ' select id, name, dob, year(dob) as birth_year
from people
where year(dob) < 2000 '
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'USERS',
#recipients = 'abc#gmail.com',
#body = #msg,
#subject = #sub,
#query = #query,
#query_attachment_filename = 'before2000.csv',
#attach_query_result_as_file = 1,
#query_result_header = 1,
#query_result_width = 256 ,
#query_result_separator = #tab,
#query_result_no_padding =1;
You can do something like this:
EXEC(#query)
IF ##ROWCOUNT > 0
BEGIN
-- send email here
END
ALTER proc dbo.spBornBefore2000 as
set nocount on
DECLARE #sub VARCHAR(100),
#qry VARCHAR(max),
#msg VARCHAR(250),
#query NVARCHAR(max),
#tab char(1) = CHAR(9)
SELECT #sub = 'before 1990 -' + cast(getdate() as varchar(100))
SELECT #msg = N'blablabla.....'
SET #query = ' select id, name, dob, year(dob) as birth_year
from people
where year(dob) < 2000 '
IF EXISTS (select id, name, dob, year(dob) as birth_year
from people
where year(dob) < 2000)
begin
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'USERS',
#recipients = 'abc#gmail.com',
#body = #msg,
#subject = #sub,
#query = #query,
#query_attachment_filename = 'before2000.csv',
#attach_query_result_as_file = 1,
#query_result_header = 1,
#query_result_width = 256 ,
#query_result_separator = #tab,
#query_result_no_padding =1;
end
ELSE
begin
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'USERS',
#recipients = 'myself#gmail.com',
#body = 'No results returned'
end

using select in #recipients in sp_send_dbmail

I am using a sp_send_dbmail in a procedure. I execute it 4 times with different countries.
exec pr_drop_out_addresses #country='NO'
exec pr_drop_out_addresses #country='SE'
exec pr_drop_out_addresses #country='FI'
exec pr_drop_out_addresses #country='DK'
For each exec I would like to send the mail to set og receipients. They are different for each country. I try to solve it with a declare #recipients, but I get problems with the quotes. The code is like this. Any suggestions how to bypass the problem?
declare #country varchar (10)
set #country='SE'
declare #recipients nvarchar(500)='''' +select CASE when #country='NO' then 'xxxx#xxx' when #country='SE' then 'yyy#xxxx' END+'''';
declare #subject nvarchar(255) = 'Adresser fra ' + #country;
declare #query_attachment_filename nvarchar(255) = 'Adresser_for_'+#country +'_'+convert(varchar(10),getdate(),121) +'.csv';
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'VNPSQL email',
#recipients = #recipients,
#query = 'SELECT * FROM NSGstatistikk_dev.dbo.test',
#subject = #subject,
#attach_query_result_as_file=1,
#query_attachment_filename = #query_attachment_filename,
#query_result_separator = ';',
#query_result_no_padding = 1;
You are using incorrect syntax:
Use:
SELECT #recipients ='''' + CASE when #country='NO' then 'xxxx#xxx' when #country='SE' then 'yyy#xxxx' END+'''';
also, quotes are not required at all:
SELECT #recipients = CASE when #country='NO' then 'xxxx#xxx' when #country='SE' then 'yyy#xxxx' END;

Why is error 22051 from sp_send_dbmail not caught by a CATCH block?

So I have a sql stored proc:
CREATE PROC sp_SendConfirmedPurchasesEMail
(
#RecID INT
)
AS
...
msdb.dbo.sp_send_dbmail
#profile_name = #ProfileName,
#recipients = #MailRecipients,
#body = #MsgBody,
#subject = #MailSubject,
#body_format = #BodyFormat,
#importance = #MsgImportance,
#sensitivity = #MsgSensitivity,
#file_attachments = 'Some File That Doesnt Exist',
#query = #DBQuery,
#execute_query_database = #ExecuteQueryDatabase,
#attach_query_result_as_file = #AttachQueryResultAsFile,
#query_attachment_filename = #QueryAttachmentFilename,
#query_result_header = #QueryResultHeader,
#query_result_width = #QueryResultWidth,
#query_result_separator = #QueryResultSeparator,
#exclude_query_output = #ExcludeQueryOutput,
#append_query_error = #AppendQueryError,
#query_no_truncate = #QueryNoTruncate,
#copy_recipients = #CC,
#blind_copy_recipients = #BCC,
#reply_to = #ReplyTo,
#from_address = #FromAddress
END
I get an error when I run this in SSMS saying:
Msg 22051, Level 16, State 1, Line 0
Attachment file <MyFileGoesHere> is invalid.
What I can't figure out is why is it that if I put TRY/CATCH around the call to "sp_send_dbmail" I don't get the error in my catch?