2012-03-09 11 views
3

私はストアドプロシージャのデータの挿入/更新にマージステートメントを使用しています。マージステートメントとアイデンティティの挿入

MERGE [dbo].[tReserveData_4541] AS Target 
USING (SELECT * FROM [dbo].[tblcangrowhitesh]) AS Source 
ON ([Source].[PK_ID] = [Target].[PK_ID]) 

WHEN MATCHED THEN 
    UPDATE SET [Target].[mgender] = Source.[mgender] 

WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([Granularity], [PK_ID], [ROWID], 
      [mgender], [mma1], [mma2], [mma3], 
      [mmadmincost], [mmcumulativevolume], 
      [mmcurrency], [mmdate], 
      [mmfileimporteddate], [mmfilename]) 
    VALUES ([Source].[Granularity], [Source].[PK_ID], [Source].[ROWID], 
      [Source].[mgender], [Source].[mma1], [Source].[mma2], [Source].[mma3], 
      [Source].[mmadmincost], [Source].[mmcumulativevolume], 
      [Source].[mmcurrency], [Source].[mmdate], 
      [Source].[mmfileimporteddate], [Source].[mmfilename]) 

あなたは私がMERGE声明の中で、すなわち[PK_ID] ID列を挿入しようと思って見ることができるように。しかし、私はそうすることができません。誰か助けてください!

+1

PK_IDを挿入しませんでしたか? http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

+0

他のテーブルと同期させたい場合は、ターゲットテーブルにIDカラムを付けるべきではありません。カラム)。 – Lamak

答えて

0

ターゲットに値を生成する必要がない場合は、PK_IDのIDENTITYプロパティを削除します。

これを行うには、PK_ID_temp列UPDATE [dbo].[tReserveData_4541] SET PK_ID_temp = PK_IDを追加します。 PK_ID列を削除し、PK_ID_tempの名前をPK_IDに戻します。

これには、主キーを削除し、関連付けられたインデックスを削除し、クラスタ化されていないインデックスもクラスタ化インデックスの場合はすべて再構築する必要があります。

9

私はMERGEコマンドに慣れていませんが、IDENTITY_INSERTコマンドを使用する必要はありませんか?例えば

SET IDENTITY_INSERT [dbo].[tReserveData_4541] on 

MERGE... 

SET IDENTITY_INSERT [dbo].[tReserveData_4541] off 
+0

...私は、MERGEステートメント全体をセミコロンで終わらせることについて何かがあると思います。 –

+0

うん、これがテストされ、それは正常に動作します。 –

+0

この回答の別の興味深いベクトルはWHEN MATCHED節です...あなたがSETでないことを確認してください[IdentityColumn] = ___ – Scottley

関連する問題