7 Aralık 2009 Pazartesi

MSSQL Cursor Kullanımı

Cursor çekitiğimiz sorgu içerisinde satır satır dönerek işlemlerimizi yapmamızı sağlayan bir yapıdır.
Altaki örnek de kullanıcıların mail adresleri ile ilgili tabloya tek tek mail gönderilmesi sağlanmakta.
önce işlem yapacağımız veritabanını oluşturalım.
GO
CREATE TABLE EmailList
 (
id smallint identity(1,1),
email varchar(500),
name nvarchar(500),
emailsent bit default 0,
sentdate datetime
)

sonra veri girişi yapalım
INSERT INTO EmailList (email, name) VALUES ('emailaddress1@test.com', N'Darth Vader')
INSERT INTO EmailList (email, name) VALUES ('emailaddress2@test.com', N'Bill Gates')
INSERT INTO EmailList (email, name) VALUES ('emailaddress3@test.com', N'Katy Perry')

daha sonra procedure yazalım .
CREATE PROC SendEmailCursor


AS


-- eMail Variables --
DECLARE @email_subject nvarchar(1000)
DECLARE @email_body nvarchar(max)


SET @email_body = N'Welcome to our Community'
SET @email_body = N'Dear {0},
We''re glad to see you.'
-- eMail Variables (END) --


-- Cursor Variables --
DECLARE @Id smallint;
DECLARE @email varchar(500);
DECLARE @name nvarchar(500);
-- Cursor Variables (END) --


DECLARE @pbody nvarchar(max)


------------------ CURSOR eMail --------------------
DECLARE eMailCursor CURSOR FAST_FORWARD FOR
SELECT
id, email, name
FROM EmailList
WHERE emailsent = 0


OPEN eMailCursor


FETCH NEXT FROM eMailCursor INTO @Id, @email, @name


WHILE @@FETCH_STATUS = 0
BEGIN
---
SET @pbody = REPLACE(@email_body, '{0}', @name)


EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'TBS',
@recipients = @email,
@subject = @email_subject,
@body = @pbody,
@body_format = 'HTML'


UPDATE EmailList SET emailsent = 1, sentdate = GetDate() WHERE id = @Id
---
FETCH NEXT FROM eMailCursor INTO @Id, @email, @name
END


CLOSE eMailCursor
DEALLOCATE eMailCursor
------------------ CURSOR eMail (END) --------------------


GO


ve çalıştıralım

EXEC SendEmailCursor


Cursor ile ilgili bilgi;
FETCH FIRST komutu ile ilk satıra dönüp FETCH LAST komutu ile de son satıra gidebiliriz. SQL SERVER en son işletilen FETCH komutunun durumunu @@FETCH_STATUS degişkeninde tutar. FETCH komutu başarılı ise 0, başarısız ise -1, FETCH edilen satır bulanmıyorsa da -2 döner.

Hiç yorum yok:

Yorum Gönder