现在有2个数据库DBA和DBB,里面均有A表(A,B,C),属性都是INT,DBB里的A表中有大量的数据,程序在处理完之后会把C列的值改为1,我想用触发器把值为1的C列自动添加进DBA中的A表里,并且删除DBB中相关的数据,我写的代码是
CREATE TRIGGER [dbo].[INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT AS
DECLARE @A INT
DECLARE @B INT
DECLARE @C INT
IF UPDATE(C)
BEGIN
SET @A=(SELECT A FROM A)
SET @B=(SELECT B FROM A)
SET @C=(SELECT C FROM A)
INSERT INTO DBA.DBO.A(A,B,C)VALUES(@A,@B,@C)
DELETE FROM A WHERE C=1
END
SQL提示消息 512,级别 16,状态 1,过程 INSERT_IN_DBA,第 9 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
应该怎么修改
------解决思路----------------------
SET @A=(SELECT A FROM A) 这个不行的
因为你后面查询可能返回多个值。不能赋值给变量。要用SELECT。这样会把最后一个值赋值给变量。
你这样还是有问题。
insert into DBA.DBO.A
select * from inserted
where c=1
------解决思路----------------------
你用FOR insert,update啊
------解决思路----------------------
create table a (a int,b int, c int )
insert into a values(1,1,0),(2,2,0)
create table b (a int, b int,c int)
go
create TRIGGER [INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT,update AS
IF UPDATE(C)
BEGIN
INSERT INTO b(A,B,C)
SELECT * FROM inserted WHERE C=1
DELETE FROM A WHERE C=1
END
update a set c=1 where a=1
--结果
a b c
----------- ----------- -----------
2 2 0
(1 行受影响)
a b c
----------- ----------- -----------
1 1 1
(1 行受影响)
我测试的没问题啊。实现了插入到表B 。删除表A的记录啊。
------解决思路----------------------
你试下
CREATE TRIGGER [dbo].[INSERT_IN_DBA]
ON [dbo].[A]
FOR INSERT,UPDATE AS
IF UPDATE(C)
BEGIN
INSERT INTO A2
SELECT * FROM A WHERE C=1
DELETE FROM A WHERE C=1
END
GO