比较头疼的问题 
做收费系统中的报表部分,开发环境  delphi6 + Sql Server2000 + Excel2003目前思路如下:软件 报表的查询统计 打印 这3部分尽量做到独立,这样对报表进行修改或增加时尽量不改动源代码 所以 查询统计部分全部放到存储过程里面去做,也就是说,针对不同的报表需求,只需要更改存储过程里面的代码即可,这样可以不依赖于报表软件的修改 报表软件只需要负责调用此存储过程,得到其返回的数据集,然后通过Com调用Excel填充打印即可针对数据查询统计这一部分,我对存储过程复杂的使用还不是很熟悉,目前打算这样做: 1.在存储过程中建立一个临时表
2.将查询统计出来的结果全部插入到此临时表中(针对一张报表,查询统计出的结果的表结构一样)
3.存储过程将此临时表返回给报表软件
4.报表软件得到返回的数据集和内的数据,然后开始打印准备大体的处理思路如下,写了如下的小的例子,遇到问题
存储过程如下:问题1:
--ttoll_data 为数据表
--只是完成一个简单的统计条数的例子
create procedure querydata
as
create table #TmpData(tmpcount int)
insert into TmpData (tmpcount ) (select count(*) from ttoll_data)
GO
Delphi调用如下
界面上ADOConnection1,ADOStoredProc1,DataSource1,DBGrid1  ADOStoredProc1.ProcedureName := 'querydata_1';
  ADOStoredProc1.Prepared := true;
  ADOStoredProc1.Open;
如何能够把TmpData里面的内容在DBGrid1显示出来呢??问题2:如果我统计的报表内容非常庞大,比如10万条记录,有什么好的处理办法呢??多谢大家赐教!!先放100分,后面可能还会有陆续的问题,到时候在+分,hoho

解决方案 »

  1.   

    补充一下
    Delphi报的错误为 “对象名TmpData无效”刚刚看了一下资料
    --ttoll_data 为数据表
    --只是完成一个简单的统计条数的例子
    create procedure querydata
    as
    create table #TmpData(tmpcount int)
    insert into TmpData (tmpcount ) (select count(*) from ttoll_data)
    --返回临时表内容
    select * from TmpData
    GO
    不过这样写还是会出 “对象名TmpData无效”错误,不知该怎么弄
      

  2.   

    。找到错误原因了,貌似我这个自娱自乐帖
    create table #TmpData(tmpcount int)
    --TmpData 忘记#了
    insert into #TmpData (tmpcount) (select count(*) from ttoll_data)
    select * from #TmpData
    那第二个问题,谁能给个解决的思路
      

  3.   

    批量提取数据,在sqlserver中一般以1000条作一个commit会好些。
      

  4.   

    主要的目的是在存储过程里面完成 从原始数据中提取我所需要的数据,然后通过操作(比如求和等等统计操作)得到一个可以使用的报表,返回给我的报表软件,报表软件那边只要调用excel打印就可以了但是,我的原始数据可能非常庞大,比如10万条,或者100万条就是现在对于存储过程里面一些东西还不太熟悉,感觉做起来比较吃力
      

  5.   

    那就要提高你SQL语句的执行效率了
      

  6.   

    唉现在发现数据库表结构设计的有点问题顺便在问一下,关于存储过程里面数据移动的问题比如这样,在原始数据中查询统计满足时间段要求的结果有 10 条那么,我要把这10条数据放入到临时表中,怎么放最有效率?目前就想到一个效率最低(或许不是?)的方法先得到满足条件的条数 count(*) = 10 ,然后再做1-10循环,也就是要在做10次查询通过那10条数据中的主键,得到相应的数据存放到临时变量中,然后再依次的插入临时表最后在返回临时表。我这种方法做起来,估计老天都要落泪了不知道还有没有其他什么更好的办法
      

  7.   

    code=SQL]
    IF OBJECT_ID('临时表') >0 
    INSERT INTO 临时表
    SELECT * FROM TABLE1
    WHERE 条件
    ELSE
    SELECT * INTO 临时表 FROM TABLE1 WHERE ..[
    [/code]
      

  8.   


    IF OBJECT_ID('临时表') >0  
    INSERT INTO 临时表 
    SELECT * FROM TABLE1 
    WHERE 条件 
    ELSE 
    SELECT * INTO 临时表 FROM TABLE1 WHERE .
      

  9.   

    我主要是想这样做 在报表软件里面,不需要做任何的改动,直接将数据集里面的数据通过调用Excel打印出来出于这个目的,所以采用临时表,因为复杂的查询统计等操作在存储过程里面完成,外面只需要打印就可以了也就是说,我这个临时表充当了 传送 “查询统计好的数据” 的中介的角色我不太清楚有没有其他方法可以完成类似的功能还请赐教,hoho
      

  10.   

    如果数据量不太大,大约几百条的话,建议用表变量Declare @TmpData table(tmpcount int)
    insert into @TmpData (tmpcount) (select count(*) from ttoll_data)
    select * from @TmpData