IDENTITY_INSERT установлен на OFF - Как его включить?

112

У меня есть база данных архива удаленных файлов, в которой хранится идентификатор удаленного файла, я хочу, чтобы администратор мог восстановить файл (а также тот же идентификатор для связывания файлов). Я не хочу убирать identity_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

Разве вы не должны установить identity_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
DCNYAM
источник
1
Вы правы. Вот в чем суть! Следующий пакет команд для вставки должен начинаться с SET IDENTITY_INSERT tbl_content ON; команду снова.
Jettero 08
9

напоминание

SQL Server позволяет только одной таблице иметь для свойства IDENTITY_INSERT значение ON.

Это не работает:

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
образование
источник
4

Добавьте эту строку над вашим запросом

SET IDENTITY_INSERT tbl_content ON
Анкит
источник
2

Добавить также зачет

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Нараян Еррабачу
источник