Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从另一个表触发器中更新的行向表中插入行_Sql_Sql Server_Triggers_Insert_Sql Update - Fatal编程技术网

Sql 从另一个表触发器中更新的行向表中插入行

Sql 从另一个表触发器中更新的行向表中插入行,sql,sql-server,triggers,insert,sql-update,Sql,Sql Server,Triggers,Insert,Sql Update,我有两张普通桌子(表1和表2)和一张临时桌子(诱惑)。我正在从表2中的行更新表1中的行: 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] 我想在表1上创建一个触发器,将所有更新的行插入到表1中。这就是我到目前为止所做的: CREATE TRIGGER [

我有两张普通桌子(表1和表2)和一张临时桌子(诱惑)。我正在从表2中的行更新表1中的行:

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]
我想在表1上创建一个触发器,将所有更新的行插入到表1中。这就是我到目前为止所做的:

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)

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

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

首先,我们将从某种暂存表开始。我不知道您的设置是什么,因此我们也将为其设置一个模式:

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

当然,这是在利用我们这里所掌握的非常有限的信息。我很怀疑你所描述的问题实际上就是你所遇到的问题。你可能会更好地解释你的全部目标和目的是在你的职位;很可能会有一个比上面更好的答案。

我想下面就是您要寻找的问题

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] 

为什么要将它们插入到全局临时表中?老实说,这些都很糟糕。你最好把它放在某种临时桌上,或者别的什么地方。您的全部目标是什么?这看起来像是一个XY问题,在修改之前(旧值)或修改之后(新值),您希望插入哪些记录?将日志数据插入全局临时文件的必要性是什么。临时表的作用域不是永久的。您最好考虑物理表。您对不使用全局临时表的问题进行了评论,但在回答中使用了一个。这不是有点矛盾吗?根据OP的要求,我使用了临时表(应该由OP根据他的需要进行更改)。但使用临时表不是一个好的做法。