中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > MSSQL Server
分析MS SQL Server里函数的两种用法
作者:tech.ddvip.com 时间:2007-06-25 16:21 出处:tech.ddvip.com 责编:月夜寒箫
              摘要:分析MS SQL Server里函数的两种用法

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

 

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

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有