web-dev-qa-db-ja.com

別のテーブルの列を含むINSERT-OUTPUT

3つの異なるテーブルに挿入する必要のあるストアドプロシージャがありますが、1つの入力から生成されたIDを取得し、それを使用して次のテーブルに挿入する必要があります。私はINSERT-OUTPUT構造に精通していますが、この特定の場合にそれを使用する方法がわかりません。

DECLARE @guids TABLE ( [GUID] UNIQUEIDENTIFIER );
DECLARE @contacts TABLE ( [ContactID] INT, [GUID] UNIQUEIDENTIFIER );
DECLARE @mappings TABLE ( [TargetID] INT, [GUID] UNIQUEIDENTIFIER );

INSERT @guids ( [GUID] ) ...

INSERT [Contacts] ( [FirstName], [LastName], [ModifiedDate] )
OUTPUT [inserted].[ContactID], g.[GUID]
INTO @contacts
SELECT [First_Name], [Last_Name], GETDATE()
FROM [SourceTable] s
JOIN @guids g ON s.[GUID] = g.[GUID]

INSERT [TargetTable] ( [ContactID], [License], [CreatedDate], [ModifiedDate] )
OUTPUT [inserted].[TargetID], c.[GUID]
INTO @mappings
SELECT c.[ContactID], [License], [CreatedDate], [CreatedDate]
FROM [SourceTable] s
JOIN @contacts c ON s.[GUID] = c.[GUID] 

INSERT [Mappings] ( [TargetID], [SourceGUID] )
SELECT [TargetID], [GUID]
FROM @mappings

しかし、次のエラーが発生します。

マルチパート識別子「g.GUID」をバインドできませんでした。

マルチパート識別子「c.GUID」をバインドできませんでした。

代わりにs.GUIDを使用すると、同様のエラーが発生します。 OUTPUT句で一種の結合を行うことは可能ですか?

26
p.s.w.g

それが最善の選択肢かどうかはわかりませんが、MERGEを使用してトリックを実行できるようです。

MERGE [Contacts]  trgt
USING 
(  
  SELECT [First_Name], [Last_Name], g.[GUID] as [GUID]
  FROM [SourceTable] s
  JOIN @guids g ON s.[GUID] = g.[GUID]
)src ON (1=0)
WHEN NOT MATCHED THEN INSERT ( [FirstName], [LastName], [ModifiedDate] )
 VALUES (src.[First_Name],src.[Last_Name], GETDATE())
OUTPUT [inserted].[ContactID], src.[GUID]
INTO @contacts
33
a1ex07