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

SELECT HOUR=ISNULL(TASKTIME,0) FROM TABLETASK
WHERE

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 AND TASKPHASEID=C.ID AND

  SELECT CA=SUM(ISNULL(Cvalue_M,0)) FROM TABLEFMECA WHERE

UPDATE TABLERELATION
  SET
  WHERE
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
  SELECT G=ISNULL(FRATE_G,0) FROM TABLEFAILURERATE
  WHERE () AND( ) AND ( ) 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 )

    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
END
GO

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



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