Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 server 使用触发器更新多个表-SQL Server_Sql Server_Tsql - Fatal编程技术网

Sql server 使用触发器更新多个表-SQL Server

Sql server 使用触发器更新多个表-SQL Server,sql-server,tsql,Sql Server,Tsql,我需要根据tableB中的插入更新tableA。我已经创建了一个触发器,当一行被插入到tableB中时触发它,并简单地将它复制到tableA(这正是我想要的)。但当我更新tableB中的现有记录时,问题来了,tableA中的行已经存在,并且具有相同的主键 为了解决这个问题,我尝试删除tableA中主键与更新的行匹配的现有行,然后简单地从“inserted”表中插入该行。但是,tsql不允许我从触发器中删除我,并给出一个错误,声明“插入的多部分标识符”。Id“无法绑定” 以下是我试图在代码方面实现

我需要根据tableB中的插入更新tableA。我已经创建了一个触发器,当一行被插入到tableB中时触发它,并简单地将它复制到tableA(这正是我想要的)。但当我更新tableB中的现有记录时,问题来了,tableA中的行已经存在,并且具有相同的主键

为了解决这个问题,我尝试删除tableA中主键与更新的行匹配的现有行,然后简单地从“inserted”表中插入该行。但是,tsql不允许我从触发器中删除我,并给出一个错误,声明“插入的多部分标识符”。Id“无法绑定”

以下是我试图在代码方面实现的目标:

delete from dbo.CurrentItems where dbo.CurrentItems.CurrentItemId = INSERTED.Id
INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1

有什么想法吗?

在DELETE FROM语句中,必须将插入的伪表添加到正在操作的表中(在FROM子句中),如下所示:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems
     , INSERTED
 WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id

INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1
或者,可以使用内部联接:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems CI
       INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id

在DELETE FROM语句中,必须将插入的伪表添加到正在操作的表中(在FROM子句中),如下所示:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems
     , INSERTED
 WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id

INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1
或者,可以使用内部联接:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems CI
       INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id

为什么不能在更新TableB中的行时只更新TableA中现有的行呢??更新而不是删除/插入


您可以有一个后插入触发器,它现在可以执行您想要的操作,再加上一个后更新触发器,它将更新TableA中的行(而不是插入新行)。

为什么不能在更新TableB中的行时只更新TableA中的现有行??更新而不是删除/插入


您可以有一个后插入触发器,它现在可以执行您想要的操作,再加上一个后更新触发器,它将更新TableA中的行(而不是插入新的行)。

您说过您有一个触发器,它在“将行插入tableB”时触发。这样你就有了触发插入的触发器。在我看来,你也有触发更新的能力。您是否希望在更新时也触发触发器?如果没有,请从触发器定义中删除“更新”


Randy

您说过您有一个触发器,当“将一行插入表B”时触发。这样你就有了触发插入的触发器。在我看来,你也有触发更新的能力。您是否希望在更新时也触发触发器?如果没有,请从触发器定义中删除“更新”


Randy

单独的触发器——一个用于插入,一个用于更新(那么删除呢?)——可能会执行得更好。@Irfanldrees:不客气@菲利普·凯利,我不能不同意你的观点,但现在海报上是这么问的。他想知道为什么他的DELETE语句不起作用。单独的触发器——一个用于插入,一个用于更新(那么删除呢?)——可能会执行得更好。@Irfanldrees:不客气@菲利普·凯利,我不能不同意你的观点,但现在海报上是这么问的。他想知道为什么他的删除语句不起作用。