0

我有两张桌子tbl_PurchaseDetailstbl_ItemDetails. tbl_ItemDetails我需要在from中插入一些记录tbl_PurchaseDetails,就在它插入之后tbl_PurchaseDetailstbl_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_PurchaseDetails记录时tbl_PurchaseDetails,已tbl_ItemDetails成功添加。这里的问题是,PurchaseIDtbl_ItemDetails. 它按预期插入tbl_PurchaseDetails

4

1 回答 1

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_的是表的前缀。

于 2013-03-06T07:30:29.777 回答