วิธีเปิดและปิด IDENTITY_INSERT โดยใช้ SQL Server 2008


461

เหตุใดฉันจึงได้รับข้อผิดพลาดในการแทรกเมื่อIDENTITY_INSERTตั้งค่าเป็นปิด

ฉันจะเปิดอย่างถูกต้องใน SQL Server 2008 ได้อย่างไร ใช้ SQL Server Management Studio หรือไม่

ฉันได้เรียกใช้แบบสอบถามนี้:

SET IDENTITY_INSERT Database. dbo. Baskets ON

จากนั้นฉันได้รับข้อความกลับในคอนโซลที่คำสั่งดำเนินการเสร็จสมบูรณ์ อย่างไรก็ตามเมื่อฉันเรียกใช้แอปพลิเคชันมันยังคงให้ข้อผิดพลาดที่แสดงด้านล่าง:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

โปรดขยายคำถามนี้เพื่อให้เราเข้าใจว่าคุณกำลังพยายามทำอะไร คุณใช้คำสั่งอะไรเมื่อคุณพบข้อผิดพลาดนี้และข้อความจริงของข้อความแสดงข้อผิดพลาดคืออะไร
แมตต์กิบสัน

ถึงแม้ว่าคุณจะถามคำถามอื่นคุณควรจะยอมรับคำตอบที่นี่: เราตอบสิ่งที่คุณถาม
GBN

8
ฉันมีแนวคิดที่น่ากลัวว่ามีคนพยายามส่งค่าข้อมูลประจำตัวจากแอปพลิเคชัน นี่ไม่ใช่สิ่งที่คุณควรทำยกเว้นการโยกย้ายข้อมูลไม่บ่อยนัก หากคุณทำเช่นนี้เป็นประจำเพียงพอที่จะเรียกใช้จากแอปพลิเคชันคุณอาจต้องทบทวนการออกแบบตารางของคุณอีกครั้ง
HLGEM

ฉันใช้สิ่งนี้ในการสำรองข้อมูลสคริปต์ SQL ของฉัน ในระหว่างการคืนค่านี้ให้ฉันโหลดข้อมูลลงในตารางรวมอัตโนมัติด้วยค่าเดิม การสำรองข้อมูลสคริปต์ให้ฉันลดระดับฐานข้อมูล SQL การสร้างการสำรองข้อมูลแบบสคริปต์ของ Management Studio ทำให้สคริปต์ไม่สามารถโหลดได้ถ้าฉันเก็บข้อมูลไบนารีในฟิลด์ข้อความ
Jettero

คำตอบ:


771

ผ่าน SQL ตามMSDN

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

ข้อความแสดงข้อผิดพลาดจะบอกคุณอย่างชัดเจนว่ามีอะไรผิดปกติ ...

ไม่สามารถแทรกค่าที่ชัดเจนสำหรับคอลัมน์ข้อมูลประจำตัวในตาราง 'someableWithIdentity' เมื่อ IDENTITY_INSERT ถูกตั้งค่าเป็นปิด


@ เริ่มต้น: คุณแม้ว่าดังนั้นข้อผิดพลาด เราจะรู้ได้อย่างไรว่าคุณไม่ต้องการแทรกค่า เรามีเพียงข้อผิดพลาด
GBN

3
ข้อผิดพลาดมาจากแอพของฉันเมื่อฉันทำ DB.SaveChanges ();
เริ่มต้น

5
ไม่เพียงหยุดส่งค่าสำหรับคอลัมน์ข้อมูลประจำตัว หรือตั้งค่าหากคุณต้องการในแอปของคุณหากคุณต้องการส่งค่า ..... แต่ทำไมคอลัมน์จึงมีคอลัมน์ที่มีคุณสมบัติของตัวตนตั้งค่าให้สร้างค่า? เราไม่สามารถตัดสินใจสำหรับคุณ
GBN

22
@ ผู้เริ่มต้น: การตั้งค่าใช้งานได้เฉพาะในเซสชันปัจจุบัน (ไม่มีใครชี้ให้เห็นสำหรับคำถามนี้) ดังนั้นแอปพลิเคชันของคุณจะต้องเปิดใช้งานเพื่อให้แอปพลิเคชันดำเนินการแทรกดังกล่าว มันจะปิดอีกครั้งเมื่อมีการสรุปเม็ดมีดเช่น gbn แสดง) วิธีที่คุณแทรกค่าในคอลัมน์ข้อมูลระบุตัวตนโดยไม่ทราบว่ามันไม่ชัดเจน แต่บางที SQL Server เวอร์ชันเก่าจะรวมค่านั้นกับคอลัมน์ทั้งหมดโดยปริยายเมื่อไม่มีการระบุคอลัมน์แทรกอย่างชัดเจน (?) ตามที่ Ismael แนะนำ
Rob Parker

