Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
_Промешан_ Member Откуда: Сообщений: 970 |
В процедуре несколько if, но без else. Идут подряд. if @flag = 1 begin end; if @flag = 2 begin end; if @flag = 3 begin end; Как в этом случае ведет себя компилятор: а) если указывать в каждом блоке return б) если не указывать. |
28 фев 18, 17:58 [21225931] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
_Промешан_, скомпилирует как все посмотреть вам было быстрее чем писать... |
28 фев 18, 18:05 [21225969] Ответить | Цитировать Сообщить модератору |
если указывать в каждом
Guest |
_Промешан_,
Срывается в Геленджик на попутках. Взаимоисключащие IFы без ELSE - выстрел и себе в ногу и в мозг компилятора. Потом сиди, разбирай, могут ли эти блоки вызываться после предыдущих. Если где-то что-то указывать, то скомпилируется с указанием указанного. Если не указывать что-то - оно не попадет в скомпилированный результат, потому как не существует. В поисках мистической оптимизации можно подумать на предмет, под какой же @flag компилятор сделает план. Во время компиляции переменная какое значение имеет? А во время выполнения? |
||
28 фев 18, 18:37 [21226052] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
если указывать в каждом, не ясно что за бред вы пишете, но в кеше планов будет даже кусок if 1 = 3 begin SELECT top 1 * FROM master..spt_values RETURN end; |
28 фев 18, 18:39 [21226061] Ответить | Цитировать Сообщить модератору |
если указывать в каждом
Guest |
Я вот тоже не понял, к кому обращен этот поток сознания. Не понял что написано - с чем споришь, а? |
||
28 фев 18, 18:41 [21226066] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 970 |
Компилятор просто скомпилирует как есть. А вот план будет построен для того флага, с которым будет первый вызов процедуры. Собственно при компиляции будет неявный выход после попадания в любой удовлетворяющий if или цикл проверки закончится последним if? |
1 мар 18, 00:14 [21226716] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 970 |
Проще говоря, строит ли компилятор дерево вызовов опираясь на управляющие if и делает ли лишние итерации проверки или нет. По сути в этом вопрос. Не совсем это про план выполнения. Хотя касается его. |
1 мар 18, 00:17 [21226722] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 970 |
Что я имею в виду - компилятор мог бы выстроить как именно проходить по блокам и что делать после. Вот было бы после всех if чтонибудь вроде return. И в этом случае в дереве вызовов (инструкциях) могло бы быть следующее: вот в этот блок заходим, потом столько то блоков (if) пропускаем и вызываем вот этот, где return стоит. |
1 мар 18, 00:19 [21226729] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
_Промешан_ , У вас праздный вопрос, или есть проблемы какие-то? |
1 мар 18, 01:02 [21226778] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
это будет актуальный план |
||
1 мар 18, 10:43 [21227429] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 970 |
Ну как праздный. Не совсем. Нужно для себя понять в каких случаях и главное ПОЧЕМУ стоит или не стоит писать return. Почему например нельзя в каждом блоке if писать return? if a=1 begin ... return 0; end if a=2 begin ... return 0; end if a=3 begin ... return 0; end if a=4 begin ... return 0; end Например так. Мы то обычно не пишем. Но тут возник некий вопрос а что случится нехорошего если писать ретурн всегда. (а - не меняется внутри if). |
||
12 мар 18, 17:49 [21250648] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
_Промешан_, Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится. |
12 мар 18, 18:33 [21250798] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
+1 проще поддерживать, когда у хранимки одна точка выхода |
||
12 мар 18, 18:41 [21250818] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
create InternalProc0 as ... go create InternalProc1 as ... go ... create InternalProcN as ... go create SomeProc as begin ... declare @result int, @proc = N'InternalProc' + cast(@SomeVariable as nvarchar(10)); if object_id(@proc, 'P') is null begin raiserror ... return ... end; exec @result = @proc ... return @result; end; |
||
12 мар 18, 20:01 [21250960] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
declare @a int; set @a=99999; if @a=1 begin ... end else if @a=2 begin ... end else if @a=3 begin ... end else begin ... end; |
13 мар 18, 14:53 [21252888] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |