Начало ... Завершение блоков в SQL Server. Правильно ли указан этот код? - PullRequest
1 голос
/ 03 февраля 2009

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

Я переписываю много старых хранимых процедур и продолжаю видеть операторы IF, отформатированные примерно так:

begin
    if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
end

Таким образом, блок Begin ... End просто оборачивает (но не влияет) оператор IF, верно? Это какой-то старый синтаксис для IF или что-то еще?

Парень, который написал это, не имел большого опыта работы с SQL до этой работы; он работал в основном в VB (до .NET). Может быть, это синтаксис какого-то другого языка, поэтому он случайно написал это по привычке?

Это SQL Server 2005 (код был написан для / для SQL Server 2000), кстати

Как я уже сказал, я просто пытаюсь обернуть свой мозг вокруг этих спагетти. Любые мысли / комментарии / озарения приветствуются

Спасибо

Ответы [ 4 ]

10 голосов
/ 03 февраля 2009

В T-SQL Begin и END должны обернуть содержащиеся операторы IF (или другой управляющей структуры) несколькими выполняемыми операторами (например, блоком кода)

будет работать

if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'

Также будет работать, но не обязательно

if @someParameter <> 'ThisType'
Begin
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
End

Будет работать как ожидалось

if @someParameter <> 'ThisType'
Begin
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
    {...do other stuff}
End

Не будет работать должным образом (если вы ожидали, что оба оператора будут выполняться только при условии, что для меня задано условие IF)

if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
    {...do other stuff}

Нет семантического значения

Begin --without wrapping control structure
    {...stuff}
End 
3 голосов
/ 03 февраля 2009

Правильно. Блок begin ... end в вашем примере инкапсулирует оператор IF, но не влияет на него. Хотя виновный программист, вероятно, должен был сделать

BEGIN
  if ... BEGIN
    set @somecode...
  END
END 
1 голос
/ 03 февраля 2009

Это зависит от того, что было до этого. Код, который вы разместили, такой же, как

if @someParameter <> 'ThisType'
set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'

Перед оператором может быть оператор, если для этого требуется блок начала / конца.

1 голос
/ 03 февраля 2009

Вы можете смело изменить его на:

if @someParameter <> 'ThisType'
begin
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
end

begin..end все еще добавляется, но код более читабелен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...