#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, как я только что упомянул в обновленном сеансе, поскольку я не могу форматировать код здесь, в этом комментарии