首页 新闻 会员 周边 捐助

sql server 2008触发器怎么实现oracle里边for each row的行级触发器的效果,用循环应该怎么做,求关键代码

0
悬赏园豆:20 [已解决问题] 解决于 2014-08-26 10:38

有户型HUXING表,关键字段有ID,均价PRICE,面积square,总价totalprice

要求每更新一次就重新计算一次总价=面积*均价,我写的只更新一条时没错,但更新多条时只执行最后一条,如题,怎么实现行级触发器效果,即更新多条时触发器也执行多次

吃俺老孙一棒的主页 吃俺老孙一棒 | 初学一级 | 园豆:38
提问于:2014-08-25 16:04
< >
分享
最佳答案
1

没听说过SQL SERVER的Trigger是只更新最后一条的,不知道你是否误安装了SQL SERVER 1990 BETA版。

要不然麻烦自己搞一下简单的测试。

为了证明这点,我居然闲的发慌真了弄了个数据表进行了简单的测试。

我居然连这种最起码的信任都没有给到微软,请原谅我吧,BILL。

数据表名test_table31, 数据表内有三行数据,第一列是GUID,PrimaryKey,你别管他叫啥字段名了。

7650d1ed-9779-472e-8b9d-005ac317ac81 name1 1
a20a0d30-fdb0-4ab4-8b5a-5ca785b43de2 name2 2
8770a802-e044-433e-b3e6-a478ae29df09 name3 3

Trigger是这样的

Update test_Table1 set Value=Inserted.Value+1 from Inserted where test_table1.TestID=Inserted.TestID

这是我的查询语句

Update test_table1 set name=name + '_update'

下面是执行结果

(3 行受影响)

(3 行受影响)    -----这是Trigger在执行的结果。

 

这是结果的数据行

7650d1ed-9779-472e-8b9d-005ac317ac81 name1_update 2
a20a0d30-fdb0-4ab4-8b5a-5ca785b43de2 name2_update 3
8770a802-e044-433e-b3e6-a478ae29df09 name3_update 4

注:最后一列的值原来是1、2、3

收获园豆:20
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-08-25 17:25
declare @ID int
    declare @HuXingSquare float
    declare @HuXingHouseId nvarchar(255)
    declare @HuXingPrice nvarchar(255)
    declare @HuXingShouFuBiLi float
    select @ID=ID,@HuXingSquare=HuXingSquare,@HuXingHouseId=HuXingHouseId,@HuXingPrice=HuXingPrice,@HuXingShouFuBiLi=HuXingShouFuBiLi from inserted
    if(@HuXingPrice!=0)
        update PE_U_HuXingPhoto set PE_U_HuXingPhoto.HuXingShouFu=@HuXingSquare*@HuXingPrice*@HuXingShouFuBiLi where PE_U_HuXingPhoto.ID=@ID
    else
        update PE_U_HuXingPhoto set PE_U_HuXingPhoto.HuXingShouFu=@HuXingSquare*@HuXingShouFuBiLi*PE_U_House.HousePrice from PE_U_HuXingPhoto,PE_U_House where PE_U_House.ID=@HuXingHouseId and PE_U_HuXingPhoto.ID=@ID

业务逻辑就是,楼盘下有多个户型,若户型有价格则用户型价格,若无则用楼盘均价计算总价,这个单次修改时没问题,一次修改多条就不行了,问题出在哪儿,求教大虾

吃俺老孙一棒 | 园豆:38 (初学一级) | 2014-08-26 10:05

@吃俺老孙一棒: 

晕倒,你这个@ID只能保存一个值,骚年你不知道这事吗?

你要记住一点,就是这个Trigger只执行一次,不管你Update几条数据,而不是

修改一条数据执行一次。

所以Inserted这是一个表,而不是一行数据。

这样理解,你再去修改你的SQL语句就可以了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-08-26 10:13

@爱编程的大叔: 了了,就是把inserted表与我的PE_U_HuXingPhoto表联查,把ID当做公共字段,3Q

吃俺老孙一棒 | 园豆:38 (初学一级) | 2014-08-26 10:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册