Question

SQL Stored Procedure Loop for Job

Asked by: sri-admin

Hi.  I am currently struggling with a SQL Procedure where I am attempting to send an email by a SQL Job if database Criteria is met.  Currently, I have the following test syntax, which works fine.

DECLARE @AdditionalFilter BIT
DECLARE @MyDate As smalldatetime
SET @AdditionalFilter = 1
SET @MyDate = convert(varchar(10), ('07/02/2009'))
IF @AdditionalFilter = 1 AND convert(varchar(10), (getdate()), 101) = @MyDate
BEGIN
DECLARE @msg varchar(500)
SET @msg = 'To confirm that you are getting an email on a particular date time "' + '.'
EXEC msdb.dbo.sp_send_dbmail @recipients=N'ME@somewhere.com', @body= @msg,  @subject = 'SQL Server Trigger Mail', @profile_name = 'Profile Name'
SET @AdditionalFilter = 0
PRINT 'Message Sent!'
END
ELSE
BEGIN
PRINT 'No Message Sent'
END

This simply sends a message to one recipient if the date is found to be today.  Simple enough, I will just put this into a SQL Job and be good.  

Problem comes in that I want to insert another criteria so that if in the following SQL Statement:

SELECT Field1, Field2, Field3 from Table1 where Complete = N'No';

All values in the table that are found to have 'No' for their value (It is an nvarchar(4) field, not boolean), will be sent an email via that same job.  So basically I'm asking for a Loop, but I understand that a SQL "Loop" may not be quite what I'm looking for.  I've searched all around and found close to what I'm looking for but not quite enough to get me going.  

I guess I'm looking for possibly a CURSOR statement, or simply something that takes the original procedure and adds values of Field1, Field2, Field3 to the email from records contained in 'Table1' where Complete = 'No'.  If I'm going about anything wrong I apologize, this is still somewhat new to me.

Thank you for any assistance.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-07-02 at 16:58:22ID24541295
Tags

SQL

,

SQL Server 2005

,

Stored Procedure

,

SQL Job

,

SQL Select Statement

Topics

SQL Query Syntax

,

Databases Miscellaneous

,

SQL Server 2005

Participating Experts
6
Points
500
Comments
20

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. convert datetime to varchar
    Hi Experts, How can we convert a variable @presentdate to varchar? Declare @presentday as datetime select @PresentDay = convert( datetime, convert( varchar(10), getdate(), 101 )) select * from table where date1 = @presentday <---------here Thanks.

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: danrosenthalPosted on 2009-07-02 at 17:40:29ID: 24769079

If I understand correctly, it sounds like a cursor would do it for you.

The comments in this question should point you in the right direction:
http://www.experts-exchange.com/Programming/Languages/SQL_Syntax/Q_23815322.html

If you have specific questions, let me know.

 

by: appariPosted on 2009-07-02 at 17:41:28ID: 24769082

try changing your call to sp_send_dbmail as follows to include the @query parameter,

EXEC msdb.dbo.sp_send_dbmail @recipients=N'ME@somewhere.com', @body= @msg,  @query = 'SELECT Field1, Field2, Field3 from Table1 where Complete = N''No''' ,@subject = 'SQL Server Trigger Mail', @profile_name = 'Profile Name'

 

by: ralmadaPosted on 2009-07-02 at 17:42:36ID: 24769089

in SQL 2005, You can also do something like this:

DECLARE @tableHTML  NVARCHAR(8000);
DECLARE @AdditionalFilter BIT 
DECLARE @MyDate As smalldatetime
SET @AdditionalFilter = 1
SET @MyDate = convert(varchar(10), ('07/02/2009'))
IF @AdditionalFilter = 1 AND convert(varchar(10), (getdate()), 101) = @MyDate
BEGIN
	DECLARE @msg varchar(500)
 
	SET @tableHTML = N'To confirm that you are getting an email on a particular date time "' + '. <br/><br/>' +
			N'<table border="1">' + 
			N'<tr><th>field 1</th><th>field 2</th><th>field 3</th>' +
			CAST ( ( SELECT td = UserName,       '',
	        			td = sum(case when Review_status = 'Assigned' then 1 else 0 end), '',
	                    		td = sum(case when Review_Status = 'Complete' then 1 else 0 end), ''
        	      		FROM SCH_A
				WHERE Complete = N'No'
	              		FOR XML PATH('tr'), TYPE 
    				) AS NVARCHAR(MAX) ) +
	    		N'</table>'
 
 
	EXEC msdb.dbo.sp_send_dbmail @recipients='yourmailrecipient@email.com',
			@subject = 'SQL Server Trigger Mail', 
			@profile_name = 'Profile Name',
			@body = @tableHTML,
		        @body_format = 'HTML' ;
 
 
	SET @AdditionalFilter = 0
	PRINT 'Message Sent!'
END
ELSE
BEGIN
	PRINT 'No Message Sent'
END

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

