2013-03-07 20 views
22

3つの異なるテーブルに挿入する必要があるストアドプロシージャがありますが、1つの入力から生成されたIDを取得して次のテーブルに挿入する必要があります。私はINSERT-OUTPUT構成に精通していますが、この特定のケースで使用する方法についてはわかりません。他のテーブルの列を含む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句で一種の参加をすることは可能ですか?

+1

を挿入した以外のものを使用することはできませんので、あなたがエラーを取得していますまたはINSERTEDを使用することができます。更新と削除では、クエリで使用されている他のテーブルを参照できます。 以下のマージオプションは、SQL Server 2008以降を使用している限り機能します。私がそれ以外の方法で見つけた唯一の方法は、私が挿入しているテーブルの未使用の列を見つけて、その列に値(あなたの場合はGUID)を入れ、後で戻って列を引き出します(そしてそれをヌルに戻して、そこに留まらないようにしてください)。 –

+0

これを試してみてください.GUID – user123456

答えて

30

私はそれが最良の選択肢であるかどうかわからないんだけど、あなたが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 
+0

私の無知を許してください。私は 'MERGE'を使ったことは一度もなく、野生で使われているのを見たこともありません。このコードを少し説明できますか? –

+4

[Dr. OUTPUTまたは:MERGEを心配しなくてはいかがでしたか」(http://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop) -worrying-and-love-the-merge.aspx) –

+4

これは素晴らしい記事です。しかし、あなたの質問に対する簡単な答えは、MERGEはINSERT、UPDATE、DELETEの組み合わせを1つのステートメントで組み合わせることができるということです(このコードはINSERTを強制します)。 MERGEは、OUTPUT句の中の異なるテーブルの列を使用できるため、INSERTは使用できません。 – GilM

関連する問題