执行一个sql数据查询,需要2~3分钟.
现在C#总是提示超时. 除非了设置connection连接串的timeout外 还有什么办法么?現在sql語句已經沒什么办法改进了.因为
根据1000多个成品号,然后用游标一个一个成品号的去展Bom表,从成品阶一直展到最尾阶材料.这里是很耗时的.declare @datestate datetime
set @datestate='2000/7/6'
declare @dateend datetime
set @dateend='2015/7/6'
declare @date datetime--Bom表中元件品號失效日期
set @date='2010/7/6'
CREATE TABLE #table
(MD001 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
MD003 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
Amount numeric(18,5),
level int)
CREATE TABLE #t
(MD001 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
MD003 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
Amount numeric(18,5),
level int)
declare @level int
declare @id nvarchar(50)
declare @Amount int
declare MyCusror Cursor
For Select [成品碼],sum(isnull([數量],0)) from 備料簽呈.dbo.訂單單身 where [成品碼] is not null and ([預計出貨日]>=@datestate and [預計出貨日]<=@dateend) group by [成品碼]
For Read Only
OPEN MyCusror
FETCH NEXT from MyCusror into @id,@Amount
WHILE @@FETCH_STATUS = 0
BEGIN
set @level=1
insert into #t
select MD001,MD003,MD006/MD007*@Amount,@level from BOMMD where MD001=@id and (MD012>convert(varchar(8),@date,112) or MD012=' ')
while @@rowcount>0
begin
set @level=@level+1
insert into #t
select a.MD001,a.MD003,a.MD006/a.MD007*b.Amount,@level
from BOMMD as a,#t as b
where (a.MD001=b.MD003
and b.level=@level-1) and (a.MD012>convert(varchar(8),@date,112) or a.MD012=' ')
end
insert into #table select MD001,MD003,Amount,level from #t
delete #t
FETCH NEXT from MyCusror into @id,@Amount
END
CLOSE MyCusror
select a.*,b.MB025 品號屬性,c.MC002 庫存名稱,c.sumMC007 庫存,d.sumTC006 計劃採購,(e.sumTD008-e.sumTD015) 預計進貨,f.sumTB009 預計請購,g.sumTB007 計劃領料,(h.sumTB004-h.sumTB005) 預計領料 from
(select MD003,sum(Amount) 用量 from #table group by MD003) a
left join INVMB b on a.MD003=b.MB001
left join (select MC001,MC002,sum(isnull(MC007,0)) sumMC007 from INVMC group by MC001,MC002) c on a.MD003=c.MC001
left join (select TC002,sum(isnull(TC006,0)) sumTC006 from LRPTC group by TC002) d on a.MD003=d.TC002
left join (select TD004,sum(isnull(TD008,0)) sumTD008,sum(isnull(TD015,0)) sumTD015 from PURTD group by TD004) e on a.MD003=e.TD004
left join (select TB004,sum(isnull(TB009,0)) sumTB009 from PURTB group by TB004) f on a.MD003=f.TB004
left join (select TB002,sum(isnull(TB007,0)) sumTB007 from LRPTB group by TB002) g on a.MD003=g.TB002
left join (select TB003,sum(isnull(TB004,0)) sumTB004,sum(isnull(TB005,0)) sumTB005 from MOCTB group by TB003) h on a.MD003=h.TB003
where b.MB025 like '%%%' and c.MC002 like '%%%'
DEALLOCATE MyCusror
drop table #table
drop table #t
现在C#总是提示超时. 除非了设置connection连接串的timeout外 还有什么办法么?現在sql語句已經沒什么办法改进了.因为
根据1000多个成品号,然后用游标一个一个成品号的去展Bom表,从成品阶一直展到最尾阶材料.这里是很耗时的.declare @datestate datetime
set @datestate='2000/7/6'
declare @dateend datetime
set @dateend='2015/7/6'
declare @date datetime--Bom表中元件品號失效日期
set @date='2010/7/6'
CREATE TABLE #table
(MD001 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
MD003 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
Amount numeric(18,5),
level int)
CREATE TABLE #t
(MD001 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
MD003 char(40)COLLATE Chinese_Taiwan_Stroke_BIN,
Amount numeric(18,5),
level int)
declare @level int
declare @id nvarchar(50)
declare @Amount int
declare MyCusror Cursor
For Select [成品碼],sum(isnull([數量],0)) from 備料簽呈.dbo.訂單單身 where [成品碼] is not null and ([預計出貨日]>=@datestate and [預計出貨日]<=@dateend) group by [成品碼]
For Read Only
OPEN MyCusror
FETCH NEXT from MyCusror into @id,@Amount
WHILE @@FETCH_STATUS = 0
BEGIN
set @level=1
insert into #t
select MD001,MD003,MD006/MD007*@Amount,@level from BOMMD where MD001=@id and (MD012>convert(varchar(8),@date,112) or MD012=' ')
while @@rowcount>0
begin
set @level=@level+1
insert into #t
select a.MD001,a.MD003,a.MD006/a.MD007*b.Amount,@level
from BOMMD as a,#t as b
where (a.MD001=b.MD003
and b.level=@level-1) and (a.MD012>convert(varchar(8),@date,112) or a.MD012=' ')
end
insert into #table select MD001,MD003,Amount,level from #t
delete #t
FETCH NEXT from MyCusror into @id,@Amount
END
CLOSE MyCusror
select a.*,b.MB025 品號屬性,c.MC002 庫存名稱,c.sumMC007 庫存,d.sumTC006 計劃採購,(e.sumTD008-e.sumTD015) 預計進貨,f.sumTB009 預計請購,g.sumTB007 計劃領料,(h.sumTB004-h.sumTB005) 預計領料 from
(select MD003,sum(Amount) 用量 from #table group by MD003) a
left join INVMB b on a.MD003=b.MB001
left join (select MC001,MC002,sum(isnull(MC007,0)) sumMC007 from INVMC group by MC001,MC002) c on a.MD003=c.MC001
left join (select TC002,sum(isnull(TC006,0)) sumTC006 from LRPTC group by TC002) d on a.MD003=d.TC002
left join (select TD004,sum(isnull(TD008,0)) sumTD008,sum(isnull(TD015,0)) sumTD015 from PURTD group by TD004) e on a.MD003=e.TD004
left join (select TB004,sum(isnull(TB009,0)) sumTB009 from PURTB group by TB004) f on a.MD003=f.TB004
left join (select TB002,sum(isnull(TB007,0)) sumTB007 from LRPTB group by TB002) g on a.MD003=g.TB002
left join (select TB003,sum(isnull(TB004,0)) sumTB004,sum(isnull(TB005,0)) sumTB005 from MOCTB group by TB003) h on a.MD003=h.TB003
where b.MB025 like '%%%' and c.MC002 like '%%%'
DEALLOCATE MyCusror
drop table #table
drop table #t
然后一个展Bom表的动作