在一个表中查找数据并更新另一个表

时间:2016-01-14 20:28:30

标签: sql-server-2008 triggers

我需要一个触发器,在触发更新表中的特定列时触发,并使用来自其他两个表的数据更新其他列。

表1称为STOCK_ITEMS

相关列是所有外键

  • STOCKGROUP是表STOCK_GROUPS
  • 的FK
  • STOCKGROUP2是表STOCK_GROUP2S
  • 的FK
  • X_STOCK_GROUP3X_STOCK_GROUP3S
  • 的FK

X_STOCK_GROUP3S包含其他两个库存组表的FK。 我们的想法是让前两列依赖于第三列,这样如果X_STOCK_GROUP3的值发生变化,此触发器将使用来自{的数据设置STOCKGROUPSTOCKGROUP2的值。 {1}}

我试过了:

X_STOCK_GROUP3S

它不起作用。它不喜欢我的'='标志。或者还有其他我想念的东西(很可能!!)

任何和所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

唐'知道我是否明白你想做什么。 X_STOCK_GROUP3S包含一些记录 (ID,STOCKGROUP,STOCKGROUP2)
(21,1000,300)
(22,2000,200)
(23,3000,100)

和STOCK_ITEMS包含类似的记录 (ID,...,STOCKGROUP,STOCKGROUP2,X_STOCK_GROUP3)

如果表STOCK_ITEMS的X_STOCK_GROUP3更新为21,则要将值STOCKGROUP设置为1000,将STOCKGROUP2设置为300.

这是你想要完成的吗? 那么你的代码缺少一些选择标准。 我会尝试这样的事情

CREATE TRIGGER STOCKGROUP
ON [dbo].[STOCK_ITEMS]
FOR UPDATE 
AS 
  SET NOCOUNT ON;
  IF UPDATE (X_STOCK_GROUP3)
    UPDATE STOCK_ITEMS SET STOCKGROUP = (
      SELECT STOCKGROUP FROM X_STOCK_GROUP3S 
      WHERE STOCK_ITEMS.X_STOCK_GROUP3 = X_STOCK_GROUP3S.ID
    ),
    STOCKGROUP2 = (
      SELECT STOCKGROUP2 FROM X_STOCK_GROUP3S 
      WHERE STOCK_ITEMS.X_STOCK_GROUP3 = X_STOCK_GROUP3S.ID
    )
    WHERE ID IN (SELECT ID FROM deleted);
GO

答案 1 :(得分:0)

好的,所以这是最终的,也是成功的结果:

荣誉称赞:Sonny Dhaliwal - 支持顾问 - Enprise Solutions。谢谢Sonny。

USE [MyDataBase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[X_SET_STOCK_GROUPS]
ON [dbo].[STOCK_ITEMS]
FOR UPDATE
AS
DECLARE @STOCKCODE VARCHAR(100),
        @STOCKGROUP3 INTEGER,
        @STOCKGROUP1 INTEGER,
        @STOCKGROUP2 INTEGER
BEGIN

    SELECT @STOCKCODE = STOCKCODE FROM inserted
    SELECT @STOCKGROUP3 = X_STOCK_GROUP3 FROM inserted
    SELECT @STOCKGROUP1 = (SELECT SECONDARY_GROUP FROM X_STOCK_GROUP3S 
        WHERE SEQNO = @STOCKGROUP3)
    SELECT @STOCKGROUP2 = (SELECT PRIMARY_GROUP FROM X_STOCK_GROUP3S 
        WHERE SEQNO = @STOCKGROUP3)


    BEGIN
        UPDATE STOCK_ITEMS 
        SET STOCKGROUP = @STOCKGROUP1, STOCKGROUP2 = @STOCKGROUP2 
        WHERE STOCKCODE = @STOCKCODE
    END
END
GO