Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQLServer2000! Unexpected query result/bug(?): function/subquery/having  [new]
san_d
Member

Откуда: Киев
Сообщений: 60
Привет,
получаю странный результат выборки на SQLServer 2000-8.00.2050. На SQLServer 2016 все работает как и ожидается, на других версиях нет возможности проверить.
Код:
    create function _tmp_test(@par int)
    returns char(1)
    as
    begin
    	return 'Z'
    end
    
    go
    
    if object_id('tempdb..#tmp1') is not null drop table #tmp1
    if object_id('tempdb..#tmp2') is not null drop table #tmp2
    
    create table #tmp1
    (
    	lineid		int			not null,
    	docid		char(9)			not null,
    	doctype		int			not null,
    	prop1_id	char(9)			not null,
    	value		int			not null
    
    	primary key(lineid)
    )
    
    create table #tmp2
    (
    	propid		char(9)		not null,
    	prop_1		char(1)		not null
    
    	primary key(propid)
    )
    
    
    insert into #tmp1 values(1,'A',1157,'prop_id1',39500)
    insert into #tmp1 values(2,'A',1157,'prop_id2',7500)
    
    insert into #tmp2 values('prop_id1','A')
    insert into #tmp2 values('prop_id2','B')
    
    
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = dbo._tmp_test(tmp1.doctype) +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc
    having
    	Sum(value)<>0
    
    go

    drop function _tmp_test


результат:
prop1_iddocvalue
AZA39500
BZA39500
AZA7500
BZA7500

картинка

Если убрать функцию или having, результат тот, что и ожидается. То есть:
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = dbo._tmp_test(tmp1.doctype) +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc

или
    select
    	prop1_id
    	,doc
    	,Sum(value) value
    from
    	(
    	select
    		prop1_id = tmp2.prop_1,
    		doc 	 = /*dbo._tmp_test(tmp1.doctype)*/ 'Z' +  tmp1.docid,
    		value 	 = tmp1.value
    	from
    		#tmp1 tmp1
    	left join
    		#tmp2 tmp2 on tmp2.propid = tmp1.prop1_id
    	)vt
    group by
    	prop1_id
    	,doc
    having
    	Sum(value)<>0

выдает то, что ожидается:
prop1_iddocvalue
AZA39500
BZA7500

В чем проблема с первым запросом, есть у кого-то идеи?
8 май 17, 03:05    [20464711]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer2000! Unexpected query result/bug(?): function/subquery/having  [new]
Aleksey br
Member

Откуда:
Сообщений: 73
А разве в функции можно использовать INSERT?
8 май 17, 06:34    [20464739]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer2000! Unexpected query result/bug(?): function/subquery/having  [new]
o-o
Guest
был такой баг в 2000-ом, надо выставить TF 9056
ссылку на тему дам MS SQL 2000 group by function
но само kb уже истребили
8 май 17, 09:26    [20464786]     Ответить | Цитировать Сообщить модератору
 Re: SQLServer2000! Unexpected query result/bug(?): function/subquery/having  [new]
san_d
Member

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

спасибо! workaround помог
doc 	 = dbo._tmp_test(tmp1.doctype+'') +  tmp1.docid,
8 май 17, 11:12    [20464879]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить