Подтвердить что ты не робот

Управляющий поток в T-SQL SP с использованием IF..ELSE IF - существуют ли другие способы?

Мне нужно передать поток управления хранимой процедурой T-SQL (MS SQL 2008) на несколько направлений:

CREATE PROCEDURE [fooBar]
   @inputParam INT
AS
BEGIN
  IF @inputParam = 1
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
  ELSE IF @inputParam = 3
  BEGIN
    ...
  END
END

Есть ли другие способы? Например, в C# я использую блок switch-case.

4b9b3361

Ответ 1

IF... ELSE... это то, что у нас есть в T-SQL. Нет ничего похожего на структурированный оператор CASE. Если у вас есть расширенный набор... ELSE IF... s, чтобы иметь дело с этим, обязательно включите BEGIN... END для каждого блока, чтобы все было ясно, и всегда помните, что последовательный отступ - ваш друг!

Ответ 2

Также вы можете попытаться сформулировать свой ответ в форме инструкции SELECT CASE. Затем вы можете создать простой, если затем использовать ваши результаты, если это необходимо, поскольку вы сузили возможности.

SELECT @Result =   
CASE @inputParam   
WHEN 1 THEN 1   
WHEN 2 THEN 2   
WHEN 3 THEN 1   
ELSE 4   
END  

IF @Result = 1   
BEGIN  
...  
END  

IF @Result = 2   
BEGIN   
....  
END  

IF @Result = 4   
BEGIN   
//Error handling code   
END   

Ответ 3

Нет, но вы должны быть осторожны при использовании IF... ELSE... END IF в хранимых процедурах. Если ваши кодовые блоки радикально различаются, вы можете испытывать плохую производительность, потому что каждый раз необходимо повторно кэшировать план процедуры. Если это высокопроизводительная система, вы можете захотеть скомпилировать отдельные хранимые procs для каждого блока кода и попросите ваше приложение решить, какой proc вызывать в соответствующее время.

Ответ 5

Nope IF - это путь, в чем проблема с его использованием?

Кстати, ваш пример никогда не попадет в третий блок кода, а второй - в точности одинаковый.

Ответ 6

Мой ответ здесь - другой вопрос:

Очевидно, что в SQL Server 2014 (и других версиях) вы не можете определить или объявить CTE в других блоках кода оператора, потому что по определению блоки WITH ДОЛЖНЫ следовать за точкой с запятой, которая завершает ЛЮБЫЕ предыдущие операторы, включая блоки кода IF и CASE BEGIN/END.

Итак, мой вопрос заключается в следующем: если мы хотим избежать накладных расходов на выполнение запроса для выполнения логики управления потоком данных, учитывая необходимость или желание использовать CTE, как это можно сделать?