2013-07-26 47 views
5

在關於Microsoft T-SQL代碼格式化的「宗教」討論中,我質疑GOTO語句在T-SQL語法中是否仍然可用。在使用T-SQL的13年中,我從來沒有機會使用它,並且確實不知道它是否存在。經過對文檔的簡短搜索以及我的驚愕之後,它確實存在!在什麼情況下可以接受使用T-SQL GOTO語句?

我的問題是這樣的:

至少在一個案例其中GOTO語句將產生該執行總比一個人好,其中其它高階編程結構使用的解決方案?

  • 加密算法實現

我的問題是

  • 我如何使用的功能,小位,而無需創建一個全功能,這樣做呢?
  • 如何在不復制/粘貼的情況下複製錯誤處理功能?
+0

我一旦解決地方需要轉到一個問題:http://stackoverflow.com/questions/7244617/data-grouping-according-to-relevant-values-in-sql-server/7254163#7254163 –

+0

@ t-clausen.dk這絕對需要被列爲答案!這確實是GOTO的一個有趣和獨特的用途!任何想法爲什麼你沒有使用while循環? –

+0

本來可以用'WHILE'完成:) –

回答

4

我幾乎從來沒有使用GOTO,沒有它可以輕鬆生活。

我會考慮使用它的一種情況是當我有複雜的代碼,它會執行很多錯誤檢查。當錯誤返回時,我可能想要採取一些措施,並且GOTO允許我爲錯誤檢查定義一個代碼塊。

可以解決多種方式這個問題,但GOTO是保證誤差始終處理一個合理的選擇和代碼是不是堆滿了大量的if @Error = 0 . . .聲明。

+1

我假定你在這裏提到的是對可能失敗的5個語句的事件進行災難性的錯誤處理,並且如果它們中的任何一個失敗,就只使用一個錯誤處理塊。 –

+0

似乎現在大多數情況下可以避免使用SQL Server的新迭代中提供的try-catch語義。 @Gordon Linoff,你有沒有比較這兩種方法? –

+1

@NormanH。 。 。 'try/catch'塊不能代替'GOTO'和錯誤處理。錯誤處理代碼本質上就是存儲過程的「退出」代碼,比如當發現一個錯誤時記錄錯誤。try/catch塊捕獲錯誤(並可能處理它,但常見錯誤處理代碼的重點是避免重複相同的代碼)。 –

2

我在大型腳本中看到過幾次,人們用它來提高可讀性。有時它的可讀性更好,但大多數情況下它會變成意大利麪代碼。

我只看到一種情況,goto可能表現更好。它內部有多個while循環。你可以使用goto而不是多個breaks,它只存在於最裏面的循環中。儘管如此,在我看來,休息並不比goto好,它不是一個好的編程風格。

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


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

endloops: 
+0

這是一個很好的答案和獨特的方法。當然,防範意大利麪代碼是一項挑戰 - 但即使充分利用功能,也可能發生這種情況! –

相關問題