MS SQL Server中函数的两种用法
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   ID=@TASKPHASEID    
   SELECT   @HOUR=ISNULL(TASKTIME,0)   FROM   TABLETASK    
   WHERE   ID=@TASKID    
   SET   @RETURN=@HOUR*@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   ROID=@ROID   AND   TASKPHASEID=C.ID   AND   B.ID=@ROID    
   SELECT   @CA=SUM(ISNULL(Cvalue_M,0))   FROM   TABLEFMECA   WHERE   ROID=@ROID    
   UPDATE   TABLERELATION    
   SET   CRITICALITY=@CA    
   WHERE   ID=@ROID    
   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   ID=@QUALITYID    
   SELECT   @G=ISNULL(FRATE_G,0)   FROM   TABLEFAILURERATE    
   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        
   调用函数的存储过程部分:   
 以下是引用片段: 
   CREATE   PROC   PROC_FAULTRATE    
   @PARTID   INTEGER,   @QUALITYID   INTEGER,   @SOURCEID   INTEGER,   @COUNT   INTEGER,   @ROID   INT,   @GRADE   INT,@RATE   FLOAT=0   OUTPUTAS    
   BEGIN    
   DECLARE    
   @TASKID   INT &