子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,?

hongjiajie 2007-08-04 10:13:17
tab_pers_info
pers_id 主键
pers_no
pers_name

图书借阅登记
id 主键
学号
姓名
现在我要级联修改,写了这样一个触发器
alter trigger alter_student_basic

on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
set nocount on
declare @student_number varchar(20)
set @student_number=(select pers_no from deleted)
declare @学号 varchar(20)
set @学号=(select pers_no from inserted)
declare @姓名 varchar(20)
set @姓名=(select pers_name from inserted)
update 图书借阅登记 set 借阅人学号=@学号,借阅人姓名=@姓名 where 借阅人学号=@student_number

如果在图书借阅登记表里有重复学号,修改tab_pers_info时就会出现返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时
没有重复学号时可以修改
这个怎么解决?
...全文
339 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongjiajie 2007-08-06
  • 打赏
  • 举报
回复
图书借阅登记
id 主键
学号
姓名
图书编号
是否归还

CREATE trigger trigger_update
on dbo.图书借阅登记
for update
as if update(是否归还)
set nocount on
DECLARE @借阅数量 tinyint
SET @借阅数量 = (SELECT 借阅数量 FROM Deleted)
DECLARE @借阅图书编号 varchar(20)
SET @借阅图书编号=(SELECT 借阅图书编号 FROM Deleted)
update 图书信息表 set 库存数量=库存数量+@借阅数量 where 图书编号=@借阅图书编号
paoluo 2007-08-06
  • 打赏
  • 举报
回复
hongjiajie() ( ) 信誉:100 2007-8-4 19:19:32 得分: 0



对的,我图书登记表上还有触发器
这是什么原因?



--------------

出錯的根本原因就是,你“图书登记表上的触发器”寫的有問題。
hongjiajie 2007-08-06
  • 打赏
  • 举报
回复
顶一下
paoluo 2007-08-04
  • 打赏
  • 举报
回复
hongjiajie() ( ) 信誉:100 2007-08-04 10:51:35 得分: 0


to paoluo(一天到晚游泳的鱼)
还是不行啊


----------------
提示什麼錯誤?
hongjiajie 2007-08-04
  • 打赏
  • 举报
回复
to paoluo(一天到晚游泳的鱼)
还是不行啊
paoluo 2007-08-04
  • 打赏
  • 举报
回复
boytomato(刺刀里带着思想!) ( ) 信誉:99 2007-08-04 10:28:06 得分: 0


set @student_number=(select top 1 pers_no from deleted)
declare @学号 varchar(20)
set @学号=(select top 1 pers_no from inserted)
declare @姓名 varchar(20)
set @姓名=(select top 1 pers_name from inserted)


---------------
這種定義變量的寫法在一次只更新一條的時候沒有問題,但是一次更新多條數據就會有問題。
paoluo 2007-08-04
  • 打赏
  • 举报
回复
或者

alter trigger alter_student_basic
on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
update A set 借阅人学号=B.pers_no,借阅人姓名=B.pers_name
From 图书借阅登记 , Inserted B Where A.借阅人学号=B.pers_no
GO
paoluo 2007-08-04
  • 打赏
  • 举报
回复
你那樣寫有很多弊端。

改用關聯來寫。
boytomato 2007-08-04
  • 打赏
  • 举报
回复
set @student_number=(select top 1 pers_no from deleted)
declare @学号 varchar(20)
set @学号=(select top 1 pers_no from inserted)
declare @姓名 varchar(20)
set @姓名=(select top 1 pers_name from inserted)
paoluo 2007-08-04
  • 打赏
  • 举报
回复
alter trigger alter_student_basic
on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
update A set 借阅人学号=B.pers_no,借阅人姓名=B.pers_name
From 图书借阅登记 Inner Join Inserted B On A.借阅人学号=B.pers_no
GO
hongjiajie 2007-08-04
  • 打赏
  • 举报
回复
对的,我图书登记表上还有触发器
这是什么原因?
paoluo 2007-08-04
  • 打赏
  • 举报
回复
--創建測試環境
Create Table tab_pers_info
(pers_id Int,
pers_no Char(3),
pers_name Varchar(10))

Insert tab_pers_info Select 1, '001', 'A1'
Union All Select 2, '002', 'A2'

Create Table 图书借阅登记
(id Int,
借阅人学号 Char(3),
借阅人姓名 Varchar(10))
Insert 图书借阅登记 Select 1, '001', 'A1'
Union All Select 2, '001', 'A1'
Union All Select 3, '002', 'A2'
GO
--創建觸發器
create trigger alter_student_basic
on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
update A set 借阅人学号=B.pers_no,借阅人姓名=B.pers_name
From 图书借阅登记 A, Inserted B, Deleted C Where A.借阅人学号 = C.pers_no And B.pers_id = C.pers_id
GO
--測試
Update tab_pers_info Set pers_no = '003', pers_name = 'A3' Where pers_no = '001'

Select * From 图书借阅登记
GO
--刪除測試環境
Drop Table tab_pers_info, 图书借阅登记
--結果
/*
id 借阅人学号 借阅人姓名
1 003 A3
2 003 A3
3 002 A2
*/
paoluo 2007-08-04
  • 打赏
  • 举报
回复
alter trigger alter_student_basic
on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
update A set 借阅人学号=B.pers_no,借阅人姓名=B.pers_name
From 图书借阅登记 A, Inserted B, Deleted C Where A.借阅人学号 = C.pers_no And B.pers_id = C.pers_id
GO
paoluo 2007-08-04
  • 打赏
  • 举报
回复
如果對比下你原來的代碼,發現還是有些出入。

如果只是修改pers_name,這個觸發器沒有問題。

需要做下修改。
paoluo 2007-08-04
  • 打赏
  • 举报
回复
hongjiajie() ( ) 信誉:100 2007-08-04 14:09:40 得分: 0


跟以前一样

-----------------

沒道理。

你的图书借阅登记表上是否有觸發器。

語句有點小錯誤,需要加個別名。

但是不會是報你那個錯誤。

create trigger alter_student_basic
on dbo.tab_pers_info
for update
as if update(pers_no) or update(pers_name)
update A set 借阅人学号=B.pers_no,借阅人姓名=B.pers_name
From 图书借阅登记 A, Inserted B Where A.借阅人学号=B.pers_no
hongjiajie 2007-08-04
  • 打赏
  • 举报
回复
跟以前一样

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