2
@Rob ฉันคิดว่าคุณมีจุดและฉันล้มเหลวในการตรวจสอบรหัสในรหัสใด ๆ ที่ไม่ใส่โดยไม่ต้องระบุคอลัมน์ นอกเหนือจากเวลาที่สูญเสียไปกับข้อผิดพลาดนี่เป็นแนวทางปฏิบัติที่มีความเสี่ยงและคุณสามารถจบลงด้วยปัญหาความสมบูรณ์ของข้อมูลที่ร้ายแรงหากข้อมูลคอลัมน์ไม่ตรงกันอย่างถูกต้อง
HLGEM

59

ฉันพบปัญหาที่ไม่อนุญาตให้ฉันแทรกแม้หลังจากการตั้งค่า IDENTITY_INSERT เปิด

ปัญหาคือว่าฉันไม่ได้ระบุชื่อคอลัมน์และด้วยเหตุผลบางอย่างมันไม่ชอบมัน

INSERT INTO tbl Values(vals)

ดังนั้นโดยทั่วไปแล้วให้ใส่ INSERT แบบเต็มลงใน tbl (cols) ค่า (vals)


6
อย่าถามคำถามในแผงคำตอบ
Duk

4
นี่คือสิ่งที่ฉันต้องการอย่างแน่นอนเพื่อระบุรายการคอลัมน์ (ทั้งสองคอลัมน์บนโต๊ะ blah)
Maslow

36

นำเข้า: คุณต้องเขียนคอลัมน์ในINSERTคำสั่ง

INSERT INTO TABLE
SELECT * FROM    

ไม่ถูกต้อง.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

ถูกต้อง


2
ขอบคุณที่เป็นประโยชน์มาก
José Romero

1
หากคุณมีคอลัมน์ที่เหมือนกันในทั้งสองตารางคุณสามารถทำได้โดยไม่แสดงรายการคอลัมน์ใน select (Field1 .. ) เช่นนี้ ... แทรกลงใน Table (Field1, ... ) เลือก * จาก Table ... และถ้าคุณมี ฟิลด์รหัสประจำตัวที่ต้องใส่ก่อนทำ ** SET IDENTITY_INSERT Table_name ON
user3590235

@ user3590235 นั่นคือการสันนิษฐานที่มีความเสี่ยงที่จะทำให้รายการคอลัมน์เหมือนกัน นอกแบบสอบถามผู้ใช้ด้วยตนเองอย่าทำอย่างนั้นเพราะฉันรับประกันว่าคุณจะหยุดพักวันหนึ่งเมื่อคนอื่นแก้ไขข้อกำหนดของตารางโดยไม่ต้องอัปเดตข้อมูลอ้างอิงของคุณ
Elaskanator

5

ฉันรู้ว่านี่เป็นเธรดที่เก่ากว่า แต่ฉันเพิ่งชนเข้ากับสิ่งนี้ หากผู้ใช้พยายามเรียกใช้การแทรกในคอลัมน์ข้อมูลประจำตัวหลังจากเซสชันอื่น ๆ ตั้งค่า IDENTITY_INSERT ON เขาจะต้องได้รับข้อผิดพลาดด้านบน

การตั้งค่าการแทรกข้อมูลประจำตัวและคำสั่งแทรก DML ที่ตามมาจะถูกเรียกใช้โดยเซสชันเดียวกัน

ที่นี่ @ ผู้เริ่มต้นได้ตั้งค่าการแทรกข้อมูลประจำตัวแยกต่างหากจากนั้นเรียกใช้แทรกจากแอปพลิเคชัน นั่นคือเหตุผลที่เขาได้รับข้อผิดพลาดด้านล่าง:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

กรณีนี้น่าจะเกิดขึ้นเมื่อคุณมีเขตข้อมูลคีย์หลักและคุณกำลังแทรกค่าที่ซ้ำกันหรือคุณตั้งค่าสถานะ INSERT_IDENTITY


0

ดูเหมือนว่าจำเป็นต้องใส่SET IDENTITY_INSERT Database.dbo.Baskets ON;ก่อนทุกINSERTชุดการส่งSQL

คุณสามารถส่งหลายINSERT ... VALUES ...คำสั่งที่เริ่มต้นด้วยSET IDENTITY_INSERT ... ON;สตริงเดียวที่จุดเริ่มต้น อย่าใส่ตัวคั่นแบทช์ระหว่างกัน

ฉันไม่รู้ว่าทำไมSET IDENTITY_INSERT ... ONหยุดทำงานหลังจากบล็อกส่ง (เช่น: เป็น.ExecuteNonQuery()C #) ฉันต้องใส่SET IDENTITY_INSERT ... ON;อีกครั้งที่จุดเริ่มต้นของสตริงคำสั่ง SQL ต่อไป


บางทีนี่อาจตอบคำถามของคุณ: stackoverflow.com/questions/5791941/…
Demetris Leptos

-1

คุณต้องเพิ่มคำสั่ง 'ไป' หลังจากที่คุณตั้งค่าการแทรกข้อมูลประจำตัว ตัวอย่าง:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
คำถามนี้มีอายุสี่ปีและมีคำตอบที่ยอมรับได้ คำตอบของคุณซ้ำคำตอบที่ได้รับการยอมรับ
Ghost

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