2013-03-06 35 views
0

我有两个表tbl_PurchaseDetailstbl_ItemDetails。我需要从tbl_PurchaseDetails插入一些记录到tbl_ItemDetails,插入tbl_PurchaseDetails之后。 tbl_PurchaseDetails已自动生成自定义字段PurchaseID创建触发器以将表中的记录插入另一个表中。表'A'的触发列在表'B'中插入为空

代码自动生成的PurchaseID是: - * 这触发完美的作品 *

CREATE FUNCTION CreatePurchaseID (@id INT) 
RETURNSvarchar(10) 
AS 
BEGIN 
RETURN 'P' + CONVERT(VARCHAR(10), @id) 
END 

CREATE TRIGGER trigger_PurchaseID ON tbl_PurchaseDetails 
FOR INSERT AS 
UPDATE 
    tbl_PurchaseDetails 
SET 
    tbl_PurchaseDetails.PurchaseID = dbo.CreatePurchaseID(tbl_PurchaseDetails.ID) 
FROM 
    tbl_PurchaseDetails 
INNER JOIN 
INSERTED on tbl_PurchaseDetails.ID= INSERTED.ID 

我写了下面的代码触发插入到tbl_ItemDetails: -

CREATE TRIGGER trigger_UpdateItemDetails ON tbl_PurchaseDetails 
FOR INSERT AS 
DECLARE @PurchaseID VARCHAR(20) 
DECLARE @Quantity INT 
DECLARE @WarehouseID VARCHAR(20) 

SELECT @PurchaseID=(PurchaseID) FROM INSERTED 
SELECT @Quantity=(ItemQuantity) FROM INSERTED 
SELECT @WarehouseID=(WarehouseID) FROM INSERTED 

INSERT INTO 
tbl_ItemDetails 
(PurchaseID,Quantity,WarehouseID) 
VALUES 
(
@PurchaseID,@Quantity,@WarehouseID 
) 

**现在,当我插入到tbl_PurchaseDetails的记录成功添加到tbl_PurchaseDetailstbl_ItemDetails。这里的问题是,PurchaseIDtbl_ItemDetails中插入为空。不过,它按照预期插入到tbl_PurchaseDetails中。

+0

为什么不只是使'PurchaseID'成为一个计算列(使用你已有的函数,或者只是内联),并完全删除第一个触发器? – 2013-03-06 07:03:45

+0

此外,你的第二个触发器基本上被打破了 - 它假设只有一个行在'INSERTED' – 2013-03-06 07:10:56

+0

我确实试图这样做,但我遇到了问题。如果你用一些代码来帮助我这么做会很好。 @Damien_The_Unbeliever – 2013-03-06 07:26:44

回答

2

从我的意见,这是我不得不:

CREATE TABLE PurchaseDetails (--Why have a tbl_ prefix on every table? 
    ID int IDENTITY(1,1) not null, 
    PurchaseID as 'P' + CONVERT(VARCHAR(10), ID), 
    --Other columns 
) 

然后我就不需要你的第一个触发器和功能。然后我可以重新写第二触发为:

CREATE TRIGGER trigger_UpdateItemDetails ON PurchaseDetails 
FOR INSERT AS 
    INSERT INTO ItemDetails(PurchaseID,Quantity,WarehouseID) 
    SELECT PurchaseID,ItemQuantity,WarehouseID 
    FROM inserted 

inserted潜在含有多行交易。


回复:我在第一个片段评论有关tbl_前缀 - 我认为,这不只是增加冗余信息,它的增值潜能的混乱。只有两种类型的对象可以模糊地出现在查询中的同一位置,即表格和视图。任何其他类型的对象(函数,存储过程,列,参数等)都可以通过使用语法来区分。

而且,尽可能不要想要需要来区分表和视图。能够完全更改表格,但是然后提供与原始表格具有相同布局并具有相同名称并且不必更改任何其他代码的视图在SQL中是非常有用的。但是当你必须命名你的视图tbl_ABC,因为你使用tbl_作为表的前缀时,感觉有点傻。

+0

非常感谢。它工作完美。谢谢。 – 2013-03-06 07:54:58

+0

关于前缀问题:另一方面,您不能(通常)插入或更新视图,并且它们的性能特征可能会有很大差异,因此在某些情况下,值得强调的是,您的查询并不像看起来那么微不足道。我仍然不认为这是值得的前缀,但有时你想要并需要区分表和视图。 – 2013-03-06 16:15:17

+0

@EamonNerbonne - 我可以在某些时候成为关系型势利:-) – 2013-03-06 17:08:45

相关问题