2013-07-26 4 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を使用せず、それなしで簡単に生きることができます。

私はそれを使用することを検討する1つのケースは、多くのエラーチェックを行う複雑なコードがある場合です。エラーが返ったときに何らかのアクションをとることができます。GOTOを使用すると、エラーチェック用のコードブロックを1つ定義できます。

この問題は複数の方法で解決できますが、GOTOは、エラーが一貫して処理され、コードがたくさんのif @Error = 0 . . .ステートメントで詰まっていないことを保証する妥当なオプションです。

+1

私がここで言及しているのは、失敗する可能性のある5つのステートメントのような致命的なエラー処理と、 –

+0

SQL Serverの新しい反復でtry-catchセマンティクスを利用できるようになった今、このような状況はほとんど避けられます。 @ゴードンリノフ、あなたは2つの方法を比較している? –

+1

@ NormanH。 。 。 'try/catch'ブロックは' GOTO'とエラー処理を置き換えません。エラー処理コードは、本質的にストアドプロシージャの「終了」コードです。たとえば、見つかったエラーをログに記録します。'try/catch'ブロックはエラーをキャッチします(そしてそれを処理するかもしれませんが、一般的なエラー処理コードのポイントは同じコードを何度も繰り返さないことです)。 –

2

私は大きなスクリプトで数回見ましたが、読みやすくするために使用しました。時には読みやすくなりますが、主にスパゲッティコードに変わります。

私は、gotoがおそらくより良いパフォーマンスを発揮できる状況を1つだけ見ています。その内部は複数のwhileループです。一番内側のループだけが存在する複数のbreaksの代わりにgotoを1回使用することができます。それでも、私の意見では、ブレークはgotoよりはるかに優れていません。どちらも良いプログラミングスタイルではありません。

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


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

endloops: 
+0

これは素晴らしい答えとユニークなアプローチです。確かにスパゲッティコードを守ることは難しいですが、機能を十分に活用しても起こります! –

関連する問題