触发器

时间:2015-12-23 14:14:23

标签: sql-server tsql triggers

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

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

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

下面是我的代码,我在@OriginalTable_MoveDataUID和@OriginalTable_ProcedureUID中获取空值。 MoveDataUID和ProcedureUID都是uniqueidentifier fileds。

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

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 个答案:

答案 0 :(得分:0)

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

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