0

私は2つのテーブルtbl_PurchaseDetailstbl_ItemDetails. にレコードを挿入した直後に、いくつかのレコードをtbl_ItemDetailsfromに挿入する必要があります。自動生成されたカスタム フィールドがあります。tbl_PurchaseDetailstbl_PurchaseDetailstbl_PurchaseDetailsPurchaseID

自動生成のコードは次の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です。さすがに挿入される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
)

そうすれば、最初のトリガーと機能は必要ありません。次に、2番目のトリガーを次のように書き直すことができます。

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

insertedこれは、複数の行を含む可能性のあるものを扱います。


Re:プレフィックスに関する最初のスニペットの私のコメントtbl_-冗長な情報を追加するだけでなく、混乱の可能性を追加していると私は主張します。クエリ内の同じ位置にあいまいに表示される可能性があるオブジェクトの2つのタイプは、テーブルとビューだけです。その他のタイプのオブジェクト(関数、ストアドプロシージャ、列、パラメータなど)は、使用時に構文によって常に区別できます。

そして、可能な限り、テーブルとビューを区別したくない、または区別する必要はありません。テーブルを完全に変更できるが、元のテーブルと同じレイアウトで同じ名前のビューを提供でき、他のコードを変更する必要がないことは、SQLの大きな利点です。ただし、テーブルのプレフィックスとしてtbl_ABC使用していたため、ビューに名前を付ける必要がある場合は、ちょっとばかげているように感じます。tbl_

于 2013-03-06T07:30:29.777 に答える