SQL 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 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里函数的妙用。
- · sql server的cube操作符使用详解
- · SQL服务器内存有两种基本管理方法:动态分配和静态分配
- · SQL Server SA权限总结经典技术
- · 两台SQL Server数据同步解决方案
- · ASP中实现小偷程序的原理和简单
- · ASP中遍历和操作Application对象的集合
- · 对于ASP编码问题的深入研究与最终解决方案
- · MySQL 5.0.16 乱码问题处理办法
- · ASP.NET入门随想之抽象的力量
- · 在C#中利用DirectX实现声音播放
- · 对C# 2.0中匿名方法的怀疑分析
- · 修改SQL SERVER内置存储过程
- · ASP.NET中实现Flash与.NET的紧密集成
- · ASP在SQL Server 2k中新建帐号和权限
- · 在Asp程序中取得表单所有内容的方法
- · PHP在安全方面的另类应用
- · ASP中Cookie读写的实现方法
- · asp调用存储过程
- · ASP六大对象介绍
- · 备份和还原 IIS
- · 弹出窗口总结收集(续)
- · SQL安全设置攻略
- · FTP服务的LIST指令获取的文件列表信息的解析
- · 加强Win 2003系统安全性技巧四招
- · Win下的Apache+PHP+MySql+虚拟主机设置全功略
- · JSP开发的安全编程实例详细解析
- · ASP检索网站指定目录文件的算法与应用方向
- · 使PHP自定义函数返回多个值
- · 游戏私服安全配置精华技巧
- · xml-rpc学习笔记
- · 使用Exchange 2003防御地址欺骗
- · 国内.NET论坛源代码不完全搜集
- · 上传多个文件的PHP脚本
- · ASPX保存远程图片到本地的两种方法的函数
- · vml 实现饼图的代码
- · Windows下配置PHP环境
- · 用JavaScript实现网页上的浮动广告
- · 自适应图片大小的弹出窗口
- · XML卷之实战锦囊(3):动态分页
- · Zeus 4.3 For Freebsd安装指南
- · phpBB的viewtopic highlight漏洞在unix下的入侵思路
- · 常用的匹配正则表达式和实例
- · MRTG(多路由器流量图示器)Windows 2000部署指南
- · 直接获取access、SQL Server等数据库数据
- · 在ASP中操作HTTP报头方法分析
- · 使用MySQL内建复制功能来最佳化可用性
- · ServerVariables 对路径的操作
- · 一个显示天气预报的程序
- · 一个查看session内容的函数
- · “在线访客”的制作方法
- · Connection对象的应用
- · 利用文件属性结合Session实现在线人数统计
- · 新版PHP极大的增强功能和性能
- · TreeView使用笔记
- · 关于Adodb.Stream的写数据库数据到客户端文件的实践
- · 分栏显示记录集的表格演示,并实现了分页
- · Adodb.Command 平时很少注意到的一个参数
- · 将ASP的Debug变得简单的两个函数
- · ASP调用ORACLE存储过程并返回结果集
- · ASP中使用Form和QueryString集合

