SQL2000 ГЫГЫГЫ ;))) ГЛЮК !!! с функциями...

Nick
Дата: 12.03.2001 21:45:15
Доброго времени суток...

Вот дурость... наткнулся на замечательную фичу ))
1. Есть UDF которая возвращает значения типа float или int
и имеет несколько входных параметров любого типа, назавем ее
func1( @P1 int, @P2 int, @P3 int ), выходное значение зависит от всех параметров !!!

2. Есть табличка TAB1 с полями ( Col1 int, Col2 int )

делаем запрос:

select dbo..func1( Col1, Col2, 1 ) as FuncPar1,
dbo..func1( Col1, Col2, 2 ) as FuncPar2
from TAB1

все нормально, выдается два столбца, с разными значениями
( поскольку третий параметр разный )...

делаем запрос:
select sum( dbo..func1( Col1, Col2, 1 ) ) as FuncPar1,
sum( dbo..func1( Col1, Col2, 2 ) ) as FuncPar2

8( ) !!! Получаем в два одинаковых столбца ;(
со значением первого столбца !!!

делаем:

select sum( dbo..func1( Col1, Col2, 1 ) ) as FuncPar1,
sum( dbo..func1( Col1, Col2, 2 ) ) as FuncPar2
group by Col1, Col2

получаем два полностью идентичных столбца

добавляем Col3 к таблице, и делаем:

select sum( dbo..func1( Col1, Col2, Col3 ) ) as FuncPar1,
sum( dbo..func1( Col1, Col2, Col3 ) ) as FuncPar2
group by Col1, Col2, Col3

Те же ГРАБЛИ !!!

Во второй столбец, если есть агрегаты, всегда попадпю значения из первого !!!!

)) выход один, кидать все в # или в переменную, а потом делать агрегирование !!!

Вот такие пираги... млин.... ;(

С уважением Прайс Николай.
SergSuper
Дата: 13.03.2001 10:51:11
Да действительно, такая же фигня
пример чтобы проще было убедиться:
alter function f(@i1 int, @i2 int, @i3 int)
returns int
as
begin
declare @s int
set @s=@i1%100+@i2+@i3
return @s
end
go
select sum(dbo.f(id,info,1)), sum(dbo.f(id,info,2)) from sysobjects

select sum(dbo.f(id,info,1)) from sysobjects
select sum(dbo.f(id,info,2)) from sysobjects


спасает только
select sum(dbo.f(id,info,1)), sum(dbo.f(id,info,2)+0) from sysobjects

Видать что-то связано с оптимизацией, не хочет он второй раз выполнять функцию.
Ну нам не привыкать, будем ждать сервиспаков
Дед Маздай
Дата: 13.03.2001 21:55:36
Нет, до оптимизации здесь дело, похоже, не доходит. Посмотри аргумент оператора stream aggregate в плане, ты увидишь, что второй sum там вообще не валялся. Как следствие, те же яйца и на других агрегатных ф-циях.
Я думаю, что это не фича, а баг, и он будет исправлен в SP1. Мне кажется, что те, у кого с MS заключен контракт на premier support, могут получить hotfix немедленно (s80251i.exe). Возможно также, что в ближайшее время в Knowledge Base появится статья Q288957, в к-й может быть указано, где его взять по ftp.