2011-03-01 25 views
8

Bir imleç kullanıyorum. TSQL değişim imleç tanımı

DECLARE @column1 NVARCHAR(MAX); 

DECLARE cursor_name CURSOR FOR 
    SELECT c1 
    FROM table_name; 

OPEN cursor_name; 
FETCH cursor_name INTO @column1; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    FETCH cursor_name INTO @column1; 
END 

CLOSE cursor_name; 
DEALLOCATE cursor_name; 

Şimdi benim sorum ben kullandıktan sonra imleç cursor_name 'ın tanımını değiştirebilir, nedir? Ben benzer bir şey demek: Aynı imleç adı cursor_name kullanma

DECLARE cursor_name CURSOR FOR 
    SELECT c2 
    FROM table_name2; 

ancak tanımı değiştirilir. Bu mümkün mü, nasıl yapılır?

Teşekkürler. İmleç kapalı ve ayırmanın bir kez imleç görünümü tamamen teknik açıdan gerekli olup olmadığı tartışmasını kaçınmak

cevap

10

Yes it's possible ama bu senin DEALLOCATE ondan sonra olmalıdır. Bunu denedin mi, işe yaramıyor mu?

Ayrıca gerçekten bir imleç gerekip gerekmediğini bakmak isteyebilirsiniz. Performansa zarar veriyorlar ve bunları kullanan SQL genellikle onlar olmadan yeniden yazılabilir.

bunu nasıl gider this article bir göz atın. Bir imleci bildirmek için daha az kullanılan DECLARE/SET sözdizimini kullanırlar (dünyamda en az nadir görülen). Abe Miessler imleç performansı hakkında yorum yanıltıcı için

USE pubs 
GO 
DECLARE @MyCursor CURSOR 
SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM titles 

DEALLOCATE @MyCursor 

SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM sales 
GO 
4

, tekrar adını yeniden özgürdür.

-1

Düzeltme: saklı usul ve tetikleyiciler içerdiği zaman

Transact-SQL imleçleri son derece verimlidir İşte sağladıkları örnektir. Her şey sunucuda bir yürütme planına derlenmiş ve alma sıralar

  • başvurulan msdn article gelen Özü ile ilişkili bir ağ trafiği var olmasıdır.

Performans için kötü olan, sürekli olarak saklanan bir proc dışında bir sonraki satır için global bir imleç çağırıyor. Db round gezilerini azaltmak için bir istemci api toplu işleyiş özelliğini kullanmak daha iyidir.

Bir program değişken FETCH tarafından döndürülen her sütun bağlama FETCH kullanarak ve tarafından uygulamalarda Transact-SQL imleç kullanabilirsiniz. Transact-SQL Ancak toplu desteklemiyor FETCH, bu nedenle bu bir uygulamaya verileri döndürmek için az etkili yoludur. Her bir satırının getirilmesi, sunucuya gidiş dönüş gerektirir. 'un, satır yığınlarını getirmeyi destekleyen veritabanı API'larına yerleşik imleç işlevini kullanmak daha etkilidir.