IDENTITY_INSERT disetel ke OFF - Bagaimana cara menyalakannya?

112

Saya memiliki database arsip file yang dihapus yang menyimpan ID dari file yang telah dihapus, saya ingin admin dapat memulihkan file (serta ID yang sama untuk menghubungkan file). Saya tidak ingin menghapus identity_insert dari seluruh tabel, karena kenaikan sebesar satu berfungsi dengan baik. Dalam TBL_Contentprosedur insert to store saya memiliki sesuatu seperti ini

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

Tapi saya tetap mendapatkan kesalahan yang sama:

Tidak dapat memasukkan nilai eksplisit untuk kolom identitas dalam tabel 'TBL_Content' ketika IDENTITY_INSERT disetel ke OFF.

Ada bantuan?

Spooks
sumber

Jawaban:

174

Haruskah Anda mengatur penyisipan identitas ke dalam prosedur tersimpan? Sepertinya Anda menyetelnya ke aktif hanya saat mengubah prosedur tersimpan, bukan saat benar-benar memanggilnya. Mencoba:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
David
sumber
16

Bukankah Anda seharusnya menyetel identity_Insert ON, memasukkan catatan dan kemudian mematikannya kembali?

Seperti ini:

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
Abe Miessler
sumber
14

Saya yakin ini perlu dilakukan dalam satu batch kueri. Pada dasarnya, pernyataan GO memecah perintah Anda menjadi beberapa batch dan itu menyebabkan masalah. Ubah menjadi ini:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
DCNYAM
sumber
1
Anda benar. Inilah intinya! Batch perintah berikutnya untuk penyisipan harus dimulai dengan SET IDENTITY_INSERT tbl_content ON; perintah lagi.
Jettero
9

Peringatan

SQL Server hanya mengizinkan satu tabel untuk mengatur properti IDENTITY_INSERT ke ON.

Ini tidak bekerja:

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

Sebagai gantinya:

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
Edu
sumber
4

Tambahkan baris ini di atas Query Anda

SET IDENTITY_INSERT tbl_content ON
Ankit
sumber
2

Tambahkan set off juga

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Narayan Yerrabachu
sumber