【问题标题】:How to add/update record in a table by stored procedure in SQL Server when added/updated happens in another table当添加/更新发生在另一个表中时,如何通过 SQL Server 中的存储过程在表中添加/更新记录
【发布时间】:2019-01-30 01:29:13
【问题描述】:

我有一张如下所述的表格

主表:

id, application, type
1, ram, good
2, ramesh, average
3, suresh, good

辅助表

application_s, rank
ram, 2
ramesh, 4
suresh,1

现在.. 场景是主表中的“ram”应用程序替换为“Ramarajan”,“Suresh”替换为“Suresh kumar”。

如何在 SQL Server 中使用存储过程或任何方式进行上述更新?

【问题讨论】:

  • 所以你想在主表中应用发生变化时自动更新从表?
  • 要么创建一个存储过程来更新两个表并从您的应用程序中调用它。或者在主表上放置一个触发器来更新你的辅助表。
  • 我会说这种方法根本不正确。是的,您可以在第一个表上使用触发器,或者在存储过程中更新两个表,使它们保持一致。但正确的方法是为名称(id、名称)创建一个表,然后您的两个表都通过外键引用名称表。

标签: sql sql-server stored-procedures


【解决方案1】:

一种解决方案是在主表上创建一个触发器,触发方式如下:

  • 当主表为UPDATEd且application发生变化时,副表也发生变化
  • 当主表中有一条记录为DELETEd时,删除从表中对应的具有相同应用的记录
  • 当一条新记录INSERTed 到主表中时,一条新记录也插入到辅助表中(其他列为空)。

代码:

create trigger maintable_trigger
on maintable
after UPDATE, INSERT, DELETE
as
    if exists(select * from inserted) and exists (SELECT * from deleted)     --update
    begin
        update s 
        set s.application_s = i.application
        from secondarytable s
        inner join deleted d on d.application = s.application_s
        cross join inserted i;
    end

    if exists (select * from inserted) and not exists(Select * from deleted) --insert
    begin
        insert into secondarytable select i.application, null from inserted i;
    end

    if exists(select * from deleted) and not exists(Select * from inserted)  --delete 
    begin
        delete from secondarytable
        where exists (
            select 1 from deleted d where d.application = secondarytable.application_s
        )
    end

See it in action in this DB Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2015-03-07
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多