2017-11-10 23 views
0

SQLテーブルに新しい行を挿入した後に値を更新/挿入しようとしています。私はこれを達成するためにトリガを使用していますが、私はそれが意味することを理解するエラーが発生しますが、私はそれを修正する方法を知らない。私は、宣言された@idに基づいて挿入されたテーブルから挿入された行を得ることができたという印象の下にあったが、その部分はうまくいくようだが、なぜ私は "私はそれがPKだと知っていますが、私はこのフィールドに何も入力することはありません(それは既にインサート自体から正しいデータで満たされています)。挿入エラー後のSQ1トリガー

だから誰も私が間違ったことを説明できますか?

私が使用テーブル:

テーブルdelivery_invoice

id - int 
invoicenumber(PK) - varchar(50) 
amount6 - money 
amount21 - money 
distributor - int 
payed - char(3) 
deliverycosts - money 
deliverydate - datetime 
deliverytime - datetime 
VATamount6 - calculated field 
VATamount21 - calculated field 
VATamountdelivery - int 

私は

USE TestDelivery 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  James 
-- Create date: 11-08-2017 
-- Description: change VATamountdelivery field after a new row is inserted 
-- ============================================= 
CREATE TRIGGER trgVATAmountDelivery 
ON dbo.delivery_invoice 
AFTER INSERT  
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

Declare @id int 
Declare @amount money 
Declare @invoice varchar(50) 
Select @id = id from inserted 
Select @amount = VATamount21 from inserted 

IF @amount > 0 
insert into dbo.delivery_invoice(VATamountdelivery) 
    values(21) 
    else 
insert into dbo.delivery_invoice(VATamountdelivery) 
    values(6) 

END 
GO 

そして最後にではなく、少なくとも私が得たエラー使用トリガー:

Error. Cannot insert the value NULL into column 'invoicenumber', table 
'TestDelivery delivery_invoice'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

任意の助けがにappriciatedされるだろうが! J.

答えて

2

値を指定して新しい行を挿入する必要はありません。私はあなたが価値を変えたいと思う。

ただし、トリガーにはその他の問題があります。特に、は決してで、insertedには1行だけが含まれていると仮定します。それは起こるのを待っているバグです。

CREATE TRIGGER trgVATAmountDelivery ON dbo.delivery_invoice 
AFTER INSERT  
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    update di 
     set VATamountdelivery = (case when i.VATamount21 > 0 then 21 else 6 end) 
     from dbo.delivery_invoice di join 
      inserted i 
      on i.id = di.id 

END; 
+0

ありがとう、ちょうどコードをテストし、それは完全に動作します。私は、挿入テーブルが複数の行を保持できることに気づいていませんでしたが、この場合、挿入があるたびに1つの行しか存在しないので、うまくいくはずです。解決策とインサートテーブルの洞察をありがとう – JamesW

関連する問題