SQL — Как вызвать часть запроса условно

#sql #sql-server

#sql #sql-сервер

Вопрос:

Мне нужно написать SQL-запрос, подобный этому:

выполните шаг 1

выполните шаг 2

выполните шаг 3 — на этом шаге выполняется много операций: определение переменных, использование некоторых переменных, определенных на шаге 1, запрос большого количества данных во временную таблицу…

 if(cond1)

   if(cond2)        
 
       Begin            
          do step 4             
          call step 3 here      
       End  
    else
    
      Begin             
           do step 5        
      End  
  else  
 
  Begin         
     call step 3 here   
  End
  

Как сделать шаг 3 повторно используемым запросом, чтобы избежать ненужного вызова шага 3? обратите внимание, что шаг 3 должен быть частью всего запроса

Когда я пытаюсь создать @step3Query NVARCHAR(MAX), УСТАНОВИТЕ @step3Query = ‘…’ Затем вызовите этот запрос в соответствующих местах с помощью вызова «EXEC sp_executesql @step3Query». Но я получил много ошибок, и я не уверен, что это правильный способ выполнить такую задачу. Любые предложения будут высоко оценены.

Ответ №1:

Вот один из методов, который может сработать (в зависимости от ваших конкретных обстоятельств). Главное для этого, чтобы это было легко, а также легко читалось.

У вас может быть 3 переменные для использования в качестве флагов, например, @Query3_Flag, @Query4_flag, @Query5_flag.

Ваши условные проверки просто устанавливают эти флаги, например,

 IF (condition1)
    BEGIN
    SET @Query4_Flag = 1;
    SET @Query3_flag = 1;
    SET @Query5_flag = 0;
    END
  

Перед каждым из запросов 3, 4 и 5 оператор IF проверяет флаг и выполняет запрос только в том случае, если флаг установлен на 1, например,

 IF @Query3_Flag = 1 
    BEGIN
    (run Query 3)
    END
  

Обратите внимание, что запросы должны быть в правильном порядке.

Комментарии:

1. Спасибо Seanb за ваш ответ, но дело в том, что подзапрос (шаг 3) использует некоторые переменные, определенные в step1 и step2. Он также определяет некоторые другие переменные, которые будут использоваться позже на шаге 4 и так далее .. Когда я таким образом определяю @step3Query NVARCHAR(MAX), я получил ошибки типа «Необходимо объявить скалярную переменную …»

2. Извините, я предлагал поместить весь SQL в один большой скрипт, а не вызывать его в другом месте (а не вызывать извне). Обратите внимание, что если вы используете динамический SQL, вам нужно быть очень осторожным при обращении к переменным — ваша проблема будет заключаться не в последовательности, а в том, как правильно выполнить код — найдите здесь в SO ответы, относящиеся к переменным и динамическому SQL.

3. После нескольких часов борьбы с этим я обнаружил, что ваш ответ правильный. У нас также есть альтернативный способ сделать это с помощью ключевого слова GOTO . Большое вам спасибо за вашу помощь. Я отмечаю ваш ответ, а также разъясняю, как использовать ключевое слово GOTO, как я только что упомянул в обновленном сеансе, поскольку я не могу форматировать код здесь, в этом комментарии