IDENTITY_INSERT está DESLIGADO - Como LIGAR?

112

Eu tenho um banco de dados de archive de arquivo excluído que armazena o ID do arquivo que foi excluído, quero que o administrador possa restaurar o arquivo (bem como o mesmo ID para vincular arquivos). Não quero retirar o identity_insert de toda a tabela, pois o incremento em um funciona muito bem. No meu TBL_Contentprocedimento insert to store eu tenho algo assim

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
...insert command...
SET IDENTITY_INSERT tbl_content OFF

Mas continuo recebendo o mesmo erro:

Não é possível inserir um valor explícito para a coluna de identidade na tabela 'TBL_Content' quando IDENTITY_INSERT está definido como OFF.

Qualquer ajuda?

Spooks
fonte

Respostas:

174

Em vez disso, você deveria definir a inserção de identidade como on no procedimento armazenado? Parece que você está configurando-o para ativado apenas ao alterar o procedimento armazenado, não ao chamá-lo de fato. Experimentar:

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
David
fonte
16

Você não deveria estar definindo identity_Insert como ON, inserindo os registros e, em seguida, desligando-o novamente?

Como isso:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
SET IDENTITY_INSERT tbl_content ON
...insert command...
SET IDENTITY_INSERT tbl_content OFF
Abe Miessler
fonte
14

Eu acredito que precisa ser feito em um único lote de consulta. Basicamente, as instruções GO estão dividindo seus comandos em vários lotes e isso está causando o problema. Altere para este:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
DCNYAM
fonte
1
Você está certo. Essa é a questão! O próximo lote de comandos para inserção deve começar com SET IDENTITY_INSERT tbl_content ON; comando novamente.
Jettero
9

Lembrete

O SQL Server permite que apenas uma tabela tenha a propriedade IDENTITY_INSERT definida como ON.

Isso não funciona:

SET IDENTITY_INSERT TableA ON
SET IDENTITY_INSERT TableB ON
... INSERT ON TableA ...
... INSERT ON TableB ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB OFF

Em vez de:

SET IDENTITY_INSERT TableA ON
... INSERT ON TableA ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB ON
... INSERT ON TableB ...
SET IDENTITY_INSERT TableB OFF
Edu
fonte
4

Adicione esta linha acima de sua consulta

SET IDENTITY_INSERT tbl_content ON
Ankit
fonte
2

Adicionar set off também

 SET IDENTITY_INSERT Genre ON

    INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20) 

    SET IDENTITY_INSERT Genre  OFF
Narayan Yerrabachu
fonte