Select allOpen in new window

 

by: appariPosted on 2009-07-02 at 17:44:56ID: 24769096

wait, do you want to send one email for each record or all the records together?
if you want to send multiple mails you have to use cursor if one mail is enough you can use @query parameter as in my previous post.

 

by: ralmadaPosted on 2009-07-02 at 17:53:32ID: 24769121

 

by: BanthorPosted on 2009-07-02 at 18:12:55ID: 24769178

If you really don't want to use a Cursor you can create Function that sends the Mail
then Call the Function as column of the select,

While not getting to detailed here;

Select
  dbo.SendThatMail([Recip],'CompiledMEssage')
From
 Notices where Criteria is Met

 

by: acperkinsPosted on 2009-07-02 at 18:17:44ID: 24769188

>> If you really don't want to use a Cursor you can create Function that sends the Mail then Call the Function as column of the select,<<
You may want to double check that.  I suspect you will get the following error:
"Only functions and extended stored procedures can be executed from within a function."

 

by: folderolPosted on 2009-07-02 at 18:25:29ID: 24769212

Here is a loop that will send an email for every row that matches Complete = 'No'

It does not use the cool html stuff that ralmada posted, you could combine the two without much effort.

The key advantage in temp tables is if the number of rows that match the Where is significantly less than the total rows, the performance overhead in using one is not an issue.  You can index the temp table as I do in the snippet, which helps.  The temp table persists for the connection, when the connection ends then the index drops when the table drops.

You can add
@attach_query_result_as_file = 1

to the sp_send_dbmail command to put the query resultset into an attachment, otherwise it appears below the @body text, if any.

declare @nextid int
declare @lastid int
declare @selectcmd nvarchar(255)
CREATE TABLE #tmploop(
	id int identity(1,1) not null,
	key1 nvarchar(100) null,
	key2 nvarchar(100) null
	)
CREATE INDEX[IX_loop_id] ON [#tmploop]([id]) ON [PRIMARY]
 
insert into #tmploop(key1, key2)
select Field1, Field2 from Table1 where Complete = N'No'
 
select @lastid = max(id) from #tmploop
set @nextid = 1
 
while @nextid <= @lastid
BEGIN
  set @selectcmd = 'select field1, field2, field3 from #tmploop join table1 on key1=field1 and key2=field2 where #tmploop.id = ' + cast(@nextid as varchar)
  set @nextid = @nextid + 1
  EXEC msdb.dbo.sp_send_dbmail @recipients=N'ME@somewhere.com', @body= @msg,  @query = @selectcmd ,@subject = 'SQL Server Trigger Mail', @profile_name = 'Profile Name'
END
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

Select allOpen in new window

 

by: sri-adminPosted on 2009-07-02 at 18:31:54ID: 24769234

First off, thanks for all of the feedback, I know now why I use this site!!

Many answers are close, but no cigar.  
From the top...

danrosenthal:  Maybe in there somewhere, but I'm very sorry, I should warn you I'm a bit of an amateur...  It definitely looks like it will be a cursor though, so you're on the right track for sure...

appari:  for some reason, the most basic email sent with the @query parameter doesnt seem to work for me.  But to answer your question, i would need separte emails for each record, sorry for not explaining better.  So, yes, it would need to be a Cursor I think...

ralmada:
Thanks for the tips, in the first one, it looks close, but as I forgot to mention, it would be each record being sent individually in the email.  The link looks good, it looks like this may be the path, but I'll keep it open to see if anyone else has any more specific ideas.

ONE MORE THING TO ALL...

I also forgot to mention that in this same table/View, it contains one email for each record.  So for each record, the email address it is being sent to is in the same record as the Field1, Field2, Field3 columns.  Not sure it that makes it easier or harder, but in case this helps im passing it along...

Again, thanks to everyone so far...

 

by: sri-adminPosted on 2009-07-02 at 18:41:30ID: 24769265

folderol:

I like it so far, where would I put the @msg declaration and where would I set that at?

acperkins:

You were right I got an error...

 

by: BanthorPosted on 2009-07-02 at 19:04:29ID: 24769327

So all of the above will work.
Do you want one of these guys to write the Cursor for you?

acperkins :
I currently use this function method writing files but the fso File write method is also a function in SQL 2005

 

 

by: folderolPosted on 2009-07-02 at 19:17:27ID: 24769367

Something like this.  

I'm assuming the email address is within the table1, so I'm changing it for every email.

declare @nextid int
declare @lastid int
declare @selectcmd nvarchar(255)
declare @sentto nvarchar(100)
DECLARE @msg varchar(500)
SET @msg = 'To confirm that you are getting an email on a particular date time "' + '.'
 
CREATE TABLE #tmploop(
	id int identity(1,1) not null,
	key1 nvarchar(100) null,
	key2 nvarchar(100) null,
         recipient nvarchar(100) null
	)
