WEB开发网
开发学院数据库MSSQL Server 分析MS SQL Server里函数的两种用法 阅读

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

 2007-02-19 09:25:36 来源:WEB开发网   
核心提示:SQL Server里函数的两种用法(可以代替游标)1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算,分析MS SQL Server里函数的两种用法,我们常常采用游标的方法,这里用函数的方法实现,因此我们可以利用这一功能,函数部分:以下是引用片段:CREATEFUNCTION[DBO].[

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. 我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但sqlserver2000里支持

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

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

Tags:分析 MS SQL

编辑录入:coldstar [复制链接] [打 印]
赞助商链接