2013-03-06 36 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

相關問題