Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
kaydırma davranışı ve imlecin üzerinde çalıştığı sonuç kümesini oluşturmak için kullanılan sorgu gibi Transact-SQL sunucu imlecinin özniteliklerini tanımlar.
DECLARE CURSOR hem ISO standardına dayalı bir söz dizimi hem de Transact-SQL uzantı kümesi kullanan bir söz dizimi kabul eder.
Transact-SQL söz dizimi kuralları
Syntax
ISO sözdizimi:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ_ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
[ ; ]
genişletilmiş söz dizimi Transact-SQL:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ , ...n ] ] ]
[ ; ]
Arguments
cursor_name
Tanımlanan Transact-SQL sunucu imlecinin adı. cursor_name , tanımlayıcıların kurallarına uymalıdır.
DUYARSIZ
İmleç tarafından kullanılacak verilerin geçici bir kopyasını oluşturan bir imleç tanımlar. İmleçteki tüm istekler içindeki tempdbbu geçici tablodan yanıtlandırılır. Bu nedenle, temel tablo değişiklikleri bu imleçte yapılan getirmeler tarafından döndürülen verilere yansıtılır ve bu imleç değişikliklere izin vermez. ISO söz dizimi kullanıldığında, INSENSITIVE atlanırsa, kaydedilmiş silmeler ve temel tablolarda (herhangi bir kullanıcı tarafından) yapılan güncelleştirmeler sonraki getirme işlemlerine yansıtılır.
TOMAR
Tüm getirme seçeneklerinin (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) kullanılabilir olduğunu belirtir. ISO SCROLLDECLARE CURSOR içinde belirtilmezseNEXT, desteklenen tek getirme seçeneğidir.
SCROLL da belirtilirse FAST_FORWARD belirtilemiyor. Belirtilmezse SCROLL , yalnızca getirme seçeneği NEXT kullanılabilir ve imleç olur FORWARD_ONLY.
select_statement
İmlecin sonuç kümesini tanımlayan standart SELECT bir deyim. ve anahtar sözcüklerineFOR BROWSEINTO, bir imleç bildiriminin select_statement içinde izin verilmez.
SQL Server, select_statement içindeki yan tümceler istenen imleç türünün işlevselliğiyle çakışırsa imleci örtük olarak başka bir türe dönüştürür.
READ_ONLY
Bu imleç aracılığıyla yapılan güncelleştirmeleri engeller. İmlece bir veya WHERE CURRENT OF deyimindeki yan UPDATEDELETE tümcesinde başvurulamazsınız. Bu seçenek, bir imlecin güncelleştirilecek varsayılan özelliğini geçersiz kılar.
UPDATE [ OF column_name [ ,... n ] ]
İmleç içindeki güncelleştirilebilir sütunları tanımlar. Belirtilirse OF <column_name> [, <... n> ] , yalnızca listelenen sütunlar değişikliklere izin verir. Sütun listesi olmadan belirtilirse UPDATE , tüm sütunlar güncelleştirilebilir.
cursor_name
Tanımlanan Transact-SQL sunucu imlecinin adı. cursor_name , tanımlayıcıların kurallarına uymalıdır.
LOCAL
İmlecin kapsamının, imlecin oluşturulduğu toplu iş, saklı yordam veya tetikleyici için yerel olduğunu belirtir. İmleç adı yalnızca bu kapsamda geçerlidir. toplu iş, saklı yordam veya tetikleyici veya saklı yordam parametresindeki yerel imleç değişkenleri tarafından imleç OUTPUT başvurusu yapılabilir. Yerel OUTPUT imleci çağıran toplu işleme, saklı yordama veya tetikleyiciye geri geçirmek için bir parametre kullanılır. Bu parametre, saklı yordam sonlandırıldıktan sonra imleç değişkenine başvurmak üzere bir imleç değişkenine atanabilir. İmleç bir OUTPUT parametrede geri geçirilmediği sürece toplu iş, saklı yordam veya tetikleyici sonlandırıldığında örtük olarak serbest bırakılır. Bir OUTPUT parametreye geri geçerse, başvuruda bulunan son değişken serbest bırakıldığında veya kapsamın dışına çıktığında imleç serbest bırakılır.
GLOBAL
İmlecin kapsamının bağlantı için genel olduğunu belirtir. İmleç adına, bağlantı tarafından yürütülen herhangi bir saklı yordamda veya toplu işlemde başvurulabilir. İmleç yalnızca bağlantı kesildiğinde örtük olarak serbest bırakılır.
Note
Veya belirtilmezse, varsayılan, GLOBAL veritabanı seçeneğinin ayarı tarafından denetlenebilir.LOCAL
FORWARD_ONLY
İmlecin yalnızca ileri taşınabileceğini ve ilk satırdan son satıra kaydırılabildiğini belirtir.
FETCH NEXT desteklenen tek getirme seçeneğidir. Geçerli kullanıcı tarafından yapılan (veya diğer kullanıcılar tarafından işlenen) sonuç kümesindeki satırları etkileyen tüm ekleme, güncelleştirme ve silme deyimleri, satırlar getirildiğinde görünür. Ancak, imleç geriye doğru kaydırılamadığından, satır getirildikten sonra veritabanındaki satırlarda yapılan değişiklikler imleç üzerinden görünmez. Yalnızca ileri imleçler varsayılan olarak dinamiktir, yani geçerli satır işlenirken tüm değişiklikler algılanır. Bu, daha hızlı imleç açma sağlar ve sonuç kümesinin temel tablolarda yapılan güncelleştirmeleri görüntülemesini sağlar. Yalnızca ileri imleçler geriye doğru kaydırmayı desteklemese de, uygulamalar imleci kapatıp yeniden açarak sonuç kümesinin başına dönebilir.
, FORWARD_ONLYveya STATIC anahtar sözcükleri olmadan KEYSETbelirtilirseDYNAMIC, imleç dinamik imleç olarak çalışır.
FORWARD_ONLY veya belirtilmediğindeSCROLL, FORWARD_ONLY , STATICveya KEYSET anahtar sözcükleri DYNAMICbelirtilmediği sürece varsayılan değerdir.
STATIC, KEYSETve DYNAMIC imleçleri varsayılan olarak SCROLL. ODBC ve ADO gibi veritabanı API'lerinden farklı olarak , FORWARD_ONLYSTATICve KEYSET Transact-SQL imleçlerle desteklenirDYNAMIC.
STATIC
İmlecin her zaman sonuç kümesini imleç ilk açıldığında olduğu gibi görüntüleyip imleç tarafından kullanılacak verilerin geçici bir kopyasını oluşturduğunu belirtir. İmleçteki tüm istekler içindeki tempdbbu geçici tablodan yanıtlandırılır. Bu nedenle, temel tablolarda yapılan eklemeler, güncelleştirmeler ve silmeler, bu imleçte yapılan getirmeler tarafından döndürülen verilere yansıtılır ve bu imleç, imleç açıldıktan sonra sonuç kümesinin üyelik, sıra veya değerlerinde yapılan değişiklikleri algılamaz. Statik imleçler kendi güncelleştirmelerini, silmelerini ve eklemelerini algılayabilir, ancak bunu yapması gerekmez.
Örneğin, statik bir imlecin bir satır getirdiğini ve başka bir uygulamanın bu satırı güncelleştirdiğini varsayalım. Uygulama statik imleçten satırı yeniden eşlerse, diğer uygulama tarafından yapılan değişikliklere rağmen gördüğü değerler değişmez. Tüm kaydırma türleri desteklenir.
KEYSET
İmleç açıldığında, imleçteki satırların üyeliğinin ve sırasının sabit olduğunu belirtir. Satırları benzersiz olarak tanımlayan anahtar kümesi, tempdb olarak bilinen bir tabloda yerleşiktir. Bu imleç, statik ve dinamik imleç arasındaki işlevlerin değişiklik algılamasını sağlar. Statik bir imleç gibi, her zaman sonuç kümesinin üyeliğinde ve sıralamasında yapılan değişiklikleri algılamaz. Dinamik imleç gibi, sonuç kümesindeki satırların değerlerinde yapılan değişiklikleri algılar.
Anahtar kümesi temelli imleçler, anahtar kümesi olarak bilinen benzersiz tanımlayıcılar (anahtarlar) kümesi tarafından denetlenmektedir. Anahtarlar, sonuç kümesindeki satırları benzersiz olarak tanımlayan bir sütun kümesinden oluşturulur. Anahtar kümesi, sorgu deyimi tarafından döndürülen tüm satırlardan anahtar değerleri kümesidir. Anahtar kümesi temelli imleçlerle, imleçteki her satır için bir anahtar oluşturulur ve kaydedilir ve istemci iş istasyonunda veya sunucuda depolanır. Her satıra eriştiğiniz zaman, depolanan anahtar geçerli veri değerlerini veri kaynağından getirmek için kullanılır. Anahtar kümesi temelli imleçte, anahtar kümesi tam olarak doldurulduğunda sonuç kümesi üyeliği dondurulur. Bundan sonra üyeliği etkileyen eklemeler veya güncelleştirmeler, yeniden açılana kadar sonuç kümesinin bir parçası olmaz.
Kullanıcı sonuç kümesinde gezindikçe veri değerlerinde (anahtar kümesi sahibi veya diğer işlemler tarafından yapılan) değişiklikler görünür:
Bir satır silinirse, satır getirilmeye çalışılırsa, silinen satır sonuç kümesinde boşluk olarak göründüğünden değerini döndürür
@@FETCH_STATUS-2. Satırın anahtarı anahtar kümesinde var, ancak satır artık sonuç kümesinde yok.İmlecin dışına yapılan ekler (diğer işlemler tarafından) yalnızca imleç kapatılıp yeniden açıldığında görünür. İmlecin içinden yapılan ekler sonuç kümesinin sonunda görünür.
İmleç dışından anahtar değerlerinin güncelleştirmeleri, eski satırın silinmesine ve ardından yeni satırın eklenmesine benzer. Yeni değerleri içeren satır görünmez ve eski değerleri içeren satırı getirmeye çalışır ve değerini döndürür
@@FETCH_STATUS-2. Güncelleştirme, yan tümcesi belirtilerekWHERE CURRENT OFimleç üzerinden yapılırsa yeni değerler görünür.
Note
Sorgu benzersiz dizini olmayan en az bir tabloya başvuruda bulunursa, anahtar kümesi imleci statik imleç olarak dönüştürülür.
DYNAMIC
İmleç etrafında gezindiğinizde ve değişikliklerin imlecin içinden mi yoksa imlecin dışındaki diğer kullanıcılar tarafından mı yapıldığına bakılmaksızın, sonuç kümesindeki satırlarda yapılan tüm veri değişikliklerini yansıtan bir imleç tanımlar. Bu nedenle, tüm kullanıcılar tarafından yapılan tüm insert, update ve delete deyimleri imleç üzerinden görünür. Satırların veri değerleri, sırası ve üyeliği her getirmede değişebilir. Getirme ABSOLUTE seçeneği dinamik imleçlerle desteklenmez. İmleç dışında yapılan güncelleştirmeler işlenmeden görünür olmaz (imleç işlem yalıtım düzeyi olarak ayarlanmadığı UNCOMMITTEDsürece).
Örneğin, dinamik bir imleç iki satır getirir ve başka bir uygulama bu satırlardan birini güncelleştirir ve diğerini siler. Dinamik imleç bu satırları getirirse, silinen satırı bulmaz, ancak güncelleştirilmiş satır için yeni değerleri görüntüler.
FAST_FORWARD
Performans iyileştirmeleri etkinleştirilmiş bir FORWARD_ONLYimleç READ_ONLY belirtir.
FAST_FORWARDveya SCROLL belirtildiyse FOR_UPDATE belirtilemiyor. Bu tür bir imleç, imlecin içinden veri değişikliklerine izin vermez.
Note
Hem hem FAST_FORWARD de FORWARD_ONLY aynı DECLARE CURSOR deyimde kullanılabilir.
READ_ONLY
Bu imleç aracılığıyla yapılan güncelleştirmeleri engeller. İmlece bir veya WHERE CURRENT OF deyimindeki yan UPDATEDELETE tümcesinde başvurulamazsınız. Bu seçenek, bir imlecin güncelleştirilecek varsayılan özelliğini geçersiz kılar.
SCROLL_LOCKS
İmleç üzerinden yapılan konumlandırılmış güncelleştirmelerin veya silmelerin başarılı olması garanti edilir. SQL Server, satırlar okundukça imleçte kilitlenir ve daha sonraki değişiklikler için kullanılabilirliklerini güvence altına alır.
SCROLL_LOCKSveya FAST_FORWARD belirtildiyse STATIC belirtilemiyor.
IYİMSER
Satır, imleçte okunduktan sonra güncelleştirildiyse, imleç üzerinden yapılan konumlandırılmış güncelleştirmelerin veya silmelerin başarılı olmadığını belirtir. SQL Server, satırları imleçte okundukça kilitlemez. Bunun yerine , zaman damgası sütun değerlerinin karşılaştırmalarını veya tablonun zaman damgası sütunu yoksa bir sağlama toplamı değerini kullanarak satırın imleçte okunduktan sonra değiştirilip değiştirilmediğini belirler.
Satır değiştirildiyse, konumlandırılan güncelleştirme veya silme girişimi başarısız olur.
OPTIMISTIC da belirtilirse FAST_FORWARD belirtilemiyor.
İmleç bağımsız değişkeniyle STATIC birlikte belirtilirseOPTIMISTIC, ikisinin birleşimi örtük olarak ve STATIC bağımsız değişkenlerinin veya ve READ_ONLYSTATIC bağımsız değişkenlerinin birleşiminin eşdeğerine FORWARD_ONLY dönüştürülür.
TYPE_WARNING
İmleç örtük olarak istenen türden başka bir türe dönüştürüldüğünde istemciye bir uyarı iletisi gönderileceğini belirtir.
ve imleç bağımsız değişkenleri bileşimi OPTIMISTIC kullanıldığında ve STATIC imleç örtük olarak veya STATIC READ_ONLYSTATIC FORWARD_ONLY imlecin eşdeğerine dönüştürüldüğünde istemciye uyarı gönderilmez. 'a READ_ONLY dönüştürme, istemcilerin perspektifinden bir FAST_FORWARD ve READ_ONLY imlecine dönüşür.
select_statement
İmlecin sonuç kümesini tanımlayan standart SELECT bir deyim. imleç bildiriminin COMPUTE içinde , COMPUTE BY, FOR BROWSEve INTO anahtar sözcüklerine izin verilmez.
Note
İmleç bildirimi içinde sorgu ipucu kullanabilirsiniz. Ancak yan tümcesini FOR UPDATE OF de kullanıyorsanız, sonrasını OPTION (<query_hint>)belirtinFOR UPDATE OF.
SQL Server, select_statement içindeki yan tümceler istenen imleç türünün işlevselliğiyle çakışırsa imleci örtük olarak başka bir türe dönüştürür.
GÜNCELLEŞTIRME IÇIN [ OF column_name [ ,... n ] ]
İmleç içindeki güncelleştirilebilir sütunları tanımlar. Sağlanırsa OF <column_name> [, <... n>] , yalnızca listelenen sütunlar değişikliklere izin verir. Sütun listesi olmadan belirtilirse UPDATE , eşzamanlılık seçeneği belirtilmediği sürece READ_ONLY tüm sütunlar güncelleştirilebilir.
Remarks
DECLARE CURSOR Transact-SQL sunucu imlecinin kaydırma davranışı ve imlecin üzerinde çalıştığı sonuç kümesini oluşturmak için kullanılan sorgu gibi özniteliklerini tanımlar. deyimi OPEN sonuç kümesini doldurur ve FETCH sonuç kümesinden bir satır döndürür. deyimi, CLOSE imleçle ilişkili geçerli sonuç kümesini serbest bırakır. deyimi, DEALLOCATE imleç tarafından kullanılan kaynakları serbest bırakır.
deyiminin DECLARE CURSOR ilk biçimi, imleç davranışlarını bildirmek için ISO söz dizimini kullanır. İkinci biçimi, ODBC veya ADO'nun DECLARE CURSOR veritabanı API imleç işlevlerinde kullanılan imleç türlerini kullanarak imleçleri tanımlamanızı sağlayan Transact-SQL uzantıları kullanır.
İki formu karıştıramazsınız. veya SCROLL anahtar sözcüklerini anahtar sözcüğünden INSENSITIVECURSOR önce belirtirseniz ve CURSOR anahtar sözcükleri arasında FOR <select_statement> anahtar sözcük kullanamazsınız. ve anahtar sözcükleri arasında CURSOR herhangi bir anahtar sözcük belirtirseniz, anahtar sözcüğü belirtemez veya FOR <select_statement> önce belirtemezsiniz SCROLLINSENSITIVE.CURSOR
DECLARE CURSOR bir using Transact-SQL söz dizimi , READ_ONLYveya OPTIMISTICbelirtmiyorsaSCROLL_LOCKS, varsayılan değer aşağıdaki gibidir:
SELECTDeyimi güncelleştirmeleri desteklemiyorsa (yetersiz izinler, güncelleştirmeleri desteklemeyen uzak tablolara erişme vb.), imleç şeklindedirREAD_ONLY.STATICveFAST_FORWARDimleçler varsayılan olarak olarakREAD_ONLYgösterilir.DYNAMICveKEYSETimleçler varsayılan olarak olarakOPTIMISTICgösterilir.
İmleç adlarına yalnızca diğer Transact-SQL deyimleri tarafından başvurulabilir. Bunlara veritabanı API'leri işlevleri tarafından başvurulamazsınız. Örneğin, bir imleç bildirildikten sonra, imleç adına OLE DB, ODBC veya ADO işlevlerinden veya yöntemlerinden başvurulamaz. İmleç satırları API'lerin getirme işlevleri veya yöntemleri kullanılarak getirilemiyor; satırları yalnızca Transact-SQL FETCH deyimleri tarafından getirilebilir.
İmleç bildirildikten sonra, bu sistem saklı yordamları imlecin özelliklerini belirlemek için kullanılabilir.
| Sistem saklı prosedürleri | Description |
|---|---|
| sp_cursor_list | Bağlantıda ve özniteliklerinde şu anda görünür durumda olan imleçlerin listesini döndürür. |
| sp_describe_cursor | İmlecin yalnızca ileriye doğru veya kaydırmalı imleç gibi özniteliklerini açıklar. |
| sp_describe_cursor_columns | İmleç sonuç kümesindeki sütunların özniteliklerini açıklar. |
| sp_describe_cursor_tables | İmleç tarafından erişilen temel tabloları açıklar. |
Değişkenler, bir imleç bildiren select_statement parçası olarak kullanılabilir. İmleç değişkeni değerleri, bir imleç bildirildikten sonra değişmez.
Permissions
İmleçte kullanılan görünümler DECLARE CURSOR , tablolar ve sütunlar üzerinde izinleri olan SELECT tüm kullanıcılar için varsayılan izinler.
Limitations
Kümelenmiş columnstore dizini olan bir tabloda imleçleri veya tetikleyicileri kullanamazsınız. Bu kısıtlama, kümelenmemiş columnstore dizinleri için geçerli değildir. Kümelenmemiş columnstore dizini olan bir tabloda imleçleri ve tetikleyicileri kullanabilirsiniz.
Examples
A. Temel imleci ve söz dizimlerini kullanma
Bu imlecin açılışında oluşturulan sonuç kümesi, tablodaki tüm satırları ve tüm sütunları içerir. Bu imleç güncelleştirilebilir ve tüm güncelleştirmeler ve silmeler bu imleç üzerinde yapılan getirmelerde gösterilir.
FETCH NEXT seçeneği belirtilmediğinden SCROLL yalnızca getirme kullanılabilir.
DECLARE vend_cursor CURSOR
FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;
B. Rapor çıktısı oluşturmak için iç içe imleçleri kullanma
Aşağıdaki örnekte, karmaşık raporlar oluşturmak için imleçlerin nasıl iç içe yerleştirilebileceği gösterilmektedir. İç imleç her satıcı için bildirilir.
SET NOCOUNT ON;
DECLARE @vendor_id INT, @vendor_name NVARCHAR(50),
@message VARCHAR(80), @product NVARCHAR(50);
PRINT '-------- Vendor Products Report --------';
DECLARE vendor_cursor CURSOR FOR
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID;
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' '
SELECT @message = '----- Products From Vendor: ' +
@vendor_name
PRINT @message
-- Declare an inner cursor based
-- on vendor_id from the outer cursor.
DECLARE product_cursor CURSOR FOR
SELECT v.Name
FROM Purchasing.ProductVendor pv, Production.Product v
WHERE pv.ProductID = v.ProductID AND
pv.VendorID = @vendor_id -- Variable value from the outer cursor
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
IF @@FETCH_STATUS <> 0
PRINT ' <<None>>'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = ' ' + @product
PRINT @message
FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
-- Get the next vendor.
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
END
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;