Управляющий поток в 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
.
Ответы
Ответ 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 вызывать в соответствующее время.
Ответ 4
Что касается ограничения для структур управления в T-SQL, а также GOTO и WHILE.
Ответ 5
Nope IF - это путь, в чем проблема с его использованием?
Кстати, ваш пример никогда не попадет в третий блок кода, а второй - в точности одинаковый.
Ответ 6
Мой ответ здесь - другой вопрос:
Очевидно, что в SQL Server 2014 (и других версиях) вы не можете определить или объявить CTE в других блоках кода оператора, потому что по определению блоки WITH ДОЛЖНЫ следовать за точкой с запятой, которая завершает ЛЮБЫЕ предыдущие операторы, включая блоки кода IF и CASE BEGIN/END.
Итак, мой вопрос заключается в следующем: если мы хотим избежать накладных расходов на выполнение запроса для выполнения логики управления потоком данных, учитывая необходимость или желание использовать CTE, как это можно сделать?
Ответ 7
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 Дополнительные сведения.