declare cursor (Transact-sql)

Özniteliklerini tanımlayan bir Transact-SQLkayan davranış ve sonuç kümesi imleci çalıştığı oluşturmak için kullanılan sorgu gibi sunucu imleç. declare cursor kabul hem standart ISO dayalı bir sözdizimi hem de bir dizi kullanarak bir sözdizimi Transact-SQLuzantıları.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

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-SQLtanımlanan sunucu imleç. cursor_nametanımlayıcıları kuralları uymalıdır.

  • BÜYÜK KÜÇÜK HARF DUYARLI
    Imleç tarafından kullanılacak verileri geçici bir kopyasını yapar bir imleç tanımlar. Geçici bu tablodan imleci tüm isteklerine cevap tempdb; Bu nedenle, temel tablolar için yapılan fetches yapılan bu imleç tarafından döndürülen veri yansıtılmaz ve bu imleç değişiklikler izin vermez. ISO sözdizimi kullanıldığında INSENSITIVE atlanırsa, kararlı siler ve (herhangi bir kullanıcı tarafından) için temel tablolarda yapılan güncelleştirmeler sonraki fetches yansıtılır.

  • KAYDIRMA
    Tüm seçenekler getir belirtir (ilk, son, önceki, sonraki, göreceli, mutlak) mevcuttur. SONRAKİ kaydırma bir ISO imleç declare belirtilmezse, yalnızca GETIRME seçeneği desteklenir. KAYDIRMA olamaz fast_forward de belirtilirse, belirtilen.

  • select_statement
    İmleç sonuç kümesini tanımlayan standart bir select deyimi iş. GÖZATMAK ve INTO anahtar içinde izin verilmeyen select_statement bir imleç bildirisi.

    SQL ServerÖrtülü imleç başka bir türe dönüştürür yan tümcelerini select_statement İstenen imleç türünü işlevselliği ile çatışması.

  • SALT OKUNUR
    Bu imleci yoluyla yapılan güncelleştirmeleri engeller. where current of yan tümcesi içinde bir update veya delete deyimi imleç başvurulamaz. Bu seçenek, güncelleştirilecek bir imleç varsayılan özelliği geçersiz kılar.

  • UPDATE [OF column_name**,...n]]
    Güncelleştirilebilir sütun imleci tanımlar. If OF column_name
    ,**.. .n] yalnızca listelenen sütunlar değişiklikler izin, belirtilir. GÜNCELLEŞTİRME olmadan bir sütun listesi belirtilirse, tüm sütun güncelleştirilebilir.

  • cursor_name
    Adı Transact-SQLtanımlanan sunucu imleç. cursor_name tanımlayıcıları kuralları uymalıdır.

  • YEREL
    İmleç kapsamı toplu iş, saklı yordam veya tetikleyiciyi imleci oluşturulduğu yerel olduğunu belirtir. İmleç adı, yalnızca bu kapsam içinde geçerlidir. İmleci, yerel imleç değişkenleri toplu iş, saklı yordam, tetikleyici veya saklı yordam çıkış parametresi olarak başvurulabilir. Bir çıkış parametresi, yerel imleç geri çağıran bir toplu iş, saklı yordam veya tetikleyiciyi, hangi saklı yordamı sonlandırır sonra imleci başvurmak için bir imleç değişken parametre atayabilirsiniz geçmek için kullanılır. Toplu iş, saklı yordam veya tetikleyiciyi sonlandırıldığında, imleç geri bir çıkış parametresi geçirilen sürece, imleç örtülü olarak kaldırıldı. Geri bir çıkış parametresi aktarılırsa başvuran bu son değişken kaldırıldı veya kapsam dışı kaldığında imleç kaldırıldı.

  • KÜRESEL
    İmleç kapsamı bağlantı küresel olduğunu belirtir. İmleç adı, saklı yordam veya bağlantı tarafından yürütülen toplu başvurulabilir. İmleç bağlantıyı kes yalnızca dolaylı olarak kaldırıldı.

    [!NOT]

    Küresel ya da yerel belirtilirse, varsayılan ayarı tarafından denetlenir Yerel imleç varsayılan veritabanı seçeneği.

  • FORWARD_ONLY
    İmleç yalnızca ilk son kaydırılır olduğunu belirtir satır. fetch next ise yalnızca GETIRME seçeneği desteklenir. forward_only statik, anahtar kümesi veya dinamik anahtar kelimeler belirtilirse, imleci DEVİNGEN imleç gibi çalışır. forward_only kendisi kaydırma belirtildiğinde, statik, anahtar kümesi veya dinamik anahtar kelimeler belirtilmedikçe forward_only, varsayılandır. STATİK, anahtar kümesi ve dinamik imleçler varsayılan ilerleyin. odbc ve ado API veritabanından farklı olarak, forward_only statik, anahtar kümesi ve dinamik ile desteklenen Transact-SQLimleçler.

  • STATİK
    Imleç tarafından kullanılacak verileri geçici bir kopyasını yapar bir imleç tanımlar. Geçici bu tablodan imleci tüm isteklerine cevap tempdb; Bu nedenle, temel tablolar için yapılan fetches yapılan bu imleç tarafından döndürülen veri yansıtılmaz ve bu imleç değişiklikler izin vermez.

  • ANAHTAR KÜMESİ
    Üyelik ve sipariş satır imleci imleç açıldığında giderilen belirtir. Bir tablodaki satırların benzersiz olarak tanıtan anahtarları kümesi yerleşik tempdb olarak bilinen anahtar kümesi.

    [!NOT]

    En az bir tablo benzersiz bir dizin olmaksızın başvuruda bulunuyorsa, anahtar kümesi imleç bir statik imleç dönüştürülür.

    Sahibi imleci kayarken nonkey değerlere imleç sahibi tarafından yapılan veya diğer kullanıcılar tarafından işlenen temel tablolarda değişiklikleri görülebilir. Diğer kullanıcılar tarafından yapılan ekler görünmez (ekler aracılığıyla yapılması değil bir Transact-SQLsunucu imleç). Bir satırın satır getirme girişimi bir @@ fetch_status-2 döndürür. Güncelleştirmeleri dışında imleci anahtar değerleri, yeni satır ekleme tarafından takip eski satır silme benzer. Yeni değerleri satır görünür değildir ve eski değerleri satır getirme girişimlerini bir @@ fetch_status-2 dönün. Yeni değerler, eğer güncelleme where current of yan tümcesi belirterek imleci yoluyla yapılır görülebilir.

  • DİNAMİK
    Onun sonuç kümesi imleci kaydırırken satır yapılan tüm veri değişiklikleri yansıtan 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 read_only imleç ile performansı en iyi duruma getirme etkin. fast_forward olamaz kaydırma veya for_update de belirtilirse, belirtilen.

    [!NOT]

    De SQL Server 2005ve fast_forward hem forward_only aynı declare cursor deyimi sonra kullanılabilir.

  • READ_ONLY
    Bu imleci yoluyla yapılan güncelleştirmeleri engeller. where current of yan tümcesi içinde bir update veya delete deyimi imleç başvurulamaz. Bu seçenek, güncelleştirilecek bir imleç varsayılan özelliği geçersiz kılar.

  • SCROLL_LOCKS
    Konumlandırılmış güncelleştirmeler veya imleci yoluyla yapılan siler başarılı garantilidir belirtir. SQL Serverdaha sonra değişiklikleri için kullanılabilmelerini sağlamak için imleci içine okunur gibi satırları kilitler. scroll_locks olamaz fast_forward veya statik de belirtilirse, belirtilen.

  • İYİMSER
    İmleci okunduğundan bu yana satır güncelleştirilmişse konumlandırılmış güncelleştirmeler veya imleci yoluyla yapılan siler başarısız olduğunu belirtir. SQL Serverİmleci okunduğu gibi satırlar kilitlemez. Bunun yerine karşılaştırmalar kullanan timestampsütun değerleri, ya da bir sağlama toplamı değeri tablonun yok varsa timestampsütun imleci okunuşundan sonra satırın değiştirilip belirlemek için. Satır değiştirildiyse, teşebbüs konumlandırılmış güncelleştirme veya başarısız silme. İYİMSER fast_forward da belirtilmezse belirtilemez.

  • TYPE_WARNING
    Imleci örtülü olarak istenen türünden diğerine dönüştürüldüğünde bir uyarı iletisi istemciye gönderilir belirtir.

  • select_statement
    İmleç sonuç kümesini tanımlayan standart bir select deyimi iş. compute compute by, for browse ve INTO anahtar kelimeler içinde izin verilmeyen select_statement bir imleç bildirisi.

    [!NOT]

    Bir imleç bildirimi içinde sorgu ipucu kullanabilirsiniz; for update of yan tümcesi de kullanıyorsanız, ancak seçeneği belirtin (query_hint) sonra for update of.

    SQL ServerÖrtülü imleç başka bir türe dönüştürür yan tümcelerini select_statementİstenen imleç türünü işlevselliği ile çatışması. Daha fazla bilgi için bkz: Örtülü imleç Dönüşümlerini.

  • FOR UPDATE [OF column_name**,...n]]
    Güncelleştirilebilir sütun imleci tanımlar. If OF column_name
    ,**... n] yalnızca listelenen sütunlar değişiklikler izin, verilir. Güncelleştirme belirtilirse, sütun listesi, tüm sütun güncelleştirilebilir, read_only eşzamanlılık seçeneği belirtilmedikçe.

