IDENTITY_INSERT jest wyłączone - jak to włączyć?

112

Mam usuniętą bazę danych archiwum plików, która przechowuje identyfikator usuniętego pliku, chcę, aby administrator mógł przywrócić plik (a także ten sam identyfikator do łączenia plików). Nie chcę usuwać identyczności_insert z całej tabeli, ponieważ przyrost o jeden działa świetnie. W mojej TBL_Contentprocedurze insert to store mam coś takiego

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

Ale ciągle otrzymuję ten sam błąd:

Nie można wstawić jawnej wartości dla kolumny tożsamości w tabeli „TBL_Content”, gdy parametr IDENTITY_INSERT jest ustawiony na OFF.

Jakaś pomoc?

Spooks
źródło

Odpowiedzi:

174

Czy zamiast tego należy ustawić wstawianie tożsamości na włączone w procedurze składowanej? Wygląda na to, że włączasz ją tylko podczas zmiany procedury składowanej, a nie podczas jej rzeczywistego wywoływania. Próbować:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
David
źródło
16

Czy nie powinieneś ustawić identity_Insert ON, wstawić rekordy, a następnie wyłączyć?

Lubię to:

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
źródło
14

Uważam, że należy to zrobić w jednej partii zapytań. Zasadniczo instrukcje GO dzielą polecenia na wiele partii i to powoduje problem. Zmień to na:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
DCNYAM
źródło
1
Masz rację. O to chodzi! Następna partia poleceń dla wstawiania powinna zaczynać się od SET IDENTITY_INSERT tbl_content ON; polecenie ponownie.
Jettero
9

Przypomnienie

SQL Server zezwala tylko jednej tabeli na ustawienie właściwości IDENTITY_INSERT na ON.

To nie działa:

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

Zamiast:

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
źródło
4

Dodaj tę linię nad tobą Zapytanie

SET IDENTITY_INSERT tbl_content ON
Ankit
źródło
2

Dodaj również wyruszenie

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Narayan Yerrabachu
źródło