ALTER TRIGGER 班级表人数添加
ON dbo.学生信息表
FOR insert
AS
begin
declare
@人数 int,
@班级编号 int
set @班级编号=(SELECt 班级编号 FROM inserted)
set @人数=(SELECt COUNT(学生信息表.学号) FROM 学生信息表 INNER JOIN 班级表 ON 学生信息表.班级编号 = 班级表.班级编号
WHERe (学生信息表.班级编号 =@班级编号))
update 班级表 set 人数=@人数 where 班级编号=@班级编号
end
---------------------
当我批量导入数据的时候出现子查询返回的不止一个值,单独插入一条数据不会有问题
下面的~不可以~还是不行,在数据库里面导入可以~通过我的程序导入就不可以了~
sql 触发器 子查询返回的不止一个值
答案:2 悬赏:70 手机版
解决时间 2021-03-14 03:18
- 提问者网友:辞取
- 2021-03-13 11:21
最佳答案
- 五星知识达人网友:污到你湿
- 2021-03-13 12:06
当然有问题,你设的参数只能取到一个值,所以如果你插入一行就没有问题,超过一行就不对。
ALTER TRIGGER 班级表人数添加
ON dbo.学生信息表
FOR insert
AS
begin
update a set a.人数=b.人数
from 班级表 a,(select 班级编号,count(*) 人数 from inserted group by 班级编号) b
where a.班级编号=b.班级编号
end
ALTER TRIGGER 班级表人数添加
ON dbo.学生信息表
FOR insert
AS
begin
update a set a.人数=b.人数
from 班级表 a,(select 班级编号,count(*) 人数 from inserted group by 班级编号) b
where a.班级编号=b.班级编号
end
全部回答
- 1楼网友:青灯有味
- 2021-03-13 13:26
你说的是
select ...... from inserted; 返回多行的情况么?
--假设这个a是主表
create table a(
aid int identity(1, 1) primary key,
money int
);
-- 假设这个b是 日志表, 负责记录 a表 发生的变化。
create table b(
bid int identity(1, 1) primary key,
aid int,
money int
);
go
-- 假设这个c也是日志表, 负责记录 a表 发生的变化。
-- 但是这个c表是用于演示 不正确使用的例子。
create table c(
cid int identity(1, 1) primary key,
aid int,
money int
);
go
-- 测试的存储过程
-- 当 a 表 插入 / 更新 / 删除的时候i, 都触发。
create trigger aftera
on a
for insert,update,delete
as
declare @aid int, @money int;
begin
if exists(select 1 from inserted) and not exists(select 1 from deleted)
begin
-- 插入触发.
-- 正确的使用.
insert into b
select
inserted.aid,
inserted.money
from
inserted;
-- 不正确的使用.
select @aid = aid, @money = money from inserted;
insert into c values ( @aid, @money);
end;
if exists(select 1 from inserted) and exists(select 1 from deleted)
begin
-- 更新触发.
-- 正确的使用.
insert into b
select
inserted.aid,
inserted.money - deleted.money
from
inserted, deleted
where
inserted.aid = deleted.aid;
-- 不正确的使用.
select @aid = aid, @money = money from inserted;
select @money = @money - money from deleted;
insert into c values ( @aid, @money);
end;
if not exists(select 1 from inserted) and exists(select 1 from deleted)
begin
-- 删除触发
-- 正确的使用.
insert into b
select
deleted.aid,
0 - deleted.money
from
deleted;
-- 不正确的使用.
select @aid = aid, @money = 0 - money from deleted;
insert into c values ( @aid, @money);
end;
end;
go
-- 一条sql语句,插入一条数据
insert into a values (100);
-- 一条sql语句,插入多条数据
insert into a
select 10
union all select 20;
go
-- 一条sql语句,更新一条数据
update a set money = money - 50 where aid = 1;
-- 一条sql语句,更新多条数据
update a set money = money + 50 where aid != 1;
go
-- 一条sql语句,删除一条数据
delete from a where aid = 1;
-- 一条sql语句,删除多条数据
delete from a where aid != 1;
go
select * from b
go
bid aid money
----------- ----------- -----------
1 1 100
2 3 20
3 2 10
4 1 -50
5 3 50
6 2 50
7 1 -50
8 3 -70
9 2 -60
(9 行受影响)
select * from c
go
cid aid money
----------- ----------- -----------
1 1 100
2 2 10
3 1 -50
4 2 30
5 1 -50
6 2 -60
(6 行受影响)
这里, aid = 3 的数据,没有被触发器处理。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