powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Arithmetic overflow error converting expression to data type int
4 сообщений из 4, страница 1 из 1
Arithmetic overflow error converting expression to data type int
    #36067867
kii23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень не понятная ситуация: Reporting Services. Есть отчёт, основанный на хранимой процедуре (так же пробовал и view) в SQL Management Studio они (SP, view) выполняются без проблем и ошибок при любых условиях фильтрации. При попытке выполнения этой процедуры в отчёте (при разработке или опубликованного) при определённых входных параметрах процедуры (диапазон дат 01.07.2009 - 01.07.2009) результирующий набор не возвращается, а вываливается сообщение об ошибке:
Код: plaintext
1.
An error occurred while reading data from the query result set.
Arithmetic overflow error converting expression to data type int.

Самое обидное, что в результирующем наборе вообще нет целочисленных параметров - все float. Для пущей уверенности во всех выражениях, вычисляющих результирующие поля, поставил явные преобразования всех "членов" к float.

Если этот же SQL текст оформить в виде view, в котором отсутствует предложение where, и из отчёта выполнять SELECT * FROM my_view, то все данные возвращаются без ошибок (в т.ч. и на 01.07.2009), стоит где нибуть (в отпределении view или в отчёте) добавить условие WHERE, выбирающее конкретную дату (01.07.2009) - отчёт падает с той же ошибкой (за другие даты не падает, иходные данные за этот день ничем принципиальным от других не отличаются, профайлером ничего не вылавливается - он считает, что запрос выполнен успешно).

Если у кого есть какие идеи в чём тут может быть проблема и как её разрешить - помогите, плиз. Очень надо.
...
Рейтинг: 0 / 0
Arithmetic overflow error converting expression to data type int
    #36068531
buven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведите запрос полностью.

Проводить жизнь в ожидании мессии, который придёт и спасёт мир, всё-равно, что ждать палку в тетрисе.
Даже если и появится, то ты к тому времени наберёшь такую гору дерьма, что те будет уже абсолютно пох... :)
...
Рейтинг: 0 / 0
Arithmetic overflow error converting expression to data type int
    #36068802
kii23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне не жалко привести реальный запрос, только это не очень удобно - он достаточно большой и описание исходных таблиц ещё нужны... Врят ли кому будет охота с ним разбираться. Важно (на мой взгляд) то, что в SQL студии он выполняется всегда, в отчёте при отсутствии условий отбора выполняется и отображает все данные, а в отчёте при наличии условия y=2009 and m=7 падает по ошибке (при других условиях выполняется нормально).

Вот "верхушка айсберга":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
select tt.*,
	--Общий эфект по мощности от СДЭМ
	isnull(sdem_power_sell_eff_cost,  0 ) + isnull(sdem_power_buy_eff_cost,  0 ) - exchange_fee_cost as sdem_power_eff_cost,
	isnull(sdem_power_sell_eff_cost_mod,  0 ) + isnull(sdem_power_buy_eff_cost_mod,  0 ) - exchange_fee_cost as sdem_power_eff_cost_mod,
	isnull(sdem_power_sell_vol,  0 )-isnull(sdem_power_buy_vol,  0 ) as sd_power_vol,
	isnull(sdem_power_sell_cost,  0 )-isnull(sdem_power_buy_cost,  0 ) as sd_power_cost,
	isnull(sdem_power_sell_cost_mod,  0 )-isnull(sdem_power_buy_cost_mod,  0 ) as sd_power_cost_mod,
	(isnull(sdem_power_sell_vol,  0 )-isnull(sdem_power_buy_vol,  0 ))*Tm*k_season	as cost_for_TmKsz
