IDENTITY_INSERT ist auf OFF gesetzt - Wie schalte ich es ein?


111

Ich habe eine gelöschte Dateiarchivdatenbank, in der die ID der gelöschten Datei gespeichert ist. Ich möchte, dass der Administrator die Datei wiederherstellen kann (sowie dieselbe ID zum Verknüpfen von Dateien). Ich möchte nicht identity_insert von der gesamten Tabelle entfernen, da das Inkrement um eins großartig funktioniert. In meiner TBL_ContentProzedur zum Einfügen zum Speichern habe ich so etwas

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

Aber ich bekomme immer den gleichen Fehler:

Es kann kein expliziter Wert für die Identitätsspalte in die Tabelle 'TBL_Content' eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.

Irgendeine Hilfe?

Antworten:


173

Sollten Sie stattdessen die Identitätseinfügung innerhalb der gespeicherten Prozedur auf Ein setzen? Es sieht so aus, als würden Sie es nur aktivieren, wenn Sie die gespeicherte Prozedur ändern, nicht wenn Sie sie tatsächlich aufrufen. Versuchen:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

16

Sollten Sie nicht identity_Insert auf ON setzen, die Datensätze einfügen und dann wieder ausschalten?

So was:

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

14

Ich glaube, es muss in einem einzigen Abfragestapel durchgeführt werden. Grundsätzlich teilen die GO-Anweisungen Ihre Befehle in mehrere Stapel auf, was das Problem verursacht. Ändern Sie es in dieses:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

1
Du hast recht. Das ist der Punkt! Der nächste Befehlsstapel zum Einfügen sollte mit SET IDENTITY_INSERT beginnen. Tbl_content ON; Befehl erneut.
Jettero

9

Erinnerung

In SQL Server kann nur für eine Tabelle die Eigenschaft IDENTITY_INSERT auf ON gesetzt werden.

Das funktioniert nicht:

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

Stattdessen:

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


4

Fügen Sie diese Zeile über Ihrer Abfrage hinzu

SET IDENTITY_INSERT tbl_content ON

2

Add off auch hinzufügen

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.