我想为此创建一个触发器:我有两个表:
表1:
id
- 整数 - 主键status
- 整数 - 值:1表示忙碌,0表示可用表2:
id
- 整数 - 主键 - 自动生成id2
- 整数 - NULL或table1 status
- 整数 - 值:1代表工作0等待col1
- 无关的第1列col2
- 无关的第2列col3
- 无关的第3列当用户这样做时
INSERT INTO table2 (col1, col2, col3)
VALUES (val1, val2, val3);
触发器应检查table1,如果找到并且可用id(status = 0),则更新插入的行table2.id2 = table1.id,table2.status变为1,否则table2.id2保持为NULL,table2.status变为0
现在我尝试了很多方法,并且总是收到错误消息。
这是我最近的尝试:
CREATE TRIGGER myTrigger
ON table2
AFTER INSERT
AS
BEGIN
IF NOT EXISTS (SELECT TOP 1 id
FROM table1
WHERE status = 0)
BEGIN
UPDATE table2
SET status = 0
WHERE table2.id = Inserted.id
END
ELSE
BEGIN
SET status = 1
WHERE table2.id = Inserted.id
SET table.id@ = (SELECT TOP 1 id
FROM table1
WHERE status = 0)
WHERE table2.id = Inserted.id
END
END
和错误:
Msg 102,Level 15,State 1,Procedure myTrigger,Line 17
'='附近的语法不正确。第17行:设置状态= 1
Msg 156,Level 15,State 1,Procedure myTrigger,Line 22
关键字'where'附近的语法不正确。第22行:table2.id = Inserted.id
如果您感到慷慨,我需要做的下一件事就是创建一个触发器,当从table2中删除一列时,它会将table1中相应id的状态设置为0(可用)
我正在使用SQL Server 2012
答案 0 :(得分:3)
您的第二个陈述缺少更新命令:
set status=1
where table2.id= Inserted.id
set table.id@ = (Select TOP 1 id
from table1
where status=0)
where table2.id= Inserted.id
应该是
update table2 set table2.status=1,
table2.id = (Select TOP 1 id
from table1
where status=0)
join Inserted as i
on table2.id= Inserted.id;
这应该可以解决您的错误,但是,您的整个触发器可能会被重构为更清晰,但这超出了问题的范围。