sql server里函数的两种用法(可以代替游标)
1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。
函数部分:
create function [dbo].[fun_gettime] (@taskphaseid int)
returns float as
begin
declare @taskid int,
@hour float,
@percent float,
@return float
if @taskphaseid is null
begin
return(0.0)
end
select @taskid=taskid,@percent=isnull(workpercent,0)/100
from tabletaskphase
where [email protected]
select @hour=isnull(tasktime,0) from tabletask
where [email protected]
set @[email protected]*@percent
return (@return)
end
调用函数的存储过程部分
create procedure [dbo].[proc_calcca]
@roid int
as
begin
declare @ca float
update tablefmeca
set
cvalue_m= isnull(moderate,0)*isnull(fmerate,0)*isnull(b.basfailurerate,0)*[dbo].[fun_gettime](c.id)
from tablefmeca ,tablerelation b,tabletaskphase c
where [email protected] and taskphaseid=c.id and [email protected]
select @ca=sum(isnull(cvalue_m,0)) from tablefmeca where [email protected]
update tablerelation
set [email protected]
where [email protected]
end
go
2. 我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但sqlserver2000里支持
sum ( [ all | distinct ] expression )
expression
是常量、列或函数,或者是算术、按位与字符串等运算符的任意组合。因此我们可以利用这一功能。
函数部分:
create function [dbo].[fun_rate] (@partid int,@enid int,@sourceid int, @qualityid int,@count int)
returns float as
begin
declare @qxs float, @g float, @rate float
if (@enid=null) or (@partid=null) or (@sourceid=null) or (@qualityid=null)
begin
return(0.0)
end
select @qxs= isnull(xs,0) from tablequality where [email protected]
select @g=isnull(frate_g,0) from tablefailurerate
where ([email protected]) and( [email protected]) and ( [email protected]) and( ( (isnull(mincount,0)<=isnull(@count,0)) and ( isnull(maxcount,0)>=isnull(@count,0)))
or(isnull(@count,0)>isnull(maxcount,0)))
set @rate=isnull(@qxs*@g,0)
return (@rate)
end
调用函数的存储过程部分:
create proc proc_faultrate
@partid integer, @qualityid integer, @sourceid integer, @count integer, @roid int, @grade int,@rate float=0 outputas
begin
declare
@taskid int
set @rate=0.0
select @taskid=isnull(taskproid,-1) from tablerelation where id=(select pid from tablerelation where [email protected])
if (@taskid=-1) or(@grade=1) begin
set @rate=0
return
end
select @rate=sum([dbo].[fun_rate] (@partid,enid,@sourceid, @qualityid,@count) *isnull(workpercent,0)/100.0)
from tabletaskphase
where [email protected]
end
go
函数还可以返回表等,希望大家一起讨论sqlserver里函数的妙用。
新闻热点
疑难解答