Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
написал процедуру, часть кода вот:
	If object_id('tempdb..#PPM', 'U') is not null Drop Table #PPM
	if @ManagersId =0
         	Select * Into #PPM From inPartPerMonth 
        else 
         	Select * Into #PPM From inPartPerMonth  Where id=@ManagersId

Не работает. Орет, что уже есть такая таблица. Неужели он конструкцию if-else не понимает? к 2000 версии...
Пришлось сразу вставлять, а уже в условии удалять лишнее...
5 окт 05, 09:30    [1938681]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
Grigoriy
написал процедуру, часть кода вот:
	If object_id('tempdb..#PPM', 'U') is not null Drop Table #PPM
	if @ManagersId =0
         	Select * Into #PPM From inPartPerMonth 
        else 
         	Select * Into #PPM From inPartPerMonth  Where id=@ManagersId

Не работает. Орет, что уже есть такая таблица. Неужели он конструкцию if-else не понимает? к 2000 версии...
Пришлось сразу вставлять, а уже в условии удалять лишнее...

Это ни в каком языке сделать нельзя.

Конструкция Select * Into #PPM примерно соответствует декларации переменной, и никаким if нельзя сделать переменную с одним именем и разными типами.

Пишите, например, так:
	

Select * Into #PPM From inPartPerMonth where 1=0

if @ManagersId =0
         	insert #PPM Select * From inPartPerMonth 
        else 
         	insert #PPM Select * From inPartPerMonth  Where id=@ManagersId
5 окт 05, 09:41    [1938709]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Понятно что есть разные пути обхода.
Но сам факт, что конструкция if не рассматривается как ветвение...
5 окт 05, 09:55    [1938756]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
Grigoriy
Но сам факт, что конструкция if не рассматривается как ветвение...
Ещё раз, если вы не прочитали - так нельзя делать ни в одном языке. Это нормально, странно, если-бы работало.
5 окт 05, 09:57    [1938766]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Grigoriy
Понятно что есть разные пути обхода.
Но сам факт, что конструкция if не рассматривается как ветвение...
if рассматривается как ветвление, но нельзя два раза объявлять один и тоже объект.
5 окт 05, 09:57    [1938767]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Grigoriy
Но сам факт, что конструкция if не рассматривается как ветвение...


На этапе построения плана выполнения оптимизатор проходит все ветки условия. Это есть факт.
5 окт 05, 09:58    [1938773]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Не скажу насчет всех языков, я пишу на паскале и объявляю все в начале.
Но проверить на С попробую.
Формальных запретов на данную конструкцию нет. Выполнится либо та, либо эта часть, обе - никогда.
5 окт 05, 10:04    [1938807]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Grigoriy
Не скажу насчет всех языков, я пишу на паскале и объявляю все в начале.
Но проверить на С попробую.
Формальных запретов на данную конструкцию нет. Выполнится либо та, либо эта часть, обе - никогда.

В Дельфи:
function iif(exp:boolean;a,b real) : real;
begin if exp then Result:=a else Result:=b end;

вызов функции
var c : real; c:=iif(true,10*2,10/2);
5 окт 05, 10:09    [1938837]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Grigoriy
Не скажу насчет всех языков, я пишу на паскале и объявляю все в начале.
Но проверить на С попробую.
Формальных запретов на данную конструкцию нет. Выполнится либо та, либо эта часть, обе - никогда.

В Дельфи:
function iif(exp:boolean;a,b real) : real;
begin if exp then Result:=a else Result:=b end;

вызов функции
var c : real; c:=iif(true,10*2,10/2);

работает так: сначала вычиляется 10*2, потом 10/2, а уж потом в функции выбирается одно из значений, а не так, что в зависимости от логического выражения производится только одно из вычислений.
5 окт 05, 10:12    [1938854]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
KGP
Member

Откуда: Москва
Сообщений: 4554
alexeyvg
Grigoriy
Но сам факт, что конструкция if не рассматривается как ветвение...
Ещё раз, если вы не прочитали - так нельзя делать ни в одном языке. Это нормально, странно, если-бы работало.


это вы о каких языках? PL\SQL, T\SQL ... или о C++ тоже такое заявили
5 окт 05, 10:14    [1938861]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Вот дела! Я не знал, что уже можно в паскале так наглеть! :)
5 окт 05, 10:17    [1938874]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Declare @ManagersId int
set @ManagersId =3
If object_id('tempdb..#PPM', 'U') is not null Drop Table #PPM
if @ManagersId =3
				begin
          Select * Into #PPM From inPartPerMonth 
					Select '1'
				end else 
				begin
--         Select * Into #PPM From inPartPerMonth Where Code=@ManagersId
					Select '1'
				end
Коментарю Select Into в разных местах и вижу совершенно разные планы выполнения...
5 окт 05, 10:33    [1938953]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Grigoriy
Коментарю Select Into в разных местах и вижу совершенно разные планы выполнения...


И чего Вы хотите добиться?!
5 окт 05, 10:36    [1938968]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Я?
Подтверждения вот этого:
автор
На этапе построения плана выполнения оптимизатор проходит все ветки условия. Это есть факт.
5 окт 05, 10:39    [1938980]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Glory
Member

Откуда:
Сообщений: 104760
If object_id('tempdb..#PPM', 'U') is not null Drop Table #PPM
        	Select * Into #PPM From inPartPerMonth  Where id=ISNULL(NULLIF(@ManagersId, 0), id)
или

