Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Почему себя так ведет в 2000 MS SQL.
CREATE FUNCTION test1(@x as int,@y as int)
RETURNS int
AS
BEGIN
	RETURN(@x+@y)
END

GO
CREATE FUNCTION test2(@x as int,@y as int)
RETURNS int
AS
BEGIN
	RETURN(@x+@y)
END

GO

Select dbo.test1(x1,1),dbo.test1(x1,2), count(x3) from (
Select 1 as x1,2 as x2 ,3 as x3
UNION
Select 2,3,3
UNION
Select 3,4,5
UNION
Select 1,2,5
) t1
group by dbo.test1(x1,1),dbo.test1(x1,2)
GO

Select dbo.test1(x1,1),dbo.test2(x1,2), count(x3) from (
Select 1 as x1,2 as x2 ,3 as x3
UNION
Select 2,3,3
UNION
Select 3,4,5
UNION
Select 1,2,5
) t1
group by dbo.test1(x1,1),dbo.test2(x1,2)


Если в group by одна и та же фунция 2 раза с разными параметрами, и то в Select 2й вызов фунции заменяется на 1й.

Результаты работы скрипта у меня в MS SQL 2000

2,2,2
3,3,1
4,4,1

(3 row(s) affected)

2,3,2
3,4,1
4,5,1

(3 row(s) affected)
14 окт 15, 10:49    [18276413]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
Glory
Member

Откуда:
Сообщений: 104751
Патчить надо сервера.
Даже такие древние.
14 окт 15, 10:52    [18276429]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Glory,


Microsoft SQL Server 2000 - 8.00.2039

Пакет обновления 4 (SP4) для SQL Server 2000
14 окт 15, 10:55    [18276454]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
Glory
Member

Откуда:
Сообщений: 104751
https://support.microsoft.com/en-us/kb/883415
14 окт 15, 11:04    [18276511]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Glory,

Спасибо. Но у заказчика обновления накатить не получится.

Переделал на предварительный подсчет функции во временную таблицу, а потом join на неё и group by по её полям.
14 окт 15, 11:48    [18276828]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
o-o
Guest
_Groxot_,
там вообще-то предложен workaround:
kb/883415
To work around this problem, in the GROUP BY clause, modify the name of the first parameter for each user-defined function so
that the value of each first parameter remains unchanged, but the name of each first parameter is different.
To modify the name of the first parameter for each user-defined function, use one of the following examples.

If the first parameter is numeric, follow these steps:
Multiply the first parameter of the first user-defined function by 1.
Multiply the first parameter of the second user-defined function by 2, and then divide it by 2.
Continue to modify the first parameter for the remaining user-defined functions in the same way. For example, multiply the first parameter of the third user-defined function by 3.

Select dbo.test1(x1*1,1),dbo.test1(x1/1,2), count(x3) from (
Select 1 as x1,2 as x2 ,3 as x3
UNION
Select 2,3,3
UNION
Select 3,4,5
UNION
Select 1,2,5
) t1
group by dbo.test1(x1*1,1),dbo.test1(x1/1,2)
GO
14 окт 15, 12:03    [18276921]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
o-o,

целочисленное деление. Нехорошо!
14 окт 15, 12:05    [18276930]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
o-o
Guest
iap
o-o,
целочисленное деление. Нехорошо!

_Groxot_
RETURNS int
14 окт 15, 12:10    [18276954]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
o-o
iap
o-o,
целочисленное деление. Нехорошо!

_Groxot_
RETURNS int
Да я так просто... Опять глупость сморозил
14 окт 15, 12:17    [18276998]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
o-o,

Я пробовал вот так

Select dbo.test1(x1,1),dbo.test1(x4,2), count(x3) from(
Select *, x1 as x4 from
 (
Select 1 as x1,2 as x2 ,3 as x3
UNION
Select 2,3,3
UNION
Select 3,4,5
UNION
Select 1,2,5
) t1) t2
group by dbo.test1(x1,1),dbo.test1(x4,2)
GO


