该存储过程返回一结果集
在查询分析器及视图中执行只需要几秒钟.
但在delphi调用则返回"超时已过期".
我用adodataset调用。当我将timeout时间设为0后,没提示出错,但需要二分多钟结果才出来。
为什么在delphi中调用会这样。

解决方案 »

  1.   

    在Grid中循环输出几万条记录?
      

  2.   

    执行存储过程最好用AdoStoredProc控件,除了设TimeOut外,再加大该控件的CacheSize 值
      

  3.   

    输出的结果是从几万条记录中汇总,最后只有几十条记录显示出来.AdoStoredProc我试过,执行是很快,但我想将结果返回GRID中.TDATASOURCE好像不能关联AdoStoredProc.
      

  4.   

    TDATASOURCE能关联AdoStoredProc.弄错了.
      

  5.   

    还是一样慢.我把查询分两段了.原来是关联在一起的.
    if @index=45 
    begin
    SELECT 客户id, 客户名称, SUM(数量) AS 数量, SUM(件数) AS 件数, SUM(金额) 
                  AS 金额, SUM(成本) AS 成本, SUM(毛利) AS 毛利
            FROM (SELECT 客户ID, 客户名称, 分类ID, SUM(数量) AS 数量, SUM(件数) AS 件数, 
                          SUM(金额) AS 金额, SUM(成本) AS 成本, SUM(毛利) AS 毛利
                    FROM (SELECT khhz.客户ID, dbo.[代码_客户].客户名称, khhz.商品ID, 
                                  dbo.[每月结存].商品名称, dbo.[每月结存].分类ID, 
                                  dbo.[每月结存].单位, dbo.[每月结存].规格, dbo.[每月结存].关系, 
                                  khhz.数量, khhz.件数, khhz.销售价, khhz.销售件价, khhz.金额, 
                                  dbo.[每月结存].出仓单价 AS 成本价, 
                                  round((ROUND(dbo.[每月结存].关系 * khhz.件数, 2) + khhz.数量) 
                                  * dbo.[每月结存].出仓单价, 2) AS 成本, 
                                  khhz.金额 - round((ROUND(dbo.[每月结存].关系 * khhz.件数, 2) 
                                  + khhz.数量) * dbo.[每月结存].出仓单价, 2) AS 毛利
                            FROM (SELECT 客户ID, 商品ID, SUM(数量) AS 数量, SUM(件数) 
                                          AS 件数, SUM(金额) AS 金额, AVG(单价) AS 销售价, 
                                          AVG(件价) AS 销售件价
                                    FROM (SELECT dbo.出仓单.客户ID, dbo.出仓单明细.商品ID, 
                                                  dbo.出仓单明细.数量, dbo.出仓单明细.单价, 
                                                  dbo.出仓单明细.件数, dbo.出仓单明细.件价, 
                                                  dbo.出仓单明细.金额
                                            FROM dbo.出仓单 INNER JOIN
                                                  dbo.出仓单明细 ON 
                                                  dbo.出仓单.单据号 = dbo.出仓单明细.单据号
                                            WHERE (dbo.出仓单.客户ID IS NOT NULL) AND 
                                                  出仓单.日期 BETWEEN @date1 AND 
                                                  @date2) khccmx
                                    GROUP BY 客户ID, 商品ID) khhz LEFT OUTER JOIN
                                  dbo.[代码_客户] ON 
                                  khhz.客户ID COLLATE Chinese_PRC_CI_AS = dbo.[代码_客户].客户ID
                                   LEFT OUTER JOIN
                                  dbo.[每月结存] ON 
                                  khhz.商品ID COLLATE Chinese_PRC_CI_AS = dbo.[每月结存].商品ID
                                   AND 每月结存.年份 = datepart(year,@date2) AND 
                                  每月结存.月份 = datepart(month,@date2)) AS khhz
                    WHERE 分类ID IS NOT NULL AND 分类id <> 'HC'
                    GROUP BY 客户ID, 客户名称, 分类ID) khhz
            GROUP BY 客户ID, 客户名称
    end
    --耗材类
    if @index=46
    begin
    SELECT 客户id, 客户名称, SUM(数量) AS 数量, SUM(件数) AS 件数, SUM(金额) 
                   AS 金额, SUM(成本) AS 成本, SUM(毛利) AS 毛利
             FROM (SELECT 客户ID, 客户名称, 分类ID, SUM(数量) AS 数量, SUM(件数) AS 件数, 
                           SUM(金额) AS 金额, SUM(成本) AS 成本, SUM(毛利) AS 毛利
                     FROM (SELECT khhz.客户ID, dbo.[代码_客户].客户名称, khhz.商品ID, 
                                   dbo.[每月结存].商品名称, dbo.[每月结存].分类ID, 
                                   dbo.[每月结存].单位, dbo.[每月结存].规格, dbo.[每月结存].关系, 
                                   khhz.数量, khhz.件数, khhz.销售价, khhz.销售件价, khhz.金额, 
                                   dbo.[每月结存].出仓单价 AS 成本价, 
                                   round((ROUND(dbo.[每月结存].关系 * khhz.件数, 2) + khhz.数量) 
                                   * dbo.[每月结存].出仓单价, 2) AS 成本, 
                                   khhz.金额 - round((ROUND(dbo.[每月结存].关系 * khhz.件数, 2) 
                                   + khhz.数量) * dbo.[每月结存].出仓单价, 2) AS 毛利
                             FROM (SELECT 客户ID, 商品ID, SUM(数量) AS 数量, SUM(件数) 
                                           AS 件数, SUM(金额) AS 金额, AVG(单价) AS 销售价, 
                                           AVG(件价) AS 销售件价
                                     FROM (SELECT dbo.出仓单.客户ID, dbo.出仓单明细.商品ID, 
                                                   dbo.出仓单明细.数量, dbo.出仓单明细.单价, 
                                                   dbo.出仓单明细.件数, dbo.出仓单明细.件价, 
                                                   dbo.出仓单明细.金额
                                             FROM dbo.出仓单 INNER JOIN
                                                   dbo.出仓单明细 ON                                                dbo.出仓单.单据号 = dbo.出仓单明细.单据号
                                             WHERE (dbo.出仓单.客户ID IS NOT NULL) AND 
                                                   出仓单.日期 BETWEEN @date1 AND 
                                                   @date2) khccmx
                                     GROUP BY 客户ID, 商品ID) khhz LEFT OUTER JOIN
                                   dbo.[代码_客户] ON 
                                   khhz.客户ID COLLATE Chinese_PRC_CI_AS = dbo.[代码_客户].客户ID
                                    LEFT OUTER JOIN
                                   dbo.[每月结存] ON 
                                   khhz.商品ID COLLATE Chinese_PRC_CI_AS = dbo.[每月结存].商品ID
                                    AND 每月结存.年份 = datepart(year,@date2) AND 
                                   每月结存.月份 = datepart(month,@date2)) AS khhz
                     WHERE 分类ID = 'HC'
                     GROUP BY 客户ID, 客户名称, 分类ID) hckhhz
             GROUP BY 客户ID, 客户名称
    end
      

  6.   

    先把上面一大串select返回的结果放到临时表中再select * from 临时表
    drop table 临时表看看速度是否提升了。