Sql server 用于更新插入行的SQL Server触发器

Sql server 用于更新插入行的SQL Server触发器,sql-server,tsql,triggers,sql-server-2012,sql-update,Sql Server,Tsql,Triggers,Sql Server 2012,Sql Update,我想为此创建一个触发器:我有两个表: 表1: id-整数-主键 状态-整型-值:1表示忙,0表示可用 表2: id-整数-主键-自动生成 id2-整数-NULL或表1中id的值 状态-整数-值:1用于工作0用于等待 col1-不相关的列1 col2-无关列2 col3-无关列3 当用户这样做的时候 INSERT INTO table2 (col1, col2, col3) VALUES (val1, val2, val3); 触发器应检查table1,如果找到可用id status=0,则更新

我想为此创建一个触发器:我有两个表:

表1:

id-整数-主键 状态-整型-值:1表示忙,0表示可用 表2:

id-整数-主键-自动生成 id2-整数-NULL或表1中id的值 状态-整数-值: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,15级,状态1,程序myTrigger,第17行 “=”附近的语法不正确

第17行:设置状态=1

Msg 156,15级,状态1,程序myTrigger,第22行 关键字“where”附近的语法不正确

第22行:其中table2.id=Inserted.id

如果你觉得宽宏大量,我需要做的下一件事就是创建一个触发器,当一列从表2中删除时,它会将表1中相应id的状态设置为0


我正在使用SQL Server 2012

您的第二条语句缺少update命令:

    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;

这将修复您的错误,但是,您的整个触发器可以重构为更干净一点,但这超出了问题的范围。

您的第二个语句缺少update命令:

    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;

这应该可以修复您的错误,但是,您的整个触发器可以重构为更干净一点,但这超出了问题的范围。

您的触发器中有很多错误,并且有一个逻辑本身。您说您可以在table2 ID列中使用NULL,但它是具有自动生成属性的PK…插入和删除的表可以表示集合操作的结果。在假设触发器总是只处理一行的情况下设计触发器通常是一个糟糕的计划。如果您绝对确定不会有超过一行,那么请添加对行数的检查,并使用RaIsError或Throw显式通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1 RaIsError“FooTable_Insert:最多只能处理一行”。、25、42和LOG您的触发器中有很多错误,逻辑本身也有很多错误。您说您可以在table2 ID列中使用NULL,但它是具有自动生成属性的PK…插入和删除的表可以表示集合操作的结果。在假设触发器总是只处理一行的情况下设计触发器通常是一个糟糕的计划。如果您绝对确定不会有超过一行,那么请添加对行数的检查,并使用RaIsError或Throw显式通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42和日志table2.id=inserted.id的位置如何?我更改了这一点,现在除了一个错误外没有其他错误,它无法识别、、inserted Msg 4104、级别16、,状态1,过程triggerTransporturi,第12行插入的多部分标识符。id无法绑定。@太棒了,这就是我的评论要点。您应该在插入的表上有一个联接。更新了使用联接的答案,但当时没有考虑这个问题。老实说,整个触发器都需要重写。这至少可以解决问题。你会想要构造你的其他更新,这样它也和这个类似。酷。你能投票接受这个答案吗?我不知道为什么会被否决。那么table2.id=Inserted.id的位置呢?我改变了,现在没有错误,只有一个错误,它无法识别插入的Msg 4104,16级,状态1,过程triggerTransporturi,第12行插入的多部分标识符Inserted.id无法绑定。@太棒了,这就是我的评论要点。您应该在插入的表上有一个联接。更新了使用联接的答案,但当时没有考虑这个问题。老实说,整个触发器都需要重写。这至少可以解决问题。你会想要构造你的其他更新,这样它也和这个类似。酷。你能投票接受这个答案吗?我不知道为什么会被否决。