We help IT Professionals succeed at work.

How to send an email to each unique value in a field

Medium Priority
295 Views
Last Modified: 2012-06-21
i'm running a query as a job in SQL Server 2005.  this query will send an html report to customers and show all of their pending orders.

i have a field for customer number (CustomerNo)
each customer only has one email address.
but the customer may have several orders and they should receive only 1 email with all orders on it.

how do i do the iteration?
USE [Database]
GO
IF (OBJECT_ID('#tmpEmailStatus') IS NOT NULL)
DROP TABLE #tmpEmailStatus
 
CREATE TABLE #tmpEmailStatus(
	SalesOrderNo char(7) NOT NULL,
	CustomerNo char(7) NULL,
	EmailAddress varchar(50) NOT NULL,
	PackageNo varchar(4) NULL,
	TrackingID varchar(30) NULL,
	ShipToCity varchar(20) NULL,
	ShipToState char(2) NULL,
	ShipVia varchar(15) NULL,
	ItemCode varchar(15) NULL,
	QuantityShipped smallint NULL,
	QuantityOrderedRevised smallint NULL,
	FreightAmt decimal(12,5) NULL,
	PromiseDate datetime NULL
)
INSERT INTO #tmpEmailStatus(
	SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
)
SELECT     SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
FROM         dbo.vEmailShippingStatus
GROUP BY SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
 
DECLARE @EmailRecipient VARCHAR(50);
SELECT @EmailRecipient = 'SELECT EmailAddress from dbo.vEmailShippingStatus';
 
DECLARE @tableHTML  NVARCHAR(MAX) ;
 
SET @tableHTML =
    N'<H3>Order Status</H3>' +
		N'<div><H5>Execution Date: <font color="blue">' + CONVERT(NVARCHAR(30), getdate(), 113) + ' PST' + '</font></H5></div>'+ 
    N'<table border="1">' +
    N'<tr><th>SalesOrder</th>' +
    N'<th>CustomerNo</th>' +
    N'<th>PackageNo</th>' +
    N'<th>TrackingID</th>' +
    N'<th>ShipToCity</th>' +
    N'<th>ShipToState</th>' +
    N'<th>ShipVia</th>' +
    N'<th>ItemCode</th>' +
    N'<th>QuantityShipped</th>' +
    N'<th>QuantityOrderedRevised</th></tr>' +
    CAST ( ( SELECT td = SalesOrderNo,       '',
                    td = CustomerNo,		 '',
					td = PackageNo,			 '',
					td = TrackingID,		 '',
					td = ShipToCity,		 '',
					td = ShipToState,		 '',
					td = ShipVia,			 '',
					td = ItemCode,			 '',
					td = QuantityShipped,	 '',
					td = QuantityOrderedRevised
              FROM #tmpEmailStatus
 
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;
 
drop table #tmpEmailStatus
 
EXEC msdb.dbo.sp_send_dbmail @recipients=@EmailRecipient,
    @subject = 'OverDue Sales Orders',
    @body = @tableHTML,
    @body_format = 'HTML',
@profile_name='Email';

Open in new window

Comment
Watch Question

CERTIFIED EXPERT
Top Expert 2010

Author

Commented:
ok, i have a partial solution.  

i created a view that has a list of unique customer number, email address and use a CURSOR to iterate through it.

the only thing missing is how to SELECT only the records where CustomerNo is equal to the current record that the cursor is pointing to.

do i need a second cursor to point to the customer number or can i select the customer number column from the current cursor?
USE [Database]
GO
 
DECLARE @EmailRecipient VARCHAR(50);
DECLARE db_cursor CURSOR FOR
SELECT EmailAddress from dbo.ViewOfUniqueCustomerNumberEmailAddress;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @EmailRecipient;
 
WHILE @@FETCH_STATUS=0
BEGIN
IF (OBJECT_ID('#tmpEmailStatus') IS NOT NULL)
DROP TABLE #tmpEmailStatus
 
CREATE TABLE #tmpEmailStatus(
	SalesOrderNo char(7) NOT NULL,
	CustomerNo char(7) NULL,
	EmailAddress varchar(50) NOT NULL,
	PackageNo varchar(4) NULL,
	TrackingID varchar(30) NULL,
	ShipToCity varchar(20) NULL,
	ShipToState char(2) NULL,
	ShipVia varchar(15) NULL,
	ItemCode varchar(15) NULL,
	QuantityShipped smallint NULL,
	QuantityOrderedRevised smallint NULL,
	FreightAmt decimal(12,5) NULL,
	PromiseDate datetime NULL
)
INSERT INTO #tmpEmailStatus(
	SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
)
SELECT     SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
FROM         dbo.vEmailShippingStatus
GROUP BY SalesOrderNo, CustomerNo, EmailAddress, PackageNo, TrackingID, ShipToCity, ShipToState,ShipVia,ItemCode,QuantityShipped,QuantityOrderedRevised,FreightAmt,PromiseDate
 
 
 
DECLARE @tableHTML  NVARCHAR(MAX) ;
 
SET @tableHTML =
    N'<H3>Order Status</H3>' +
		N'<div><H5>Execution Date: <font color="blue">' + CONVERT(NVARCHAR(30), getdate(), 113) + ' PST' + '</font></H5></div>'+ 
    N'<table border="1">' +
    N'<tr><th>SalesOrder</th>' +
    N'<th>CustomerNo</th>' +
    N'<th>PackageNo</th>' +
    N'<th>TrackingID</th>' +
    N'<th>ShipToCity</th>' +
    N'<th>ShipToState</th>' +
    N'<th>ShipVia</th>' +
    N'<th>ItemCode</th>' +
    N'<th>QuantityShipped</th>' +
    N'<th>QuantityOrderedRevised</th></tr>' +
    CAST ( ( SELECT td = SalesOrderNo,       '',
                    td = CustomerNo,		 '',
					td = PackageNo,			 '',
					td = TrackingID,		 '',
					td = ShipToCity,		 '',
					td = ShipToState,		 '',
					td = ShipVia,			 '',
					td = ItemCode,			 '',
					td = QuantityShipped,	 '',
					td = QuantityOrderedRevised
              FROM #tmpEmailStatus
 
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;
 
drop table #tmpEmailStatus
 
EXEC msdb.dbo.sp_send_dbmail @recipients=@EmailRecipient,
    @subject = 'OverDue Sales Orders',
    @body = @tableHTML,
    @body_format = 'HTML',
@profile_name='Email';
FETCH NEXT FROM db_cursor INTO @EmailRecipient;
END
 
CLOSE db_cursor;
DEALLOCATE db_cursor;

Open in new window

CERTIFIED EXPERT
Top Expert 2010
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.