Не помогло. А по факту там строка у меня на входе и выходе... Это я пример сваял, чтобы багу показать
14 окт 15, 12:27    [18277061]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
Я в своё время поборолся с этой хренью созданием фэйковой обёртки для функции. Типа (для приведённого примера)
CREATE FUNCTION test1(@x as int,@y as int)
RETURNS int
AS
BEGIN
	RETURN(@x+@y)
END

GO
CREATE FUNCTION test2(@x as int,@y as int)
RETURNS int
AS
BEGIN
	RETURN test1(@x,@y)
END

GO

Вроде работало без косяков.
+
Жаль, в GROUP BY нельзя указывать номера полей выходного набора, как это делается в ORDER BY ...
14 окт 15, 12:32    [18277094]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
o-o
Guest
_Groxot_
А по факту там строка у меня на входе и выходе

kb/883415
If the first parameter is a string, follow these steps:

Concatenate the first parameter of the first user-defined function with an empty string.

An empty string is represented by two single quotation mark characters that have no space between them.
Concatenate the first parameter of the second user-defined function with two empty strings.
Continue to concatenate the first parameters of the remaining user-defined functions in the same way. For example, concatenate the first parameter of the third user-defined function with three empty strings.

CREATE FUNCTION test1s(@x as varchar(100),@y as varchar(100))
RETURNS varchar(200)
AS
BEGIN
	RETURN(@x+@y)
END

GO

Select  dbo.test1s(''+x1,1),dbo.test1s(''+''+x1,2), count(x3) from (
Select 1 as x1,2 as x2 ,3 as x3
UNION
Select '2','3','3'
UNION
Select '3','4','5'
UNION
Select '1','2','5'
) t1
group by dbo.test1s(''+x1,1),dbo.test1s(''+''+x1,2)
GO
14 окт 15, 12:46    [18277178]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Akina,

Полодить такие функции не лучший выход, но выход.
14 окт 15, 13:09    [18277326]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
o-o,

Спасибо, помогло.
Но временная таблица оказалась быстрее.
Причем намного.
14 окт 15, 13:10    [18277332]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
_Groxot_, всяко бывает. В моём случае так было проще.
14 окт 15, 13:21    [18277426]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
o-o
Guest
_Groxot_
Microsoft SQL Server 2000 - 8.00.2039
Пакет обновления 4 (SP4) для SQL Server 2000

меня пробрало сомнение по поводу SP4,
ведь он обязан включать тот фикс,
приводящий в порядок бардак с ф-циями.
теперь в моем парке один из 2000-ых обновлен до 8.00.2039.
на первом скрине можете заметить, как ему *не полегчало*.
тогда возвращаемся к описанию фикса и видим:
kb/883415
Important To resolve this problem, you must install this hotfix and turn on trace flag 9056.
You can turn on trace flag 9056 by adding -T9056 to the SQL Server command line or
by using DBCC TRACEON(9056, -1) from a query connection.

на втором скрине флаг выставлен и бардака нет.

К сообщению приложен файл. Размер - 110Kb
16 окт 15, 11:57    [18286953]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
o-o,

теперь я знаю эксперта по SQL2000, вооружённого этим сервером!
Это неплохо. :))
16 окт 15, 12:05    [18287016]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
Jaffar
Member

Откуда:
Сообщений: 633
iap,

а никому в голову не пришло обернуть ЭТО в подзапрос ?
16 окт 15, 12:51    [18287302]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Jaffar
iap,

а никому в голову не пришло обернуть ЭТО в подзапрос ?
Что "ЭТО"?
Я только про установленный кое у кого 2000-й сервер высказался.
Иногда возникают вопросы именно по нему, да ни у кого уже нет.
16 окт 15, 12:54    [18287321]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2000 group by function  [new]
o-o
Guest
только он не совсем у меня, *у них*.
мне некуда такое ставить.
зато один остался непатченным, 8.0.760, а второй теперь 8.00.2039.
обращайтесь
16 окт 15, 13:02    [18287373]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить