创建触发器以将记录从表插入到另一个表中。表格的触发栏' A'在表格中插入为null' B'

时间:2013-03-06 06:47:14

标签: sql sql-server triggers

我有两张表tbl_PurchaseDetailstbl_ItemDetails。我需要在tbl_ItemDetails中插入一些记录,然后将其插入tbl_PurchaseDetailstbl_PurchaseDetails已自动生成自定义字段tbl_PurchaseDetails

自动生成PurchaseID的代码为: - * 此触发器完美运行 *

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_PurchaseDetailstbl_PurchaseDetails。这里的问题是,tbl_ItemDetailsPurchaseID中被插入为null。它虽然在tbl_ItemDetails中按预期插入。

1 个答案:

答案 0 :(得分: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


Re:我在关于tbl_前缀的第一个片段中的评论 - 我认为这不只是添加冗余信息,而是增加了混淆的可能性。在查询中位于相同位置的模糊显示的唯一两种类型的对象是表和视图。任何其他类型的对象(函数,存储过程,列,参数等)始终可以在使用时通过语法进行区分。

并且,尽可能地,您不应该想要需要来区分表和视图。能够完全更改表,但随后提供与原始表具有相同布局的视图,并且具有相同的名称,然后无需更改任何其他代码,这在SQL中是一个很好的优点。但是,当您必须为视图tbl_ABC命名时,感觉有点愚蠢,因为您使用tbl_作为表的前缀。