IDENTITY INSERT无法使用MERGE

时间:2015-05-11 19:32:56

标签: sql sql-server

我有以下代码:

PRINT N'Merging Wide Format Types...'
SET IDENTITY_INSERT WideFormatTypes ON
GO
MERGE INTO WideFormatTypes AS Target
USING (VALUES 
    (1, N'****', NULL),
    (2, N'****', NULL),
    (3, N'******', NULL),
    (4, N'*******', NULL),
    (5, N'******', NULL),
    (6, N'*******', NULL)
)
AS Source (TypeID, TypeName, Description) 
ON Target.TypeID = Source.TypeID
WHEN MATCHED THEN
    UPDATE SET
    TypeID = Source.TypeID,
    TypeName = Source.TypeName,
    Description = Source.Description
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (TypeID, TypeName, Description) 
    VALUES (TypeID, TypeName, Description);

SET IDENTITY_INSERT WideFormatTypes OFF
GO

它会返回错误

  

Msg 8102,Level 16,State 1,Line 1
  无法更新标识列'TypeID'

表格声明如下:

CREATE TABLE [dbo].[WideFormatTypes] 
(
    [TypeID]      INT             IDENTITY (1, 1) NOT NULL,
    [TypeName]    NVARCHAR (500)  NOT NULL,
    [Description] NVARCHAR (1000) NULL,
    PRIMARY KEY CLUSTERED ([TypeID] ASC)
);

我找不到问题..有什么帮助吗?

2 个答案:

答案 0 :(得分:4)

尝试从MERGE的UPDATE部分删除标识列。

正如它所说,

IDENTITY_INSERT是INSERT,而不是UPDATE。此外,您在JOIN中包含该字段,因此UPDATE实际上永远不会实际更改该值。

答案 1 :(得分:1)

您无法 更新 标识列上的值。您需要使用所需的值创建一个新行,并删除现有的行。