IDENTITY_INSERT встановлено на OFF - Як увімкнути його?


112

У мене є видалена база даних архівів файлів, яка зберігає ідентифікатор видаленого файлу, я хочу, щоб адміністратор міг відновити файл (а також той самий ідентифікатор для посилання файлів). Я не хочу знімати ident_insert з усієї таблиці, оскільки приріст на один працює чудово. У моїй вставці для TBL_Contentзберігання процедури я маю щось подібне

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

Але я все одно отримую ту саму помилку:

Неможливо вставити явне значення стовпця особи в таблицю "TBL_Content", коли для IDENTITY_INSERT встановлено значення OFF.

Будь-яка допомога?

Відповіді:


174

Чи замість цього вам слід встановити вставку ідентифікатора у межах збереженої процедури? Схоже, ви вмикаєте його лише при зміні збереженої процедури, а не при фактичному виклику. Спробуйте:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

16

Чи не слід ви встановлювати ident_Insert ON, вставляти записи і потім вимикати їх?

Подобається це:

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

Я вважаю, що це потрібно зробити в одній партії запитів. В основному, заяви GO розбивають ваші команди на кілька партій, і це викликає проблему. Змініть це на це:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

1
Ти правий. Це суть! Наступний пакет команд для вставки повинен починатися з SET IDENTITY_INSERT tbl_content ON; знову командувати.
Jettero

9

Нагадування

SQL Server дозволяє лише одній таблиці мати властивість IDENTITY_INSERT, встановлене на УВІМКНЕНО.

Це не працює:

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

Замість цього:

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



2

Додайте також відстрочку

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.