Могу ли я использовать оператор SQL IF ELSE без BEGIN и END?

Я заметил, что нет необходимости использовать BEGIN и END в операторе IF ELSE T-SQL. Так зачем нам это нужно?

DECLARE @abc  int = 1
      , @test int = 3

IF @abc = 1 

   IF @test = 3
   
      SELECT 34

   ELSE 
  
      SELECT 4444

ELSE

   IF @test = 3
   
      SELECT 3

   ELSE 
  
      SELECT 4

Я получаю правильные результаты.

Нам это нужно, потому что теперь вы не знаете, где начинается и заканчивается каждый блок. Код примера несколько тривиален. Что, если один из блоков с отступом содержит два оператора? Всего два SELECT, например SELECT 34; SELECT 42; ? Будут ли они частью одной ветви? Что, если бы в этом случае не было ELSE, чтобы вызвать синтаксическую ошибку?

Panagiotis Kanavos 10.01.2023 19:28

@PanagiotisKanavos Как бы ты это сделал? Ввод Begin и END в каждый блок IF ELSE?

mikey22022 10.01.2023 19:32
BEGIN...END позволяет нескольким утверждениям быть в логическом потоке. Без них только следующий за ним оператор является его частью. Так что, конечно, вы можете опустить это, но если вы хотите много утверждений, у вас будет много IFs...
Larnu 10.01.2023 19:38

Вам нужно begin/end, если у вас более одного оператора в каждой ветви, т.е. блок операторов. Это четко задокументировано To define a statement block, use the control-of-flow keywords BEGIN and END.

Stu 10.01.2023 19:39
IF и условная логика редко нужна в SQL, так что да. В тех немногих случаях, когда мне нужно использовать IF или даже в более редких случаях, когда необходимо WHILE, я использую BEGIN/END даже для отдельных утверждений. В реальном коде это редко однострочные SELECTs, это многострочные запросы, поэтому BEGIN и END помогают очистить код.
Panagiotis Kanavos 10.01.2023 19:40

В чем польза отказа от него? Вам нравится тикать бомбы замедленного действия или вы действительно ненавидите печатать?

Aaron Bertrand 10.01.2023 19:46

"Как бы вы это сделали?" основанный на мнении; не по теме для SO. Некоторые ненавидят многословие, другие будут утверждать, что последовательный стиль кодирования помогает предотвратить катастрофические ошибки. Просто убедитесь, что вы и ваши коллеги согласны на единый стиль кодирования, чтобы предотвратить войны правок.

Ruud Helderman 10.01.2023 19:57
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
2
7
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пример несколько надуманный. Что, если бы каждая ветвь содержала два утверждения, например SELECT 34; SELECT 42;? Или хуже, SELECT 34; DELETE ...; ?

IF @abc = 1 

   IF @test = 3
   
   SELECT 34
   DELETE SomeTable
   WHERE ID>34

   ELSE 
  
   SELECT 4444

ELSE

   IF @test = 3
   
   SELECT 3

   ELSE 
  
   SELECT 4

Компилятор запросов видит это:

IF @abc = 1 
BEGIN
   IF @test = 3
   BEGIN
       SELECT 34
   END
END

DELETE SomeTable
WHERE ID>34

ELSE...

К счастью, ELSE приводит к синтаксической ошибке. Без ELSE оператор DELETE будет выполняться безоговорочно.

В этом случае BEGIN и END необходимы для определения блока:

IF @abc = 1 
BEGIN
   IF @test = 3
   BEGIN
       SELECT 34
       DELETE SomeTable
       WHERE ID>34
   END
END

Но мне не нужны BEGIN и END, если у меня есть только один оператор SELECT в блоке кода?

mikey22022 10.01.2023 21:11

@ mikey22022 mikey22022 Правильно, если у вас есть только один оператор SELECT, он вам технически не нужен. Но все же поставить его надо. Он защищает вас от будущих изменений кода, а также служит для самостоятельного документирования (например, облегчает чтение вашего кода другим).

Aaron Bertrand 10.01.2023 22:13

@AaronBertrand мне это напомнило, когда я однажды добавил PRINT после IF @@TRANCOUNT >0.

Panagiotis Kanavos 11.01.2023 09:36

@PanagiotisKanavos Да, и как бы я ни старался всегда быть хорошим примером, я уверен, что у меня есть несколько ответов, где я сделал то же самое.

Aaron Bertrand 11.01.2023 12:32

Другие вопросы по теме