If object_id('tempdb..#PPM', 'U') is not null Drop Table #PPM
Select * Into #PPM From inPartPerMonth where 1=0

if @ManagersId =0
         	insert Into #PPM Select * From inPartPerMonth 
else 
         	insert Into #PPM Select * From inPartPerMonth  Where id=@ManagersId
5 окт 05, 10:40    [1938987]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Alx$
Guest
автор
Это ни в каком языке сделать нельзя.
.....
и никаким if нельзя сделать переменную с одним именем и разными типами.
Да неужели?! ;-)
вот для всех C это - обычное дело, чем и козыряют Си-шники: "упрощает написание кода", понимаете-ли; а на самом-деле является источником массы ошибок :-p
Вот и FORTRAN, PL(не cql), я помню, позволяет -- только срабатывает "неявное преобразование типов" в результате разработчика иногда ожидают сюрпризы LOL
5 окт 05, 10:41    [1938992]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Glory
Member

Откуда:
Сообщений: 104760
Grigoriy
Я?
Подтверждения вот этого:
автор
На этапе построения плана выполнения оптимизатор проходит все ветки условия. Это есть факт.

Честное пионерское, что это так и есть :)

ЗЫ
Нажмите в QA кнопку Parse Query что и является компиляцией скрипта
5 окт 05, 10:42    [1938997]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
KGP
alexeyvg
Grigoriy
Но сам факт, что конструкция if не рассматривается как ветвение...
Ещё раз, если вы не прочитали - так нельзя делать ни в одном языке. Это нормально, странно, если-бы работало.


это вы о каких языках? PL\SQL, T\SQL ... или о C++ тоже такое заявили
Про PL\SQL не знаю, а в C++ нельзя.

Собственно, в большинстве языков вообще переменная, объявленная внутри if, там и останется - не будет видна снаружи, так что напрямую вообще сравнивать нельзя.

В T-SQL ситуация немножко запутаннее.

В этом коде внутри процедуры будет видна внутренняя таблица, так-что по видимости процедуру можно считать аналогом блока {} в С++. Внутри процедуры во время выполнения в tempdb будут существовать 2 таблицы #ttt:
select top 1 *, 0 as [новое поле] into #ttt from sysobjects
go
create proc aaa
as
select top 1 * into #ttt from sysobjects

select * from #ttt
select * from tempdb..sysobjects where name like '#ttt%'
exec('
update #ttt
set [новое поле] = 1
')
go

exec aaa
select * from #ttt

go
drop proc aaa
drop table #ttt

Результат:
id          
----------- 
1

name
---------------------------------------------
#ttt____________________________________0000000028A6
#ttt____________________________________0001000028A6

Server: Msg 207, Level 16, State 1, Line 2
Invalid column name 'новое поле'.
id          новое поле  
----------- ----------- 
1           0
5 окт 05, 10:43    [1939004]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31606
Alx$
автор
Это ни в каком языке сделать нельзя.
.....
и никаким if нельзя сделать переменную с одним именем и разными типами.
Да неужели?! ;-)
вот для всех C это - обычное дело, чем и козыряют Си-шники: "упрощает написание кода", понимаете-ли; а на самом-деле является источником массы ошибок :-p
Продемонстрируйте, пожалуйста, а то 10 лет на С программировал, а такое не знаю.
5 окт 05, 10:46    [1939017]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Glory
Member

Откуда:
Сообщений: 104760
Может быть оставим особенности других языков программирования в стороне ?
5 окт 05, 10:49    [1939033]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Glory
Grigoriy
Я?
Подтверждения вот этого:
автор
На этапе построения плана выполнения оптимизатор проходит все ветки условия. Это есть факт.

Честное пионерское, что это так и есть :)

ЗЫ
Нажмите в QA кнопку Parse Query что и является компиляцией скрипта


Ctrl-F5 сойдет?
5 окт 05, 11:57    [1939632]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Глори, я понимаю, ты предложил разъединить создание и заполнение таблицы и тем самым избежать ошибки.
Просто, глядя на код, человек понимает, что выполнится ТОЛЬКО одна ветка и ошибки не будет(ошибкой если считать двойное создание таблицы)
А компилятор этого не понимает, хотя и есть тут попытки оправдать его...
5 окт 05, 12:00    [1939667]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Glory
Member

Откуда:
Сообщений: 104760
Просто, глядя на код, человек понимает, что выполнится ТОЛЬКО одна ветка и ошибки не будет(ошибкой если считать двойное создание таблицы)
На SQLServer-е выполнение всегда состоит из двух шагов - компиляция и собственно выполнение.
Если не проходит первый шаг, то второй шаг не наступит никогда.
На этапе же компиляции все ветвления являются для компилятора _равновероятными_.
5 окт 05, 12:06    [1939716]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
равновероятность и взаимоисключаемость не являются несовместимыми понятиями. Видимо понимание этого в компилятор и не внесли...
5 окт 05, 13:11    [1940171]     Ответить | Цитировать Сообщить модератору
 Re: Непонимание Сервером конструкции if else  [new]
Glory
Member

Откуда:
Сообщений: 104760
Grigoriy
равновероятность и взаимоисключаемость не являются несовместимыми понятиями. Видимо понимание этого в компилятор и не внесли...

Еще раз - при компиляции НЕВОЗМОЖНО узнать какой из ваших if-ов будет выполняться. Потому что для этого нужно знать как будет _вычислено_ выражение @ManagersId =0.
5 окт 05, 13:14    [1940186]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить