我的程序中要动态的去算每一列的值,其中用到自定义函数,记录多时运行就很慢,有时会超时退出,请问怎么处理?
例自定义函数如下:
CREATE function charge_total(@bh varchar(30),@type varchar(60),@mx varchar(50))
returns decimal(9,2) --注意返回值的长度
as
begin
declare @re decimal(9,2) --
set @re=0
select @re=@re+total from m_chargelist where rdno=@bh and type=@type and charge=@mx
return @re
end
我在SQL的语句中可能会多次出现这个函数:select rdno,client,dbo.charge_total(rdno,'收','运费'),dbo.charge_total(rdno,'收','杂费'),dbo.charge_total(rdno,'收','其他)..from.....
这样的语句,当m_chargelist记录数多了后,运行这样的语句就会超时等,出错请问有好的解决方法吗?谢了!
例自定义函数如下:
CREATE function charge_total(@bh varchar(30),@type varchar(60),@mx varchar(50))
returns decimal(9,2) --注意返回值的长度
as
begin
declare @re decimal(9,2) --
set @re=0
select @re=@re+total from m_chargelist where rdno=@bh and type=@type and charge=@mx
return @re
end
我在SQL的语句中可能会多次出现这个函数:select rdno,client,dbo.charge_total(rdno,'收','运费'),dbo.charge_total(rdno,'收','杂费'),dbo.charge_total(rdno,'收','其他)..from.....
这样的语句,当m_chargelist记录数多了后,运行这样的语句就会超时等,出错请问有好的解决方法吗?谢了!
解决方案 »
- 公司自己的ERP管理系统,数据库从sql2000升级到2005或2008,会出问题吗?
- 在vs2005 里 出现“不支持关键字: “data soure”。”问题怎么办呢?
- 求sql,分组求最大值
- SQL语句---遇到 , 逗号就回车换行
- 有关数据库日记的问题!!
- sql和delphi的简单 高手有请!!!!!!!!!
- 存储过程的问题,对我来说有点难了
- 读取数据库中的日期时间格式
- vfp:如何让程序等待一段时间,类似vc的sleep的函数??????
- 急!!我的win98个人版db2一运行控制中心就出现:[ibm][jdbc Driver]CLI0622E存取JDBC管理服务扩展名时出错。
- ??继续求助!!sql
- 高难度的两个表的查询,求查询最快的SQL语句,
returns decimal(9,2) --注意返回值的长度
as
begin
declare @re decimal(9,2)
select @re=sum(total) from m_chargelist where rdno=@bh and type=@type and charge=@mx
return @re
end
go
如果只是查询的话,一次不要取那么多记录,做个分页处理。
GO
cmd.CommandTimeOut=0;
client,
收运费 = SUM(CASE WHEN type = '收'
AND charge = '运费' THEN total
ELSE 0
END),
收杂费 = SUM(CASE WHEN type = '收'
AND charge = '杂费' THEN total
ELSE 0
END),
收其他 = SUM(CASE WHEN type = '收'
AND charge = '其他' THEN total
ELSE 0
END)
FROM m_chargelist
GROUP BY rdno,
client
2. 尽量使用 WITH SCHEMABINDING. 这可以造就确定性函数, 确定性函数的好处是, 在一个查询中, 如果函数的输入参数是同一个, 则函数不会重复调用
3. 在可能的情况下, 把函数定义为列的计算值(2005及之后的版本指定 PERSISTED 选项, 2005之前的版本在该列上建立索引), 或者把它放在索引视图中, 这样函数的计算结果是持久化的, 引用的时候不用反复计算(不过要确定性函数才行, 另外, 当然会对数据变更速度造成影响)
既然动态,就用动态语句吧declare @sql varchar(8000)
set @sql='SELECT rdno,client'
select @sql=@sql+',['+type+']=SUM(CASE WHEN type = '''+type+''' AND charge = '''+charge+''' THEN total ELSE 0 END)'
from (select distinct type,charge from m_chargelist) t
exec(@sql+' FROM m_chargelist GROUP BY rdno, client')