2013-07-26 30 views
5

Microsoft T-SQL kodunun biçimlendirilmesi hakkında "dini" bir tartışmada, GOTO ifadesinin T-SQL sözdiziminde hala kullanılabilir olup olmadığını sorguladım. T-SQL kullanmanın 13 yıl içinde bunu kullanmak için hiçbir zaman fırsatım olmadı ve gerçekten var olup olmadığını bilmiyordum. Belgelerin kısa bir araştırmasından sonra ve benim üzüntüümden sonra gerçekten var!T-SQL GOTO ifadesinin kullanılması hangi durumda kabul edilebilir?

GOTO ifadeleri bir diğerinden daha iyidir gerçekleştirdiği olduğu diğer yüksek mertebeden programlama yapıları kullanılır bir çözüm doğuracak en az bir olayda

var mı:

Sorum şudur?

  • Şifreleme algoritması uygulama

Sorum şu DEĞİL:

  • nasıl bunu yapmak için bütün bir işlevi yaratmadan işlevselliği küçük parçalarını kullanıyor?
  • Kopyalama/yapıştırma yapmadan hata işleme işlevini nasıl çoğaltabilirim?
+0

keresinde git ihtiyaç vardı bir soru çözmüş: http://stackoverflow.com/questions/7244617/data-grouping-according-to-relevant-values-in-sql-server/7254163#7254163 –

+0

@ t-clausen.dk Bu kesinlikle bir cevap olarak listelenmesi gerekiyor! GOTO'un ilginç ve benzersiz bir kullanımı kesinlikle! Bir süreyi neden kullanmadığın hakkında bir fikrin var mı? –

+0

"WHILE" ile de yapılmış olabilir :) –

cevap

4

Neredeyse hiçbir zaman GOTO'u kullanmıyorum ve kolaylıkla yaşayamam.

Kullanmayı düşündüğüm bir örnek, çok fazla hata denetimi yapan karmaşık bir kod olduğum zamandır. Bir hata döndüğünde bazı eylemler yapmak isteyebilir ve GOTO hata denetimi için tek bir kod bloğunu tanımlamamı sağlar.

Bu sorunu birden çok şekilde çözebilirsiniz, ancak GOTO hataların sürekli işlenmesini ve kodun çok sayıda if @Error = 0 . . . deyimiyle dağılmamasını garanti eden makul bir seçenektir.

+1

Burada atladığınız şey, başarısız olabilecek 5 ifade gibi şeyler için felaketle ilgili hata işleme olduğunu ve bunlardan herhangi birinin yalnızca bir hata işleme bloğunu kullanamamış olduğunu varsayalım. –

+0

Bu durum, SQL Server'ın daha yeni yinelemelerinde bulunan yeni yakalama semantikleriyle artık önlenebilir. @Gordon Linoff, iki yöntemi karşılaştırdınız mı? –

+1

@NormanH. . . 'try/catch' blokları, 'GOTO' yerine geçmez ve hata işleme. Hata işleme kodu, saklı yordam için esas olarak "çıkış" kodudur, biri bulunduğunda hataların kaydedilmesi için söyleyin.'Try/catch' bloğu hatayı yakalar (ve işleyebilir, ancak ortak hata işleme kodunun noktası, aynı kodu tekrar tekrar tekrar etmekten kaçınmaktır). –

2

İnsanların okunabilirliği artırmak için kullandığı büyük komut dosyalarında birkaç kez goto gördüm. bazen daha iyi okunabilir ama çoğunlukla spagetti koduna dönüşür.

Goto'nun daha iyi performans gösterebileceği bir durum görüyorum. onun içinde bir çok süre döngü. En içteki döngüyü kullanan birden çok breaks yerine bir kez kullanabilirsiniz. yine de bence, her ikisi de iyi bir programlama stili değil, goto'dan çok daha iyi değildir.

while ... 
    while ... 
    while... 
    break 
    break 
break 


while ... 
    while ... 
    while... 
    goto endloops 

endloops: 
+0

Bu harika bir cevap ve benzersiz bir yaklaşım. Kesinlikle spagetti koduna karşı koruma zorlu bir iştir - ancak bu işlevlerin tam kullanımıyla bile gerçekleşebilir! –

İlgili konular