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里函数的妙用。