SQL Server里函数的两种用法与些同时这两种用法可以代替游标。
1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。
函数部分:
以下是引用片段:
CREATEFUNCTION[DBO].[FUN_GETTIME](@TASKPHASEIDINT)
RETURNSFLOATAS
BEGIN
DECLARE@TASKIDINT,
@HOURFLOAT,
@PERCENTFLOAT,
@RETURNFLOAT
IF@TASKPHASEIDISNULL
BEGIN
RETURN(0.0)
END
SELECT@TASKID=TASKID,@PERCENT=ISNULL(WORKPERCENT,0)/100
FROMTABLETASKPHASE
WHEREID=@TASKPHASEID
SELECT@HOUR=ISNULL(TASKTIME,0)FROMTABLETASK
WHEREID=@TASKID
SET@RETURN=@HOUR*@PERCENT
RETURN(@RETURN)
END
|
调用函数的存储过程部分
以下是引用片段:
CREATEPROCEDURE[DBO].[PROC_CALCCA]
@ROIDINT
AS
BEGIN
DECLARE@CAFLOAT
UPDATETABLEFMECA
SET
Cvalue_M=ISNULL(MODERATE,0)*ISNULL(FMERATE,0)*
ISNULL(B.BASFAILURERATE,0)*[DBO].[FUN_GETTIME](C.ID)
FROMTABLEFMECA,TABLERELATIONB,TABLETASKPHASEC
WHEREROID=@ROIDANDTASKPHASEID=C.IDANDB.ID=@ROID
SELECT@CA=SUM(ISNULL(Cvalue_M,0))FROMTABLEFMECAWHEREROID=@ROID
UPDATETABLERELATION
SETCRITICALITY=@CA
WHEREID=@ROID
END
GO
|
2. 我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但SQL Server2000里支持:
SUM ( [ ALL | DISTINCT ] expression )
expression是常量、列或函数,或者是算术、按位与字符串等运算符的任意组合。因此我们可以利用这一功能。
函数部分:
以下是引用片段:
CREATEFUNCTION[DBO].[FUN_RATE]
(@PARTIDINT,@ENIDINT,@SOURCEIDINT,
@QUALITYIDINT,@COUNTINT)
RETURNSFLOATAS
BEGIN
DECLARE@QXSFLOAT,@GFLOAT,@RATEFLOAT
IF(@ENID=NULL)OR(@PARTID=NULL)OR(@SOURCEID=NULL)OR(@QUALITYID=NULL)
BEGIN
RETURN(0.0)
END
SELECT@QXS=ISNULL(XS,0)FROMTABLEQUALITYWHEREID=@QUALITYID
SELECT@G=ISNULL(FRATE_G,0)FROMTABLEFAILURERATE
WHERE(SUBKINDID=@PARTID)AND(ENID=@ENID)AND(DATASOURCEID=@SOURCEID)
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
|
调用函数的存储过程部分:
以下是引用片段:
CREATEPROCPROC_FAULTRATE
@PARTIDINTEGER,@QUALITYIDINTEGER,@SOURCEIDINTEGER,
@COUNTINTEGER,@ROIDINT,@GRADEINT,@RATEFLOAT=0OUTPUTAS
BEGIN
DECLARE
@TASKIDINT
SET@RATE=0.0
SELECT@TASKID=ISNULL(TASKPROID,-1)
FROMTABLERELATIONWHEREID=(SELECTPIDFROMTABLERELATIONWHEREID=@ROID)
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)
FROMTABLETASKPHASE
WHERETASKID=@TASKID
END
GO
|
函数还可以返回表等,希望大家一起讨论SQL Server里函数的妙用。 |