Для параметра IDENTITY_INSERT установлено значение OFF. Как включить его? - PullRequest
99 голосов
/ 24 июня 2010

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

Любая помощь?

Ответы [ 7 ]

153 голосов
/ 24 июня 2010

Должны ли вы вместо этого включить идентификационную вставку в хранимой процедуре? Похоже, вы устанавливаете его только при изменении хранимой процедуры, а не при ее фактическом вызове. Попробуйте:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
16 голосов
/ 24 июня 2010

Разве вы не должны устанавливать 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
12 голосов
/ 24 июня 2010

Я считаю, что это нужно сделать в одном пакете запросов. По сути, операторы GO разбивают ваши команды на несколько пакетов, и это вызывает проблему. Измените это на это:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
9 голосов
/ 18 июля 2016

Напоминание

В 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
5 голосов
/ 19 ноября 2013

Ссылка: http://technet.microsoft.com/en-us/library/aa259221%28v=sql.80%29.aspx

Моя таблица называется Genre с 3 столбцами Id, Name и SortOrder

Код, который я использовалкак:

SET IDENTITY_INSERT Genre ON

INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20) 
3 голосов
/ 02 июля 2014

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

SET IDENTITY_INSERT tbl_content ON
1 голос
/ 17 мая 2018

Добавь также зачеркнуть

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...