Поток управления в T-SQL SP с использованием IF..ELSE IF - есть ли другие способы? - PullRequest
37 голосов
/ 13 октября 2009

Мне нужно разделить поток управления хранимой процедурой 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.

Ответы [ 6 ]

36 голосов
/ 13 октября 2009

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

16 голосов
/ 02 мая 2013

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

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   
11 голосов
/ 13 октября 2009

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

2 голосов
/ 13 октября 2009

Это примерно предел для управляющих структур в T-SQL вместе с GOTO и WHILE .

1 голос
/ 13 октября 2009

Нет, ЕСЛИ это путь, в чем проблема с его использованием?

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

0 голосов
/ 13 октября 2009
CASE expression
      WHEN value1 THEN result1
      WHEN value2 THEN result2
      ...
      WHEN valueN THEN resultN

      [
        ELSE elseResult
      ]
END

http://www.4guysfromrolla.com/webtech/102704-1.shtml Для получения дополнительной информации.

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