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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.