我在D中运行一个SQL存储过程,因其数据量较大,生成2W行以上的记录,运行几分钟后,就结束了,但只产生了500多条记录。
当我在查询分析器中运行时,产生的结果是2W以上的记录,结果正确,历时50分钟左右请问这是什么原因,会是D中有什么运行时间限制吗?在D中的代码是:
myDM.ADOStoredProc1.ProcedureName:='UP_GetResidueToTable';
myDM.ADOStoredProc1.ExecProc;在查询分析器中的代码是:
EXEC UP_GetResidueToTable 存储过程代码:
CREATE procedure up_CreateFgAndItemTable
as delete from ut_FgAndItem
declare @FgAndItem cursor
,@item ItemTypeIF OBJECT_ID('tempdb..@tmpOneFgItem') IS NULL BEGIN
CREATE TABLE #tmpOneFgItem (
seq int
,TcLevel int
,TcItem nvarchar(30)
,TcGroupItem nvarchar(30)
,TcDesc nvarchar(40)
,TQty float
,TUm nvarchar(3)
,TUnit nvarchar(1)
,TRef nvarchar(1)
,TType nvarchar(1)
,TcPmtCode nvarchar(1)
,TcStocked tinyint
,TcRevision nvarchar(8)
,TcJobRefDes nvarchar(10)
,TcJobRefBubble nvarchar(4)
,TcJobRefAssySeq nvarchar(4)
,rowpointer uniqueidentifier
,QtyPerFormat nvarchar(30)
,PlacesQtyPer tinyint
,AltGroup int
,AltGroupRank int
,Uf_SubMaterial nvarchar(1)
,uf_ECNEngQty decimal(9)
)
ENDset @FgAndItem=cursor local static for
select item from item where item like 'FG%'
open @FgAndItem
while 1=1
begin
fetch @FgAndItem into
@item
if @@fetch_status<>0
break
insert into #tmpOneFgItem exec UP_Rpt_IndentedCurrentBillofMaterialSp @item,@item
insert into ut_FgAndItem(FgItem,TcLevel,TcItem,TUm,TQty) select TcGroupItem,TcLevel,TcItem,TUm,TQty from #tmpOneFgItem
delete from #tmpOneFgItem
end
drop table #tmpOneFgItem
GO上面UP_Rpt_IndentedCurrentBillofMaterialSp存储过程主要负责从那个10W的函数中取对应值
其实用一个查询可以代替的,可不知道是数据太多的原因还是什么,这查询在存储过程通不过 请高手帮忙!
当我在查询分析器中运行时,产生的结果是2W以上的记录,结果正确,历时50分钟左右请问这是什么原因,会是D中有什么运行时间限制吗?在D中的代码是:
myDM.ADOStoredProc1.ProcedureName:='UP_GetResidueToTable';
myDM.ADOStoredProc1.ExecProc;在查询分析器中的代码是:
EXEC UP_GetResidueToTable 存储过程代码:
CREATE procedure up_CreateFgAndItemTable
as delete from ut_FgAndItem
declare @FgAndItem cursor
,@item ItemTypeIF OBJECT_ID('tempdb..@tmpOneFgItem') IS NULL BEGIN
CREATE TABLE #tmpOneFgItem (
seq int
,TcLevel int
,TcItem nvarchar(30)
,TcGroupItem nvarchar(30)
,TcDesc nvarchar(40)
,TQty float
,TUm nvarchar(3)
,TUnit nvarchar(1)
,TRef nvarchar(1)
,TType nvarchar(1)
,TcPmtCode nvarchar(1)
,TcStocked tinyint
,TcRevision nvarchar(8)
,TcJobRefDes nvarchar(10)
,TcJobRefBubble nvarchar(4)
,TcJobRefAssySeq nvarchar(4)
,rowpointer uniqueidentifier
,QtyPerFormat nvarchar(30)
,PlacesQtyPer tinyint
,AltGroup int
,AltGroupRank int
,Uf_SubMaterial nvarchar(1)
,uf_ECNEngQty decimal(9)
)
ENDset @FgAndItem=cursor local static for
select item from item where item like 'FG%'
open @FgAndItem
while 1=1
begin
fetch @FgAndItem into
@item
if @@fetch_status<>0
break
insert into #tmpOneFgItem exec UP_Rpt_IndentedCurrentBillofMaterialSp @item,@item
insert into ut_FgAndItem(FgItem,TcLevel,TcItem,TUm,TQty) select TcGroupItem,TcLevel,TcItem,TUm,TQty from #tmpOneFgItem
delete from #tmpOneFgItem
end
drop table #tmpOneFgItem
GO上面UP_Rpt_IndentedCurrentBillofMaterialSp存储过程主要负责从那个10W的函数中取对应值
其实用一个查询可以代替的,可不知道是数据太多的原因还是什么,这查询在存储过程通不过 请高手帮忙!
再说了,一次返回2W条数据也是不现实的,用户不可能一次看完是吧,可以考虑,每次看100条,这样速度还快,set @FgAndItem=cursor local static for
select item from item where item like 'FG%' 只要在这里加上就可以了,另外,你设计的表是不合格的,
select item from item 从这里就可以看出来!
1)
分页:set @FgAndItem=cursor local static for
select item from item where item like 'FG%'
要如何写,能否举例
2)你设计的表是不合格的,
这表有什么设计问题,是ERP里的。
其实因为记录太多(超过10W)读取太慢,才用了中间表,定时把数据临时保存到一个表中,然后再从中间表中取得相应的数据
http://blog.csdn.net/zjcxc/archive/2003/12/29/20080.aspx
这里有个表名和字段名一样!