当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server里函数的两种用法(可以代替游标)

MSSQL
SQL0290N表空间状态问题:停顿的独占处理
实例讲解启动mysql server失败的解决方法
SQL Server 2005数据转换服务设计问题集锦
不能安装SQL Server 2005的问题及解决方法
SQL中Groupby和Having的使用方法
SQL Server中Update的用法
MSSQL中部分字段重复数据的删除方法
mssql 大小写区分方法
Sql server中时间查询的一个比较快的语句
机器异常关闭重起后出现ora-19809错误
快速解决日志文件满造成的无法写入问题
启用数据库复制时为什么会出现18483错误
实例讲解Ora-12514和Ora-12514解决方法
实例讲解MSDB数据库置疑状态的解决方法
实例讲解SQL查询连续号码段的巧妙解法
用一个案例讲解应用程序越来越慢的原因
一则DB2数据库重定向表空间的恢复案例
SCN不一致将会导致ORA-00600 2662错误
Vista下安装SQL Sever 2005报错的解决办法
用一条SQL实现:一行多个字段数据的最大值

MSSQL 中的 SQL Server里函数的两种用法(可以代替游标)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 126 ::
收藏到网摘: n/a

 

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