CREATE INDEX[IX_loop_id] ON [#tmploop]([id]) ON [PRIMARY]
 
insert into #tmploop(key1, key2, recipient)
select Field1, Field2, email_address_field from Table1 where Complete = N'No'
 
select @lastid = max(id) from #tmploop
set @nextid = 1
 
while @nextid <= @lastid
BEGIN
  set @selectcmd = 'select field1, field2, field3 from #tmploop join table1 on key1=field1 and key2=field2 where #tmploop.id = ' + cast(@nextid as varchar)
  select @sentto = #tmploop.recipient from #tmploop where #tmploop.id = @nextid
  set @nextid = @nextid + 1
  EXEC msdb.dbo.sp_send_dbmail @recipients=@sentto, @body= @msg,  @query = @selectcmd ,@subject = 'SQL Server Trigger Mail', @profile_name = 'Profile Name'
END

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

Select allOpen in new window

 

by: sri-adminPosted on 2009-07-02 at 19:39:16ID: 24769442

folderol:
It looks like that will probably do it, sorry, I will try to test tomorrow am and let you know first thing.

Banthor:

If they were so inclined :).
Seriously, I know im asking for quite a bit here, but I just want to have a basic setup so that I can use this for many processes that could be substantially improved.  Im just starting to explore all of the possibilities that sql offers, and im pretty amazed at this point.  

I appreciate all of the help, and if folderol's solution works, i'll award points tomorrow.

 

by: sri-adminPosted on 2009-07-02 at 20:20:09ID: 24769586

OK, running into a dilemma, not sure where to go with this one.  If I use the @query parameter, no matter the sql statement, it gives an error msg stating that it cannot find user "My Username".   I tried @attach_query_result_as_file = 1 with the same result.  This only happens if I use the @query parameter, so Im sorry, but apparently Im still puzzled here.  I'll continue to work with what I have so far, and if anyone has any further input Im all ears.

 

by: folderolPosted on 2009-07-02 at 20:29:47ID: 24769613

i would need to see your code in more detail, but the query parameter does not support any passing of parameters to it or references to columns from the connection which calls it because it runs as a new session.  That's why my snippet uses the syntax CAST(@nextid as varchar).

I tested and that worked ok for me.

 

by: sri-adminPosted on 2009-07-03 at 07:33:26ID: 24772607

OK, narrowed it mostly down now.

Can include a query, as I wasn't including the full path to the database, so it wasnt finding the table ([database].[schema].[tablename]).  Sorry, thats my bad, never had to do that on this server before.

However, it hangs if I attempt to use the following statement, with tablenames changed of course...

set @selectcmd = 'select field1, field2, field3 from #tmploop join Alerts.dbo.table1 on key1=field1 and key2=field2 where #tmploop.id = ' + cast(@nextid as varchar)
select @sentto = #tmploop.recipient from #tmploop where #tmploop.id = @nextid


Thoughts??




set @selectcmd = 'select field1, field2, field3 from #tmploop join Alerts.dbo.table1 on key1=field1 and key2=field2 where #tmploop.id = ' + cast(@nextid as varchar)
select @sentto = #tmploop.recipient from #tmploop where #tmploop.id = @nextid

                                              
1:
2:

Select allOpen in new window

 

by: sri-adminPosted on 2009-07-03 at 10:23:33ID: 31599423

The effort displayed in trying to help me, a newbie, was excellent.  Gave me all the ideas I needed to solve what should be a simple issue.  Thanks.

 

by: sri-adminPosted on 2009-07-03 at 10:28:15ID: 24773582

OK, the solution, it looks like, was semi-simple, but all I could figure was to use a Cursor and set it up like this:

DECLARE @Field1 nvarchar(70)
DECLARE @Field2 nvarchar(50)
DECLARE @Email nvarchar(250)
DECLARE cursorName CURSOR for
Select Field3, Field2, Email from Alerts.dbo.Table1 where Complete = N'No'
OPEN cursorName
FETCH NEXT FROM cursorName
 INTO @Field1, @Field2, @Email
 While @@FETCH_STATUS = 0
 Begin
  EXEC msdb.dbo.sp_send_dbmail
@recipients=@Email,
@body= @Field1,  
@subject = @Field2,
@profile_name = 'MY PROFILE'
  FETCH NEXT FROM cursorName
  INTO @Field1, @Field2, @Email
 End

folderol:  You spent much time and effort in helping me, and for that I'm giving you 200 points.  I think you were probably dead on, but a little advanced for what I was looking for.

danrosenthal:  You gave the best link for a Cursor example, so thank you.

Thank you to everyone, very well supported!

 

by: danrosenthalPosted on 2009-07-03 at 12:58:29ID: 24774150

Your code looks perfect. Great work!

 

by: acperkinsPosted on 2009-07-05 at 21:54:40ID: 24782605

Banthor,
>>I currently use this function method writing files but the fso File write method is also a function in SQL 2005 <<
I have no idea what you just said.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...