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

277
49

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

спросил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
1
Решение
267

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

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
182

Также вы можете попытаться сформулировать свой ответ в форме инструкции 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

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
156

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

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
76

Что касается ограничения для структур управления в T-SQL, а также GOTO и WHILE.

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
63

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


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

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
45

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

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

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

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
-5

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 Дополнительные сведения.

ответил(а) 2021-01-25T17:35:06+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема