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

2016-01-29 16:27 82 1 收藏

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

【 tulaoshi.com - SQLServer 】

 

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

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

 

来源:http://www.tulaoshi.com/n/20160129/1498635.html

延伸阅读
Sql Server中的日期与时间函数 1.  当前系统日期、时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值    例如:向日期加上2天    select dateadd(day,2,'2004-10-15')  --返回:2004-10-17 00:00:00.000 3. datedif...
VB中打开AutoRedraw可方便的建立双缓冲,利用API在后台绘图,最后一次性整体更新到前台,实现稳定无闪烁的动画效果,一般情况下,VB会自动进行后台到前台的刷新,这主要有两种情况:1、收到WM_PAIT消息2、代码调用Refresh方法 能让VB收到WM_PAIT消息的情况主要有1、窗体被遮盖或隐藏后重现2、调用任何VB内部的图形方法,包括PaintPicture、Pri...
标签: SQLServer
  killergo的专栏 最近因为稍微有点空闲时间,所以想了下在sql server平台用存储过程的分页方式,现在列示在下面。 实际测试时,在15000条数据情况下两者性能大体相当,在20000-30000条数据的情况下前者明显比后者性能更佳。更大数据量没有进行测试了。 注意,数据表里面是否有 键和索引 对性能的影响相当大 ------------------------...
标签: SQLServer
一、 简介 在2005年11月份,微软发行了三种新产品系列:Visual Studio 2005,SQL Server 2005和.NET框架2.0(它包括ASP.NET 2.0)。SQL Server 2005是微软自从其上一个主要发行版本SQL Server 2000以来最新版本的数据库平台。在过去五年的发展中,SQL Server中加入了大量的新特征,所有这些新内容都被总结到微软网站的一篇文章《What's New...
1、设置内存选项 --设置 min server memory 配置项 EXEC sp_configure N'min server memory (MB)', 0 --设置 max server memory 配置项 EXEC sp_configure N'max server memory (MB)', 256 --使更新生效 RECONFIGURE WITH OVERRIDE 2、使用文件及文件组 /*--功能说明 下面的代码是在SQL Server ...

经验教程

676

收藏

71
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部