2013-07-26 3 views
5

В «религиозной» дискуссии о форматировании кода Microsoft T-SQL я задал вопрос о том, был ли еще доступен оператор GOTO в синтаксисе T-SQL. За 13 лет использования T-SQL я никогда не имел возможности использовать его, и даже не знал, существует ли он. После краткого поиска документации и моего ужаса она действительно существует!В каком случае допустимо использование оператора 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

Кажется, что эту ситуацию в большинстве случаев можно избежать теперь, когда семантика try-catch доступна в новых итерациях SQL Server. @ Gordon Linoff, вы сравнили эти два метода? –

+1

@NormanH. , , Блоки 'try/catch' не заменяют' GOTO' и обработку ошибок. Код обработки ошибок - это, по сути, код «выхода» для хранимой процедуры, скажем, чтобы лог-ошибки были обнаружены.Блок 'try/catch' ловит ошибку (и может обрабатывать ее, но точка общего кода обработки ошибок состоит в том, чтобы избежать повторения одного и того же кода снова и снова). –

2

Я видел несколько раз в больших сценариях, где люди использовали его для улучшения удобочитаемости. иногда он лучше читается, но в основном он превращается в код спагетти.

Я вижу только одну ситуацию, когда goto может работать лучше. его внутри кратного цикла. вы можете использовать goto один раз вместо нескольких breaks, который просто существует в самой внутренней петле. тем не менее, на мой взгляд, разрыв не намного лучше, чем goto, и не очень хороший стиль программирования.

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


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

endloops: 
+0

Это отличный ответ и уникальный подход. Конечно, защита от спагетти-кода - это вызов, но это может произойти даже при полном использовании функций! –

Смежные вопросы