Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
_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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Патчить надо сервера. Даже такие древние. |
14 окт 15, 10:52 [18276429] Ответить | Цитировать Сообщить модератору |
_Groxot_ Member Откуда: Оттуда Сообщений: 481 |
Glory, Microsoft SQL Server 2000 - 8.00.2039 Пакет обновления 4 (SP4) для SQL Server 2000 |
14 окт 15, 10:55 [18276454] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
https://support.microsoft.com/en-us/kb/883415 |
14 окт 15, 11:04 [18276511] Ответить | Цитировать Сообщить модератору |
_Groxot_ Member Откуда: Оттуда Сообщений: 481 |
Glory, Спасибо. Но у заказчика обновления накатить не получится. Переделал на предварительный подсчет функции во временную таблицу, а потом join на неё и group by по её полям. |
14 окт 15, 11:48 [18276828] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
_Groxot_, там вообще-то предложен workaround:
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
o-o, целочисленное деление. Нехорошо! |
14 окт 15, 12:05 [18276930] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
|
||||
14 окт 15, 12:10 [18276954] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
![]() |
||||||
14 окт 15, 12:17 [18276998] Ответить | Цитировать Сообщить модератору |
_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] Ответить | Цитировать Сообщить модератору |
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 Вроде работало без косяков.
|
|
14 окт 15, 12:32 [18277094] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
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] Ответить | Цитировать Сообщить модератору |
_Groxot_ Member Откуда: Оттуда Сообщений: 481 |
Akina, Полодить такие функции не лучший выход, но выход. |
14 окт 15, 13:09 [18277326] Ответить | Цитировать Сообщить модератору |
_Groxot_ Member Откуда: Оттуда Сообщений: 481 |
o-o, Спасибо, помогло. Но временная таблица оказалась быстрее. Причем намного. |
14 окт 15, 13:10 [18277332] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20974 |
_Groxot_, всяко бывает. В моём случае так было проще. |
14 окт 15, 13:21 [18277426] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
меня пробрало сомнение по поводу SP4, ведь он обязан включать тот фикс, приводящий в порядок бардак с ф-циями. теперь в моем парке один из 2000-ых обновлен до 8.00.2039. на первом скрине можете заметить, как ему *не полегчало*. тогда возвращаемся к описанию фикса и видим:
на втором скрине флаг выставлен и бардака нет. К сообщению приложен файл. Размер - 110Kb |
||||
16 окт 15, 11:57 [18286953] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
o-o, теперь я знаю эксперта по SQL2000, вооружённого этим сервером! Это неплохо. :)) |
16 окт 15, 12:05 [18287016] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
iap, а никому в голову не пришло обернуть ЭТО в подзапрос ? |
16 окт 15, 12:51 [18287302] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Я только про установленный кое у кого 2000-й сервер высказался. Иногда возникают вопросы именно по нему, да ни у кого уже нет. |
||
16 окт 15, 12:54 [18287321] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
только он не совсем у меня, *у них*. мне некуда такое ставить. зато один остался непатченным, 8.0.760, а второй теперь 8.00.2039. обращайтесь ![]() |
16 окт 15, 13:02 [18287373] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |