2017-06-16 8 views
0

IDの列があり、もう一方は同一ではない2つのテーブルがあります。代わりに、2番目の表は、最初の表のID列の値を使用します。私は、レコードが最初のテーブルに挿入されたときに、2番目のテーブルにトリガとして挿入すると考えました。私は構文が正しいとは思わない。挿入トリガでID列の値を取得する方法SQL Server

ID列@EDVisitIdからヌルが戻されています。

ALTER TRIGGER [dbo].[trgInserterrEDVisitOriginal] ON [dbo].[errEDVisit] 
AFTER INSERT 
AS 


--Name: Bob Avallone 
--Date: 6-15-2017 
-- 
-- The purpose of this trigger is to insert a record into errEDVisitOriginal 
-- whenever a new errEDVisit is inserted. 

--XXXXXXXXXX 



    declare @EDVisitId int 
    declare @SubmissionControlID INT 


Select @EDVisitId = EDVisitID from inserted 
SELECT @SubmissionControlID = SubmissionControlID from Inserted 


    Begin 

Insert Into errEDVisitOriginal (EDVisitId, SubmissionControlID) 

VALUES (@EDVisitId, @SubmissionControlID) 



End 
+1

トリガーには大きな欠陥があります。挿入された行が1つしかないと仮定します。 1回の操作でSQL Serverの起動をトリガーします。このようなトリガは、スカラーベースではなく、ベースに設定する必要があります。 –

+0

トリガでこれを行うのではなく、挿入手順が必要です。このプロシージャでは、OUTPUT句を使用して、新しく挿入されたすべてのID値を取得できるようにします。 –

答えて

0

あなただけ(SCOPE_IDENTITYを必要とする)

選択@EDVisitId = SCOPE_IDENTITY()

+0

これはIDを取得しますが、トリガーの欠陥のある性質を永続させています。 –

+0

@SeanLangeどのような欠陥が参照されていますか?あなたが言う唯一の事はあなたの投稿の問題は "NullがID列@EDVisitIdから返されている"ということです。 scope_identity()でIDを設定すると、そのときの問題は何ですか? – AaronLS

+0

トリガーでこのようなスカラー変数を使用すると、1行しか挿入されないことが前提となるためです。それはSQL Serverでトリガが動作する方法ではありません。トリガーは、ベースに基づいて設定する必要があります。トリガーにスカラー値を固定する場合は、ループを追加する必要があります。うん!! –

0

あなたは最初のテーブルから最後に挿入IDを取得するためにSCOPE_IDENTITYを使用することができます挿入、変数に入れて2番目のテーブル。

https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

+0

トリガーでこのような変数を使用することは、複数の行が挿入されたときの適切な方法ではありません。 –

+1

私は彼がトリガでそれを使用していることを認識しませんでした。私はトリガーの代わりに挿入を行うストアドプロシージャでそれを行います。 –

0

意図的に情報を複製する決定は疑わしいですが、あなたは過剰思考コードを大幅にされています。ちょうど:

if exists (select * from inserted) 
insert dbo.errEDVisitOriginal (EDVisitId, SubmissionControlID) 
select EDVisitId, SubmissionControlID from inserted; 
1

ありがとうございます。私は引き金の考えを放棄した。代わりに、最初のテーブルの新しいレコードを2番目のテーブルに挿入するだけです。下記参照。

Insert errEDVisitOriginal(EdVisitId, SubmissionControlID) 
    Select EdVisitId, SubmissionControlID 
    from errEDVisit where SubmissionControlID = @SubmissionControlID 
関連する問題