from
	(select t.*,
		--Эфект от продажи по СДЭМ
		sdem_power_sell_vol+sdem_execess_zsp_sell_kom_vol-buy_kom_gen_vol as direct_sdem_sell_deals_vol,
		sdem_power_sell_cost+sdem_execess_zsp_sell_kom_cost-buy_kom_gen_cost as direct_sdem_sell_deals_cost,
		sdem_power_sell_cost_mod+sdem_execess_zsp_sell_kom_cost_mod-buy_kom_gen_cost_mod as direct_sdem_sell_deals_cost_mod,
		(sdem_power_sell_cost + sdem_execess_zsp_sell_kom_cost - buy_kom_gen_cost)
		- sdem_power_sell_eff_vol * Tm * k_season as sdem_power_sell_eff_cost,
		(sdem_power_sell_cost_mod+sdem_execess_zsp_sell_kom_cost_mod-buy_kom_gen_cost_mod)
		- sdem_power_sell_eff_vol * Tm as sdem_power_sell_eff_cost_mod,
		--Эфект от покупки по СДЭМ
		case when sdem_power_buy_vol > buy_fact_cons_vol
			then (sdem_power_buy_vol - buy_fact_cons_vol)* Tm_kom_init
			else (sdem_power_buy_vol - buy_fact_cons_vol)* Tm_kom_end
		end - sdem_power_buy_cost - buy_fact_cons_vol * Tm_kom_end as sdem_power_buy_eff_cost,
		case when sdem_power_buy_vol > buy_fact_cons_vol
			then (sdem_power_buy_vol - buy_fact_cons_vol)* Tm_kom_init/k_season
			else (sdem_power_buy_vol - buy_fact_cons_vol)* Tm_kom_end/k_season
		end - sdem_power_buy_cost_mod - buy_fact_cons_vol * Tm_kom_end/k_season as sdem_power_buy_eff_cost_mod
	from
		(select 
			cg.y,
			cg.m,
			cg.id_gres,
			i.k_season,
			i.Tm_kom_init,
			i.Tm_kom_end,
			gm.Tm,
			
			sds.sdem_power_sell_vol, -- продажа мощности по СДЭМ
			sds.sdem_power_sell_cost,
			sds.sdem_power_sell_cost_mod,
			
			sdb.sdem_power_buy_vol, -- покупка мощности по СДЭМ
			sdb.sdem_power_buy_cost,
			sdb.sdem_power_buy_cost_mod,

			cg.buy_kom_gen_vol, -- покупка у ЦФР превышения лимитов (физических и перетоков в ЗСП) по итог. цене КОМ
			cg.buy_kom_gen_vol*i.Tm_kom_end as buy_kom_gen_cost,
			cg.buy_kom_gen_vol*i.Tm_kom_end/i.k_season as buy_kom_gen_cost_mod,
			
			cg.gr_sum_excess_vol as sdem_execess_zsp_sell_kom_vol, -- продажа превышения лимита перетока в другие ЗСП ЦФРу
			cg.gr_sum_excess_vol*gm.Tm*i.k_season as sdem_execess_zsp_sell_kom_cost,
			cg.gr_sum_excess_vol*gm.Tm as sdem_execess_zsp_sell_kom_cost_mod,

			case when cg.Nfree_vol<sds.sdem_power_sell_vol
				then cg.Nfree_vol
				else sds.sdem_power_sell_vol
			end as sdem_power_sell_eff_vol,
			
			isnull(cc.buy_fact_cons_vol,  0 ) as buy_fact_cons_vol, -- покупка потребления
			isnull(ef.exchange_fee_cost,  0 ) as exchange_fee_cost -- комиссия биржи
			

		from [qv_capacity_kom_gen] cg
		join (select distinct id_gres, price_zone from tbl_gtp) gt on gt.id_gres=cg.id_gres
		join dbo.tbl_imbalance i
			on i.price_zone=gt.price_zone and i.[year]=cg.y and i.[month]=cg.m 
		join tbl_GRES_monthly gm
			on gm.id_gres=cg.id_gres and cg.y=gm.[year] and cg.m=gm.[month_num]
		left join
				(select sm.y, sm.m, gt.id_gres,
				sum(isnull(sm.power_vol, s.power_vol)) as sdem_power_sell_vol,
				sum(round(case when s.use_kses= 1  then isnull(sm.power_price, s.power_price)*i.k_season else isnull(sm.power_price, s.power_price) end 
					* isnull(sm.power_vol, s.power_vol),  2 )) as sdem_power_sell_cost,
				sum(round(case when s.use_kses= 0  then isnull(sm.power_price, s.power_price)/i.k_season else isnull(sm.power_price, s.power_price) end 
					* isnull(sm.power_vol, s.power_vol),  2 )) as sdem_power_sell_cost_mod
				from dbo.tbl_dd_price s join dbo.tbl_sdem_month sm on s.dd_kod=sm.dd_kod
				join tbl_gtp gt on gt.gtp_name=s.gtp_name
				join dbo.tbl_imbalance i
					on i.price_zone=gt.price_zone and i.[year]=sm.y and i.[month]=sm.m 

				where s.[role]='Продавец'
				group by sm.y, sm.m, gt.id_gres) sds
		on sds.y=cg.y and  sds.m=cg.m and sds.id_gres=cg.id_gres
		left join
				(select sm.y, sm.m, gt.id_gres,
				sum(isnull(sm.power_vol, s.power_vol)) as sdem_power_buy_vol,
				--sum(isnull(sm.power_vol, s.power_vol)*isnull(sm.power_price, s.power_price)) as sdem_buy_cost
				sum(round(case when s.use_kses= 1  then isnull(sm.power_price, s.power_price)*i.k_season else isnull(sm.power_price, s.power_price) end 
					* isnull(sm.power_vol, s.power_vol),  2 )) as sdem_power_buy_cost,
				sum(round(case when s.use_kses= 0  then isnull(sm.power_price, s.power_price)/i.k_season else isnull(sm.power_price, s.power_price) end 
					* isnull(sm.power_vol, s.power_vol),  2 )) as sdem_power_buy_cost_mod

				from dbo.tbl_dd_price s join dbo.tbl_sdem_month sm on s.dd_kod=sm.dd_kod
				join tbl_gtp gt on gt.gtp_name=s.gtp_name
				join dbo.tbl_imbalance i
					on i.price_zone=gt.price_zone and i.[year]=sm.y and i.[month]=sm.m
				where s.[role]='Покупатель'
				group by sm.y, sm.m, gt.id_gres) sdb
			on sdb.y=cg.y and  sdb.m=cg.m and sdb.id_gres=cg.id_gres
		left join qv_capacity_kom_cons cc
			on cc.y=cg.y and  cc.m=cg.m and cc.id_gres=cg.id_gres
		left join
			(select t.y, t.m, g.id_gres,
				sum(exchange_fee_cost) as exchange_fee_cost
				from
				(select 
					cast(substring(contract_code,  5 , 2 ) as int)+ 2000  as  y, 
					cast(substring(contract_code,  8 , 2 ) as int) as m, 
					case when buy_sell=N'S' 
						then seller_gtp 
						else buyer_gtp
					end as gtp_name, 
					sum(contract_count * contract_price)/ 1000  as exchange_fee_cost
				from dbo.tbl_sdem_deals
				group by cast(substring(contract_code,  5 , 2 ) as int)+ 2000 , cast(substring(contract_code,  8 , 2 ) as int), case when buy_sell=N'S' then seller_gtp else buyer_gtp end
				) t join tbl_gtp g on t.gtp_name=g.gtp_name
				group by t.y, t.m, g.id_gres
				) ef
			on ef.y=cg.y and  ef.m=cg.m and ef.id_gres=cg.id_gres
		) t
	) tt
...
Рейтинг: 0 / 0
Arithmetic overflow error converting expression to data type int
    #36069418
kii23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблему решить удалось - нашёл одно выражение в одном из подзапросов, где небыло явного преобразования int к float (его результат учавствовал в промежуточных расчётах и в результирующем наборе "чистого" этого параметра нет).
Но почему ошибка вываливалась только если отфильтрован один конкретный месяц и только если запрос выполняется из ReportingServices я не понял. В найденном выражении числа учавствовали маленькие и результат после его (выражения) изменения не изменился.
Если у кого есть варианты объяснения этого феномена - было бы интересно понять его.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Arithmetic overflow error converting expression to data type int
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]