DECLARE CURSOR (Transact-SQL)
Özniteliklerini tanımlayan bir Transact-SQL server imleç, kayan davranışını ve imleç çalıştığı sonuç kümesi oluşturmak için kullanılan sorgu gibi.İMLEÇ BİLDİRMEK, standart ISO dayalı bir sözdizimi ve bir sözdizimi kullanarak bir küme , kabul Transact-SQL uzantıları.
Sözdizimi
ISO Syntax
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
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 ] ] ]
[;]
Bağımsız değişkenler
cursor_name
Adı Transact-SQL tanımlanan sunucu imleç .cursor_nametanıtıcı kurallarına uyması gerekir.Tanımlayıcıları kuralları hakkında daha fazla bilgi için bkz: Nesne adları olarak tanımlayıcıları kullanarak.DUYARLI
' % S'imleç imleçtarafından kullanılacak verileri geçici bir kopyasını yapar bir imleç tanımlar.Bu geçici tablo imleç tüm isteklere yanıt verdi tempdb; Bu nedenle fetches yapılan bu imleçtarafından döndürülen veri tabloları temel yapılan değişiklikleri yansıtılmaz ve bu imleç değişiklikler izin vermez.ISO sözdizimi kullanıldığında ve küçük harf duyarlı atlanırsa, Taahhüt edilen siler ve temel tabloları (herhangi bir kullanıcı tarafından) yapılan güncelleştirmeler sonraki fetches yansıtılır.KAYDIRMA
Tüm seçenekler getirmesi belirtir (ilk, son, önceki, sonraki, GÖRECELİ, mutlak) kullanılabilir.SONRAKİ kaydırma ISO BİLDİRMEK İMLECİNDE belirtilmezse, yalnızca getirme seçeneği desteklenir.KAYDIRMA olamaz fast_forward de belirtilmişse.select_statement
sonuç kümesi imleçtanımlayan standart bir select deyim olur.compute compute by, göz ve INTO anahtar sözcükler içinde izin verilmeyen select_statement imleç bildirim.SQL Serverimleç başka bir türüne örtülü olarak dönüştürür yan tümcelerini select_statement çakışma işlevselliğinin istenen imleç türü.Daha fazla bilgi için, bkz. Örtülü imleç dönüşümlerini kullanma.
SALT OKUNUR
Bu ' % s'imleci imleçyoluyla yapılan güncelleştirmeler engeller.imleç bir where current of yan tümce bir update veya delete deyimiçinde başvurulamaz.Bu seçenek, güncelleştirilecek bir imleç varsayılan özellikleri geçersiz kılar.UPDATE [OF column_name**,...n]
imleçiçinde güncellenebilir sütunları tanımlar.If OF column_name,**...n listelenen sütunlar değişiklikler izin yalnızca, belirtilen.Güncelleştirme bir sütun listesi belirtilirse, tüm sütun güncelleştirilebilir.cursor_name
Adı Transact-SQL tanımlanan sunucu imleç .cursor_name tanıtıcı kurallarına uyması gerekir.Tanımlayıcıları kuralları hakkında daha fazla bilgi için bkz: Nesne adları olarak tanımlayıcıları kullanarak.YEREL
imleç kapsam toplu iş, saklı yordamveya tetikleyiciyi imleç oluşturulduğu yerel olduğunu belirtir.imleç adı, yalnızca bu kapsamiçinde geçerlidir.imleç yerel imleç değişkenleri toplu iş, saklı yordam, tetikleyici veya saklı yordam çıkış parametresi olarak başvurulabilir.Bir çıkış parametresi, geri arama toplu iş, saklı yordamveya parametre saklı yordam sona erdikten sonra imleç başvurmak için bir imleç değişkenine atamak için kullanabilirsiniz tetikleyici yerel imleç aktarmak için kullanılır.toplu iş, saklı yordamveya tetikleyiciyi sonlandırıldığında, imleç geri bir çıkış parametresi geçirilen sürece imleç örtülü olarak ayırmanın.Bir çıktı parametresini geri verilmezse, onu başvuran son değişken ayırmanın kaldırılmasından veya kapsamdışında imleç kaldırıldı.GENEL
imleç kapsam genel bağlantı olduğunu belirtir.imleç adı, herhangi bir saklı yordam veya bağlantı tarafından yürütülen toplu iş başvurulabilir.imleç bağlantı kesme yalnızca dolaylı olarak ayırmanın kaldırılmasından.Not
Genel ya da yerel belirtilmezse, varsayılan ayarı tarafından denetlenir yerel imleçvarsayılan veritabanı seçeneği.De SQL Server sürüm 7.0, bu seçenek varsayılan olarak yanlış eşleşen önceki sürümleri için SQL Server, tüm imleçler genel olarak.Bu seçeneğin varsayılan gelecekteki sürümlerinde değişebilir SQL Server.Daha fazla bilgi için, bkz. Veritabanı seçeneklerini ayarlama.
FORWARD_ONLY
imleç yalnızca ilk son kaydırılabileceği olduğunu belirtir satır.GETİRME sonraki ise yalnızca desteklenen getirme seçeneği.forward_only statik, anahtar KÜMESİ veya dinamik anahtar sözcükler belirtilirse, imleç dinamik bir imleççalışır.forward_only kendisi kaydırma belirtildiğinde, statik, anahtar KÜMESİ veya dinamik anahtar sözcükler belirtilmedikçe forward_only, varsayılandır.STATİK, anahtar KÜMESİ ve dinamik imleçler için kaydırma varsayılan.Gibi odbc ve ADOAPI veritabanından farklı olarak, forward_only statik ve DYNAMIC ile desteklenen Transact-SQL imleçler.STATİK
' % S'imleç imleçtarafından kullanılacak verileri geçici bir kopyasını yapar bir imleç tanımlar.Bu geçici tablo imleç tüm isteklere yanıt verdi tempdb; Bu nedenle fetches yapılan bu imleçtarafından döndürülen veri tabloları temel yapılan değişiklikleri yansıtılmaz ve bu imleç değişiklikler izin vermez.ANAHTAR KÜMESİ
Üyelik ve imleç satırların sırasına imleç açıldığında sabit olduğunu belirtir.Yerleşik küme satırları benzersiz olarak tanımlayan anahtarların bir tablo bulunan tempdb olarak bilinen anahtar kümesi.Not
benzersiz dizinolmadan en az bir tablo sorgu başvuran, anahtar kümesi imleç bir statik imleçdönüştürülür.
Sahibi imleçkayarken anahtarı olmayan değerlere imleç sahibi tarafından yapılan veya diğer kullanıcılar tarafından kabul edilen temel tablolardaki değişiklikler görülebilir.Diğer kullanıcıların yaptığı ekler görünmez (ekler ile yapılamaz bir Transact-SQL server imleç).Bir satır silinirse, satır Getir denemesi bir @@ fetch_status-2 döndürür.imleç dışında anahtar değerlerin güncelleştirmeleri Sil Ekle yeni satırın ardından eski satırın benzer.Yeni değerleri içeren satırı görünür değildir ve eski değerlerin bulunduğu satırı getirmek için girişimleri bir @@ fetch_status-2 dönün.Güncelleştirme, where current of yan tümcebelirterek imleç yoluyla yapılır, yeni değerler görülebilir.
DİNAMİK
imleçKaydırırken satır kendi sonuç kümesi yapılan tüm veri değişiklikleri yansıtır bir imleç tanımlar.Veri değerleri, sipariş ve üyelik satırların her getirme üzerinde değiştirebilirsiniz.MUTLAK getirme seçeneği ile dinamik imleçler desteklenmez.FAST_FORWARD
Bir forward_only belirtir, imleç read_only performansını en iyi duruma getirme etkin.fast_forward olamaz kaydırma veya for_update de belirtilmişse.Not
De SQL Server 2000, fast_forward ve forward_only imleç seçenekleri var. karşılıklı olarak özelHer ikisi de belirtilirse, bir hata ortaya çıkar.De SQL Server 2005 ve daha sonra her iki sözcüğü aynı BİLDİRMEK İMLEÇ deyimkullanılabilir.
READ_ONLY
Bu ' % s'imleci imleçyoluyla yapılan güncelleştirmeler engeller.imleç bir where current of yan tümce bir update veya delete deyimiçinde başvurulamaz.Bu seçenek, güncelleştirilecek bir imleç varsayılan özellikleri geçersiz kılar.SCROLL_LOCKS
Konumlandırılmış güncelleştirmeler veya imleç yoluyla yapılan siler başarılı olması için garanti belirtir.SQL Serverimleç sonraki değişiklikler için bunların kullanılabilirliğini sağlamak için içine okurken satırları kilitler.scroll_locks olamaz fast_forward ya da statik de belirtilmişse.İYİMSER
Satır imleçokunuşundan güncelleştirilmişse konumlandırılmış güncelleştirmeler veya imleç yoluyla yapılan silme başarısız olduğunu belirtir.SQL Serverimleçokurken değil kilit satır yapar.Bunun yerine karşılaştırmalarını kullanır timestampsütun değerlerini veya bir sağlama toplamı değeri ise tablo vardır Hayır timestamp imleçokunduktan sonra satırın değiştirilip değiştirilmediğini belirlemek içinsütun,. Satır değiştirildiği, denenen konumlandırılmış güncelleştirme veya silme başarısız olur.İYİMSER fast_forward de belirtilmezse belirtilemez.TYPE_WARNING
imleç olduğunda bir uyarı iletisi istemci gönderilir belirtir örtülü olarak dönüştürülmesi istenen türünden diğerine.select_statement
sonuç kümesi imleçtanımlayan standart bir select deyim olur.compute compute by, göz ve INTO anahtar sözcükler içinde izin verilmeyen select_statement imleç bildirim.Not
Bir imleç bildirimiçinde bir sorgu ipucu kullanabilirsiniz; Ayrıca, güncelleştirme için yan tümcekullanırsanız, ancak seçeneği belirtin (query_hint) sonra for update of.
SQL Serverimleç başka bir türüne örtülü olarak dönüştürür yan tümcelerini select_statementçakışma işlevselliğinin istenen imleç türü.Daha fazla bilgi için bkz: örtülü imleç dönüşümlerini.
FOR UPDATE [OF column_name**,...n]
imleçiçinde güncellenebilir sütunları tanımlar.If OF column_name,**...n listelenen sütunlar değişiklikler izin yalnızca, sağlanır.Güncelleştirme belirtilirse, bir sütun listesi tüm sütun güncelleştirilebilir, read_only eşzamanlılık seçeneği belirtilmedikçe.
Açıklamalar
BİLDİRMEK İMLEÇ özniteliklerini tanımlayan bir Transact-SQL server imleç, kayan davranışını ve imleç çalıştığı sonuç kümesi oluşturmak için kullanılan sorgu gibi.sonuç kümesiaçık deyim doldurur ve getirme sonuç kümesibir satır döndürür.Kapat deyim imleçile ilişkili geçerli sonuç kümesi yayımlar.deallocate deyim imleçtarafından kullanılan kaynakları serbest bırakır.
İlk form BİLDİRMEK İMLEÇ deyim imleç davranışlar bildirmek için ISO sözdizimi kullanır.İMLEÇ BİLDİRMEK ikinci biçiminde kullanılır Transact-SQL aynı imleç türleri kullanarak imleçleri tanımlamanızı sağlayan extensions kullanılan veritabanı API imleç işlevleri odbc veya ADO.
İki karıştırılamaz.KAYDIRMA ya da İMLECİ anahtar önce duyarlı anahtar sözcükleri belirtin, herhangi bir anahtar sözcük için İMLECİ arasında kullanamazsınız select_statement anahtar sözcükler.Herhangi bir anahtar sözcük için İMLECİ arasında belirtirseniz select_statement anahtar sözcükler, önce İMLEÇ anahtar sözcük kaydırma ya da küçük harf duyarlı belirtemezsiniz.
BİLDİRMEK İMLECİ kullanarak, Transact-SQL sözdizimi belirtilmemiştir read_only, İYİMSER ya da scroll_locks, varsayılan değer aşağıdaki gibidir:
select deyim (yeterli izinleri olmayan güncelleştirmeleri ve benzeri uzak tabloları erişme) güncelleştirmeleri desteklemediğinden, imleç read_only olur.
STATİK ve fast_forward imleçler varsayılan read_only için.
DİNAMİK ve anahtar KÜMESİ imleç varsayılan İYİMSER.
Yalnızca diğer imleç adları başvurulabilir Transact-SQL ifadeleri.Veritabanı API işlevleri tarafından başvurulamaz.Örneğin, imleçbildirme sonra imleç adı ole DB, odbc ve ADO işlevler veya yöntemler başvurulamaz.imleç satır getirme işlevler veya yöntemler API'leri kullanılarak getirilen olamaz; satırları yalnızca getirilmesi Transact-SQL alıp deyimleri.
Bir imleç bildirilen sonra bu sistem saklı yordamları imleçözelliklerini belirlemek için kullanılır.
Sistem saklı yordamlar |
Açıklama |
---|---|
sp_cursor_list |
İmleçler listesini görünür bağlantı ve öznitelikleri döndürür. |
sp_describe_cursor |
Bunu bir salt ileri imleçkaydırma olup gibi bir imleçözniteliklerini açıklar. |
sp_describe_cursor_columns |
imleçsonuç kümesisütun özniteliklerini açıklar. |
sp_describe_cursor_tables |
' % S'imleç imleçtarafından erişilen temel tabloları açıklar. |
Değişkenleri bir parçası olarak kullanılabilir select_statement , imleçbildirir.Bir imleç bildirilen sonra imleç değişken değerleri değiştirmeyin.De SQL Serversürüm 6.5 ve önceki sürümlerinde, değişken değerleri bir imleç yeniden her saat yenilenir.
İzinler
Görünümler, tablolar ve sütunlar imleçiçinde kullanılan select izinlerine sahip herhangi bir kullanıcı için izinleri varsayılan İMLEÇ BİLDİRİN.
Örnekler
A.Basit imleç ve sözdizimini kullanma
Bu imleç açılış sırasında oluşturulan sonuç kümesi tüm satırları ve tüm sütunları tabloiçerir.Bu imleç güncelleştirilebilir ve tüm güncelleştirmeleri ve silmeleri bu ' % s'imleç imleçkarşı yapılan fetches gösterilir.FETCHNEXTyalnızca getirme kullanılabilir çünkü SCROLL seçeneği değil belirtilmiş.
USE AdventureWorks2008R2;
GO
DECLARE vend_cursor CURSOR
FOR SELECT BusinessEntityID, Name, CreditRating FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;
B.İç içe imleçler rapor çıktısı üretmek için kullanma
Aşağıdaki örnek imleçler karmaşık raporlar üretmek için nasıl yuvalanabilir gösterir.Her satıcı için iç imleç bildirildi.
USE AdventureWorks2008R2;
GO
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 BusinessEntityID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY BusinessEntityID;
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 AS pv
INNER JOIN Production.Product AS v
ON pv.ProductID = v.ProductID AND
pv.BusinessEntityID = @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;