我有两张表tbl_PurchaseDetails
和tbl_ItemDetails
。我需要在tbl_ItemDetails
中插入一些记录,然后将其插入tbl_PurchaseDetails
。 tbl_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_PurchaseDetails
和tbl_PurchaseDetails
。这里的问题是,tbl_ItemDetails
在PurchaseID
中被插入为null。它虽然在tbl_ItemDetails
中按预期插入。
答案 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_
作为表的前缀。