能否只运行一次存储过程(Sql server7), 就能在Delphi5中得到明细, 及汇总数?(200分)

  • 主题发起人 主题发起人 sercall
  • 开始时间 开始时间
S

sercall

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi5 + SQL Server 2000
1. sql server 已建立了一个存储过程(A1)
(select partno, amount
from ...)
这过程较复杂, 需几十秒钟运行.

结果集: partno amount
11111 100
22222 200
33333 300
...

2. Delphi5 的程序中,
要用DBGrid 显示上述明显结果,
又要在一个Label中显示总数-sum(amount).

请教: 能否只运行一次存储过程(A1)? 就能在Delphi5中得到上述(2)的要求.

若在存储过程(A1)中用COMPUTE 生成汇总数据行,
在Delphi5中: DBGrid 能得到明细,
Label又怎样读取sum(amount)?

谢谢!
 
你可以为存储过程定义一个output型的参数,将Sum的值赋给该参数就可以了。
 
楼上说的很对,也可以返回Cursor.
 
存储过程中,在返回select明细集的同时,
又怎样将Compute 汇总值Set给 OUTPUT 变量?
还望多指教!
 
这样行不?
CREATE PROCEDURE dt_demo
( @area decimal(10,2) OUTPUT )

AS
declare @_total decimal(10,2)
select @_total= sum(total) from table
select * from table
 
返回明细结果后在客户端汇总就可以啦。
 
zengr的方法还是要运行两次(得到Table结果集),
得到Table结果集的子select运行一次就需52秒, 这样时间太长了.
明细也有几千条记录,在客户机上汇总,也多花了不少时间.
还望再指点!

 
ehlib's dbgrideh
 
请问: "ehlib's dbgrideh" 是什么意思?
 
CREATE PROCEDURE test
as
select partno, amount
from ...
compute SUM(amount)

Label取最后一条记录的amount值
 
pqx:
"Label取最后一条记录的amount值" 不行啊?
它取到的是 select partno, amount
from ...
的最后一条记录的amount值,
并非 compute SUM(amount)的值.
还望请教!

 
此也是我想得的
 
没办法了吗?
 
用Ehlib控件,(DBGrid),它有一个子控件TDBSumlist,可用于在Label上放汇总数据!
即汇总数据不由SP返回,而在Form中用控件自动得到。OK?
 
在客户端汇总就可以了,C/S结构影响速度的主要是网络传输,你全部由服务器返回数据并
不会减少数据量,使用本地库时所有的数据都在本机运算也不会慢呀。
 
存储过程的方法是最方便的,速度太慢能不能建索引解决
 
还有没有更好的方法?
用sql 语句.
 
存储过程中建临时表,将结果集先放在临时表中,再

select @output = sum(salary) from #tmp

select * from #tmp

而且,在存储过程中使用临时表可以极大地提高效率,比用游标要快10——100倍!!!
 
select id,money
from YourTable

union

select 100000000 as id,Sum(money) as Money
from YourTable


比较无聊的办法:)
 
接受答案了.
 
后退
顶部