Üstelik bu prosedür; sistem nesnesi olarak tanımlandığı için
parametrede verilen select scriptiniz başka bir veritabanını sorguluyor olsa
bile her veritabanından sadece adı ile direk erişebilirsiniz.
Declare @CR
Cursor
Exec StrToCursor
' Select Name
From SysObjects Where Xtype = ''u''
',@CR
Output
İşte bu kadar. Cursorumuz hazır. Artık Fetch Next metoduyla ilk satıra konumlanabiliriz.
Prosedürün yaptığı işlem; stringden dönen cursoru output
ederek bizim kullanımımıza sunmak. Tabi bu arada prosedür cursoru Open
ederek gönderiyor. Yani bizim tekrar cursoru açmamıza gerek kalmıyor. Yapmamız
gereken sadece Fetch
Next metoduyla ilk satıra
konumlanıp değişkenlerimize ilk değerlerimizi almak ve while döngüsüne girmektir. Bu
sayede hem tam parametrik hemde hızlı ve sade bir şekilde cursor elde etmiş
olduk.
Bu kadar açıklamadan sonra şimdide bir örnek yapalım.
Aşagıdaki örnekte Prosedürümüz master veritabanında kayıtlı.
Sorgu TIGER veritabanını kullanıyor. Ve biz MSDB veritabanından bu prosedüre
direk erişip cursorumuzu açabiliyoruz.
Use MSDB
declare @cursor cursor
exec StrToCursor 'Select
Name From TIGER..SysObjects Where Xtype
= ''u'' ',@cursor output
----- Cursorumuz Burada
Kullanıma Hazır…
declare @s varchar(100)
fetch next from @cursor into @s
while @@fetch_status = 0
begin
print @s
fetch next from @cursor into @s
end
close @cursor
deallocate @cursor
bu örnekte sysobject tablosu içinde bulunan tablolarımızın
isimlerini StrToCursor prosedürümüzle ekrana print ediyoruz.
StrToCursor Prosedürünün Create Scripti
Use Master
go
Sp_Ms_Upd_SysObj_Category 1
go
IF EXISTS (SELECT name FROM
sysobjects WHERE name = 'StrToCursor' AND type = 'P')
DROP PROCEDURE StrToCursor
GO
CREATE PROCEDURE
StrToCursor( @SqlStr NVarchar(4000),@OutCursor CURSOR VARYING OUTPUT )
AS
BEGIN
set nocount on
Declare @Cursor cursor
set @SqlStr =
' SET @Cursor = CURSOR FOR
'+@SqlStr+' OPEN @Cursor '
EXEC master..sp_executesql
@SqlStr, N' @Cursor CURSOR OUTPUT ', @Cursor OUTPUT
SET @OutCursor = @Cursor
select
CURSOR_STATUS('variable','@Cursor') ,
case CURSOR_STATUS('variable','@Cursor')
when 1 then 'Cursor Kullanıma Hazır'
when 0 then 'Cursor Boş'
when -1 then 'Cursor
Kapalı'
when -2 then 'Cursor
Kulanım dışı'
when -3 then 'Cursor
Tanımlanmamış'
end
set nocount off
END
GO
Sp_Ms_Upd_SysObj_Category 2
Select
Case
When
isnull(object_id('StrToCursor'),0) = 0
then 'Prosedür Oluşturulamadı'
When
objectproperty(object_id('StrToCursor'),'IsMSShipped') = 1 then
'Prosedür Sistem Objesi
Olarak Oluşturuldu. Herveritabanından Direk Erişebilirsiniz'
When
objectproperty(object_id('StrToCursor'),'IsMSShipped') = 0 then
'Prosedür Sistem Objesi
Olarak Oluşturulamadı. Yetkilerinizi Kontrol Edin'
End
Sonuç
Sonuç olarak şunu söyleyebilrim. Sql serverlar zaten cursor oluşturular. Bizim
buradaki amacımız tam parametrik , özel isteklere uyarlanabilen ve kullanımı
kolay olan bir yöntemle cursor oluşturmak , programcının üzerindeki iş yükünü
ve kod karmaşası azaltmak olarak özetlenebilir. Bunlar benim kendim için
hazırlayıp kullandığım araçlarımdır. Sizlerle paylaşmak istedim. Tüm olumlu
veya olumsuz eleştirilere açığım. İsterseniz prosedürü daha da
geliştirebilirsiniz. Örneğin parametrede cursor tipi belirtip ona göre içerde
farklı tipte cursorlar oluşturabilirisiniz.