【问题标题】:Insert rows into a table from updated rows in another table TRIGGER将行从另一个表中的更新行插入到表中 TRIGGER
【发布时间】:2018-02-13 09:44:29
【问题描述】:

我有 2 个常规表(Table1 和 Table2)和一个临时表(TempTable)。我正在从 Table2 中的行更新 Table1 中的行:

update t1
set t1.[Table1] = t2.[Price]
FROM
[Table1] t1
JOIN [Table2] t2 on t1.[KAT_ID] = t2.            
[KAT_ID]
where t1.[Price] != t2.[Price]

我想在 Table1 上创建一个触发器,将所有更新的行插入到 TempTable 中。这是我目前所拥有的:

CREATE TRIGGER [dbo].[TABLE1_TRIGGER] ON [dbo].[Table1]
AFTER UPDATE
AS 

IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL DROP TABLE 
##TempTable
CREATE TABLE ##TempTable(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[KAT_ID] [varchar](50) NULL,
[Price] [money] NULL)

我不知道如何将更新的行插入到 TempTable 中。

【问题讨论】:

  • 为什么要将这些插入到全局临时表中?老实说,这些是可怕的。您最好将其放置在某种临时表或其他东西中。您在这里的全部目标是什么?
  • 看起来是 XY 问题
  • 修改前(旧值)还是修改后(新值)要插入哪些记录?
  • 将 Log 数据插入 Global temp Temple 的必要性是什么。临时表的范围不是永远的。你最好想想物理表。

标签: sql sql-server triggers insert sql-update


【解决方案1】:

您最好将数据放在某种临时表中,而不是全局临时表中。正如我在评论中所说,他们的表现非常糟糕。

首先,我们将从某种临时表开始。我不知道你的设置是什么,所以我们也会为其设置一个架构:

CREATE SCHEMA staging;
CREATE TABLE staging.[RelevantNameHere] (ID bigint IDENTITY(1,1),
                                         KAT_ID varchar(50),
                                         Price money);
GO

然后我们可以进入触发器:

CREATE TRIGGER [dbo].[TABLE1_TRIGGER] ON [dbo].[Table1]
AFTER UPDATE
AS 
    TRUNCATE TABLE staging.[RelevantNameHere];

    INSERT INTO [RelevantNameHere] (KAT_ID, Price)
    SELECT i.KAT_ID, i.Price
    --In a trigger such as this, there are 2 additional objects you can refer to
    --[inserted] and [deleted]. The names are a give away as to what they contain.
    FROM inserted i; 
GO

当然,这是基于我们这里掌握的非常有限的信息。我非常怀疑您描述的问题实际上是您遇到的问题。您可能会更好地在帖子中解释您的全部目标和目的;很可能有比上述更好的答案。

【讨论】:

    【解决方案2】:

    我猜下面是您要查找的查询。

    CREATE TRIGGER [dbo].[TABLE1_TRIGGER] ON [dbo].[Table1]
    AFTER UPDATE
    AS 
    
    IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL 
    DROP TABLE ##TempTable
    
    CREATE TABLE ##TempTable(
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [KAT_ID] [varchar](50) NULL,
    [Price] [money] NULL)
    
    INSERT INTO ##TempTable (KAT_ID,Price)
    
    SELECT KAT_ID,Price FROM [INSERTED] 
    

    【讨论】:

    • 您对不使用全局临时表的问题发表了评论,但在您的回答中使用了一个。这不是有点矛盾吗?
    • 根据 OP 要求,我使用了临时表(应由 OP 根据他的需要更改)。但使用临时表不是一个好习惯。
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多