注册 登录
编程论坛 SQL Server论坛

关于 游标 的问题

风流上进 发布于 2007-09-28 15:04, 1235 次点击
表a
cid res
500:0.5 0
2000:0.3 0
5000:0.2 0
通过游标 更新 表a 使 res 的值为 cid 字段中 “:” 前的值乘以“:”后的值。
更新完的效果如下:
cid res
500:0.5 250 (250=500*0.5)
2000:0.3 600 .....
5000:0.2 1000 .....
谁能给指点一下



15 回复
#2
purana2007-09-28 15:17

[CODE]create table #t(
cid varchar(100),
res float
)
insert into #t values('500:0.5',0)
insert into #t values('2000:0.3',0)
insert into #t values('5000:0.2',0)
go
declare @cid varchar(100),@res float
declare @l varchar(50),@r varchar(50)
declare @k float
declare c cursor
for select cid,res from #t for update of res
open c
fetch c into @cid,@res
while @@fetch_status=0
begin
set @l=left(@cid,charindex(':',@cid)-1)
set @r=substring(@cid,charindex(':',@cid)+1,len(@cid)-charindex(':',@cid))
set @k=cast(@l as float)*cast(@r as float)
update #t set res=@k where current of c
fetch c into @cid,@res
end
close c
deallocate c
select * from #t
drop table #t[/CODE]


#3
purana2007-09-28 15:17
500:0.5 250.0
2000:0.3 600.0
5000:0.2 1000.0
#4
风流上进2007-09-28 15:44
purana 好厉害

游标的那个 for 和 fetch 的用法具体的说一下
这两个关键字没有完全搞清楚
谢谢
#5
purana2007-09-28 15:51

教程.都有讲到啊..

#6
purana2007-09-28 16:00
我不厉害.
我学sql server还不到1个月..
#7
风流上进2007-09-28 16:19
还不到1个月......... 你真让我汗颜 ........
#8
风流上进2007-09-28 17:07
purana 假如说
表a
cid res
500:0.5 0
2000:0.3 0
5000:0.2 0
res 的值 = 下一条记录的“:”前的值减上一条记录":"前的值,然后再乘以 上一条记录 ":"后的值 怎么用 游标写
表a
cid res
500:0.5 750 (2000-500)*0.5
2000:0.3 900 (5000-2000)*0.3
5000:0.2 0

#9
purana2007-09-28 17:48

这是什么需求?

#10
风流上进2007-09-29 08:36
purana 那样的话能实现么?
#11
西风独自凉2007-09-29 09:11
樓主的問題,這句應該就可以解決吧...有需要用到遊標麼???
update a set res=left(cid,charindex(':',cid,1)-1) * right(cid,len(cid)-charindex(':',cid,1))

[此贴子已经被作者于2007-9-29 9:12:19编辑过]

#12
purana2007-09-29 09:25
楼上的.类型是不匹配.
#13
西风独自凉2007-09-29 09:55
转化一下即可。。。
#14
purana2007-09-29 10:00
不会转.
#15
风流上进2007-09-29 10:13
事情是这样的,我最近在用sql处理一个问题:写一个sql函数,处理这样一系列的字符串
100(500:0.5)(2000:0.3)0.6 ;
50(150:0.5)(500:0.4)0.35 ;
500(1000:0.5)(3000:0.3)(10000:0.25)0.2 ;
......
这是一系列报销比例字符串
"(" 最左边的100,50,500 是报销的起付线,消费金额只有 > 起付线 后才给报销。
"()" 内 ":" 左边的是报销比例段,右边是报销比例。
拿第一个来说
起付线是100,500元以下部分报销比例是0.5,2000元以下部分报销比例是0.3,
超过2000元的部分报销比例是0.6
假如消费金额为 5000
首先减掉起付线 5000 - 100 = 4900
这4900属于报销范围内的,
500元以下报销金额为 (500-起付线)* 0.5 = 200
2000元以下报销金额为 (2000-500)* 0.3 = 450
剩下的部分报销金额为 (4900-400-1500)* 0.6 = 1200
总的报销金额为 200 + 450 + 1200 = 1850
大体的意思就是这样。
要求写一个 sql 函数
"BLC(@相应的报销比例字符串,@消费金额)", 能计算得出报销的金额。
#16
西风独自凉2007-09-29 10:37
以下是引用purana在2007-9-29 10:00:56的发言:
不会转.

update a set res=convert(numeric,left(cid,charindex(':',cid,1)-1)) * convert(numeric,right(cid,len(cid)-charindex(':',cid,1)))

1