Açıklamalar

declare cursor özniteliklerini tanımlayan bir Transact-SQLkayan davranış ve sonuç kümesi imleci çalıştığı oluşturmak için kullanılan sorgu gibi sunucu imleç. open deyimi sonuç kümesini doldurur ve getirme sonuç kümesi bir satır döndürür. Kapat deyimi imleç ile ilişkili geçerli sonuç kümesi serbest bırakır. deallocate deyimi imleç tarafından kullanılan kaynakları serbest bırakır.

declare cursor deyimi ilk şeklinde, imleç davranışlar bildirmek için ISO sözdizimi kullanır. declare cursor ikinci formu kullanan Transact-SQLaynı imleç türleri kullanarak imleçleri tanımlamanızı sağlayan uzantıları kullanılan veritabanı odbc veya ado API imleç işlevleri.

İki karıştırılamaz. Belirlediğiniz kaydırma veya İMLECİ anahtar önce duyarlı anahtar kelimeler, anahtar kelimeler için İMLECİ arasında kullanamazsınız select_statementanahtar. Herhangi bir anahtar kelime için İMLECİ arasında belirtirseniz select_statementanahtar kelimeler, önce imleç kelime kaydırma veya INSENSITIVE belirtemezsiniz.

Bir imleç declare kullanarak Transact-SQLsözdizimi değil belirtmek read_only, iyimser ya da scroll_locks, varsayılan aşağıdaki gibidir:

  • select deyimi güncelleştirmeleri (yetersiz izinler erişme uzak tablo güncelleştirmelerini desteklemek, ve benzeri) desteklemiyor, imleci read_only olur.

  • STATİK ve fast_forward imleçler varsayılan read_only.

  • DİNAMİK ve anahtar KÜMESI imleç varsayılan OPTIMISTIC için.

