【问题标题】:Null values INSERTED in trigger在触发器中插入空值
【发布时间】:2016-03-30 00:00:05
【问题描述】:

我想将一个表的内容复制到同一个数据库中的另一个表。

为此,我在源表上编写了触发器,该触发器在 AFTER INSERT UPDATE 上触发,表中有 2 个唯一标识符字段,它们基于 newid() 作为默认绑定生成值。基于这个唯一标识符,我正在检查记录是否存在于目标表中,如果存在则它将更新,如果不存在则将数据集插入表中。

问题是当我插入一条新记录时,触发器中的 INSERTED 为我提供了 uniqueidentifier 字段的 NULL 值。 在可能的情况下,只有一行被更新或插入,因此不使用游标。

下面是我的代码,我在@OriginalTable_MoveDataUID 和@OriginalTable_ProcedureUID 中得到空值。 MoveDataUID 和 ProcedureUID 都是唯一标识符文件。

请分享您的想法或任何替代方案。

ALTER TRIGGER [dbo].[spec_ref_movedata_procedures_ToUpdate]
ON [dbo].[spec_ref_movedata_procedures]
AFTER INSERT, UPDATE
AS 
BEGIN

SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION

DECLARE @OriginalTable_MoveDataUID NVarchar (100)
DECLARE @OriginalTable_ProcedureUID NVarchar (100)
DECLARE @PresentInHistoryYesNo int

SELECT @OriginalTable_MoveDataUID= MoveDataUID,@OriginalTable_ProcedureUID=ProcedureUID FROM INSERTED

-- inserted for checking purpose
INSERT INTO ERP_Test_NK_spec_ref_movedata_procedures_history_2 (MovedataUID,ProcedureUID) VALUES
(@OriginalTable_MoveDataUID,@OriginalTable_ProcedureUID)

SELECT @PresentInHistoryYesNo =  count(*) from spec_ref_movedata_procedures_history WHERE MoveDataUID=@OriginalTable_MoveDataUID AND ProcedureUID=@OriginalTable_ProcedureUID

IF @PresentInHistoryYesNo = 0
BEGIN
    -- insert opertions
    print 'insert record'
END
ELSE IF @PresentInHistoryYesNo = 1
BEGIN
    -- update opertions
    print 'update record'
END

COMMIT TRANSACTION
SET XACT_ABORT OFF

END

【问题讨论】:

  • 您的触发器有一个重大缺陷,即假定只有 1 行插入。这不是触发器在 sql server 中的工作方式。它们每次操作触发一次,而不是每行一次。您需要将其重写为基于集合的操作。
  • 如果在同一个数据库中,则不需要DISTRIBUTED 事务。

标签: sql-server tsql triggers


【解决方案1】:

您可以这样做,而不是使用变量:

INSERT INTO ERP_Test_NK_spec_ref_movedata_procedures_history_2 (MovedataUID,ProcedureUID)
SELECT MoveDataUID,ProcedureUID FROM INSERTED

【讨论】:

  • 这对我不起作用。结果是一样的,我得到了插入操作的空值。当我手动执行 INSERT INTO 语句时它可以工作,但是当通过应用程序执行相同的语句时,它会在触发器中返回空值。
  • 听起来您的应用程序正在发送 NULL 值,而您认为它不是。我会去那里看看。
  • 我设法找到了解决方案。我创建了一个脚本,它将返回我想要的结果,而不是通过触发器获取插入的记录。
猜你喜欢
  • 2013-01-21
  • 2011-08-14
  • 2013-04-24
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2016-01-29
  • 2019-11-03
  • 2013-01-08
相关资源
最近更新 更多