I have 3 tables :
table_product (30 000 row)
---------
ID
label
_
table_period (225 000 row)
---------
ID
date_start
date_end
default_price
FK_ID_product
and
table_special_offer (10 000 row)
-----
ID
label
date_start,
date_end,
special_offer_price
FK_ID_period
So I need to load data from all these table, so here it’s what I do :
1/ load data from “table_product” like this
select *
from table_product
where label like 'gun%'
2/ load data from “table_period” like this
select *
from table_period
where FK_ID_product IN(list of all the ids selected in the 1)
3/ load data from “table_special_offer” like this
select *
from table_special_offer
where FK_ID_period IN(list of all the ids selected in the 2)
As you may think the IN clause in the point 3 can be very very big (like 75 000 big), so I got a lot of chance of getting either a timeout or something like ” An expression services limit has been reached”.
Have you ever had something like this, and how did you manage to avoid it ?
PS :
the context : SQL server 2005, .net 2.0
(please don’t tell me my design is bad, or I shouldn’t do “select *”, I just simplified my problem so it is a little bit simpler than 500 pages describing my business).
Thanks.
In finally have my answer : table variable (a bit like @smirkingman’s solution but not with cte) so:
this is for the sql, and with c# I use ExecuteReader, Read, and NextResult of the class sqldatareader
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx
I got all I want :
– my datas
– i don’t have too much data (unlike the solutions with join)
– i don’t execute twice the same query (like solution with subquery)
– i don’t have to change my mapping code (1row = 1 business object)