İmleç adları, yalnızca diğer tarafından başvurulabilir Transact-SQLdeyimleri. Veritabanı API işlevleri tarafından başvurulamaz. Örneğin, imleç bildirme sonra imleç adı ole db, odbc veya ado işlevleri veya yöntemleri başvurulamaz. İmleci satır getirme işlevler veya yöntemler API kullanılarak getirilen olamaz; satırları yalnızca ile getirilebilir Transact-SQLGETIRME deyimleri.

Bir imleç bildirilen sonra bu sistem saklı yordamları imleci özelliklerini belirlemek için kullanılır.

Sistem saklı yordamlar

Açıklama

sp_cursor_list

Imleçler listesi görünür bağlantı ve özniteliklerini döndürür.

sp_describe_cursor

Salt okunur veya kaydırma imleci olup gibi bir imleç özniteliklerini açıklar.

sp_describe_cursor_columns

İmleç sonuç kümesindeki sütun özniteliklerini açıklar.

sp_describe_cursor_tables

Imleç tarafından erişilen temel tabloları açıklar.

Değişkenleri bir parçası olarak kullanılabilir select_statement, imleç ilan etti. Bir imleç bildirilen sonra imleç değişken değerleri değiştirmeyin.

İzinler

declare cursor görünümler, tablolar ve sütunlar imleç içinde kullanılan select izinlerine sahip bir kullanıcı için varsayılan izinleri.

Örnekler

A.Basit imleç ve sözdizimini kullanma

Bu imleç açılışında oluşturulan sonuç kümesindeki tüm satırları ve tüm sütunları tabloda içerir. Bu imleç güncelleştirilebilir ve tüm güncelleştirmeleri ve silmeleri fetches yapılan bu imleç karşı temsil edilir. FETCH NEXTyalnızca GETIRME mevcuttur çünkü SCROLLseçeneği değil belirtilen.

DECLARE vend_cursor CURSOR
    FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;

DECLARE vend_cursor CURSOR
    FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;

B.Rapor çıktı üretmek için iç içe imleçler kullanma

Aşağıdaki örnek, nasıl imleçler karmaşık raporları oluşturmak için yuvalanmış gösterir. Her satıcı için iç imleci bildirildi.

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;

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;

Ayrıca bkz.

Başvuru

@@ fetch_status (Transact-sql)

Kapat (Transact-sql)

Imleçler (Transact-sql)

(Transact-sql) Kaldır

fetch (Transact-sql)

select (Transact-sql)

sp_configure (Transact-sql)