触发器的奇怪行为

-1 sql-server triggers ssis

我有一个触发器(SQL 2008 R2)执行一个简单的操作,但结果不合逻辑.以下是概述:

文本文件被送到SSIS包,其中包含一行(一个记录),将其加载到"ORDERS_IN_PROCESS"表中.数据访问模式在"OLE DB目标"中设置为"表或视图"以允许触发器触发.

这是我的ORDERS表:

OrderID        ItemNo
---------    ---------
9813           1
9813           2
9813           3
9817           1
Run Code Online (Sandbox Code Playgroud)

因此,SSIS执行并且ORDERS_IN_PROCESS获取一个插入的记录,即OrderID 9813

触发器被触发:

INSERT INTO ORDERS_ARCHIVE SELECT * FROM ORDERS WHERE OrderID=INSERTED.OrderID
Run Code Online (Sandbox Code Playgroud)

到目前为止很简单......

我在ORDERS_ARCHIVE(与ORDERS相同的布局)表中得到的结果是

OrderId       ItemNo
---------   ----------
9813          3
Run Code Online (Sandbox Code Playgroud)

2行项目的其余部分在哪里?

注意,它只将从ORDERS表中读取的最后一行插入到ORDERS_ARCHIVE中.

我需要ORDERS_ARCHIVE中的所有3个.

为什么会这样?

我认为它与SSIS使用"OLE DB Destination"处理它的方式有关,因为如果我手动将记录插入到RLFL中,触发器就会完全按照它应该执行的操作并从BACK插入所有3条记录.

你可能会争辩说每个触发器触发一次,我同意但在这种情况下我只有一批记录.

我正在考虑一个sp,但我宁愿不为一些如此微不足道的东西增加另一层次的复杂性.

有任何想法吗?

谢谢.

Lam*_*mak 5

我认为这根本不与SSIS有关,而是与你的触发器有关.而不是IN你在那里,尝试JOIN在您的查询中使用a :

INSERT INTO ORDERS_ARCHIVE 
SELECT O.* 
FROM ORDERS O
INNER JOIN INSERTED I
     ON O.ORderID = I.OrderID
Run Code Online (Sandbox Code Playgroud)