2012-03-09 78 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]。但我無法這樣做。有人請幫助我!緊急

+1

您是否嘗試過不插入PK_ID? http://mattgemmell.com/2008/12/08/what-have-you-tried/ – 2012-03-09 14:53:10

+0

如果你想讓它與另一個表同步,你的目標表就不應該有一個標識列(應該有一個標識柱)。 – Lamak 2012-03-09 15:08:36

回答

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語句; – 2012-03-09 21:15:35

+0

是的,測試了這一點,工作正常。 – 2012-03-09 21:41:45

+0

這個答案的另一個有趣的向量是你的WHEN MATCHED子句...確保你沒有設置[IdentityColumn] = ___ – Scottley 2016-06-03 18:32:25