分析MS SQL Server里函数的两种用法

80酷酷网    80kuku.com

  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
  SET RATE=0.0
  SELECT TASKID=ISNULL(TASKPROID,-1) FROM TABLERELATION WHERE ID=(SELECT PID FROM TABLERELATION WHERE ID=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)
  FROM TABLETASKPHASE
  WHERE TASKID=TASKID
  END
  GO

  函数还可以返回表等,希望大家一起讨论sqlserver里函数的妙用。

 



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: