SQL Server error: "Cannot insert explicit value for identity column" even when I SET IDENTITY_INSERT ON

Negarrak picture Negarrak · Nov 22, 2017 · Viewed 17.2k times · Source

I REALLY review several times, that's the reason I am asking; looking for guidance...

I have one table, as the script below. Then, I set IDENTITY_INSERT ON. Then I try to do an insert select, (I NEED the very same ids)

I keep getting this error:

Msg 544, Level 16, State 1, Line 2
Cannot insert explicit value for identity column in table 'Table1' when IDENTITY_INSERT is set to OFF.

Does anybody knows why? Any set up at DB level can overrule the IDENTITY_INSERT ON?

I appreciate any advice. Thanks in advance and kind regards.

Script to table:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].Table1
(
    [TableId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](256) NOT NULL,
    [RowVersion] [timestamp] NOT NULL,
    [AddedDate] [datetime2](7) NOT NULL,
    [stuff2] [int] NOT NULL,
    [ModifiedDate] [datetime2](7) NOT NULL,
    [LastModifiedBy] [int] NOT NULL,

    CONSTRAINT [Table1_PK] 
        PRIMARY KEY CLUSTERED ([TableId] ASC)
) ON [PRIMARY]
GO

The insert statement:

SET IDENTITY_INSERT [dbo].Table1 ON;

INSERT INTO [dbo].Table1 ([TableId], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy])
    SELECT 
        [RoleID], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy] 
    FROM 
        [dbo].Table2

Answer

cryanbhu picture cryanbhu · May 19, 2020

I had the same error even though I had run the SET IDENTITY_INSERT mytable ON command on my table. I realized it was because I was closing lines in the query script.

If you are closing each line with ;, the SET IDENTITY_INSERT mytable ON command will not hold for the following lines.

i.e.
a query like

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

Gives the error
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

But a query like this will work:

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

It seems like the SET IDENTITY_INSERT command only holds for a transaction, and the ; will signify the end of a transaction.