sql server触发器 子查询返回值不止一个 如何解决?

例如,插入两名学生的记录各一条插入某表中,触发器便无法执行。... 例如,插入两名学生的记录各一条插入某表中,触发器便无法执行。 展开
 我来答
wangzhiqing999
推荐于2016-05-04 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3361万
展开全部
你说的是
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 的数据,没有被触发器处理。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
菲城歌110
2012-05-05
知道答主
回答量:28
采纳率:0%
帮助的人:3.9万
展开全部
where in (子查询)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式