IDENTITY_INSERT ถูกตั้งค่าเป็นปิด - จะเปิดได้อย่างไร?


112

ฉันมีฐานข้อมูลไฟล์เก็บถาวรที่ถูกลบซึ่งเก็บ ID ของไฟล์ที่ถูกลบฉันต้องการให้ผู้ดูแลระบบสามารถกู้คืนไฟล์ได้ (รวมถึง ID เดียวกันสำหรับการลิงก์ไฟล์) ฉันไม่ต้องการนำ 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

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



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.