当前位置: 代码迷 >> Sql Server >> MS SQL Server中函数的两种用法解决方法
  详细解决方案

MS SQL Server中函数的两种用法解决方法

热度:109   发布时间:2016-04-27 17:52:50.0
MS SQL Server中函数的两种用法
SQL   Server里函数的两种用法(可以代替游标)

  1.   因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。

  函数部分:

以下是引用片段:
  CREATE   FUNCTION   [DBO].[FUN_GETTIME]   (@TASKPHASEID   INT)  
  RETURNS   FLOAT   AS  
  BEGIN  
  DECLARE   @TASKID   INT,  
[email protected]   FLOAT,  
[email protected]   FLOAT,  
[email protected]   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][email protected]  
  RETURN   (@RETURN)  
  END  


  调用函数的存储过程部分

以下是引用片段:
  CREATE   PROCEDURE   [DBO].[PROC_CALCCA]  
[email protected]   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(@[email protected],0)  
  RETURN   (@RATE)  
  END  


  调用函数的存储过程部分:

以下是引用片段:
  CREATE   PROC   PROC_FAULTRATE  
[email protected]   INTEGER,   @QUALITYID   INTEGER,   @SOURCEID   INTEGER,   @COUNT   INTEGER,   @ROID   INT,   @GRADE   INT,@RATE   FLOAT=0   OUTPUTAS  
  BEGIN  
  DECLARE  
[email protected]   INT  
  SET   @RATE=0.0  
  SELECT   @TASKID=ISNULL(TASKPROID,-1)   FROM   TABLERELATION   WHERE   ID=(SELECT   PID   FROM   TABLERELATION   WHERE   [email protected])  
  相关解决方案