IDENTITY_INSERT được đặt thành TẮT - Làm cách nào để BẬT?


111

Tôi có một cơ sở dữ liệu lưu trữ tệp đã xóa lưu trữ ID của tệp đã bị xóa, tôi muốn quản trị viên có thể khôi phục tệp (cũng như cùng một ID để liên kết các tệp). Tôi không muốn loại bỏ danh tính_tính_chính_thường khỏi toàn bộ bảng, vì sự gia tăng từng thứ một hoạt động tốt. Trong phụ trang của tôi để TBL_Contentlưu trữ thủ tục, tôi có một cái gì đó như thế này

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

Nhưng tôi vẫn gặp lỗi tương tự:

Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'TBL_Content' khi IDENTITY_INSERT được đặt thành TẮT.

Bất kỳ giúp đỡ?

Câu trả lời:


173

Thay vào đó, bạn có nên bật chèn danh tính trong quy trình được lưu trữ không? Có vẻ như bạn đang đặt nó thành chỉ khi thay đổi quy trình được lưu trữ, không phải khi thực sự gọi nó. Thử:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

16

Bạn không nên thiết lập ID_Insert ON, chèn các bản ghi và sau đó tắt nó đi?

Như thế này:

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

Tôi tin rằng nó cần được thực hiện trong một lô truy vấn duy nhất. Về cơ bản, các câu lệnh GO đang chia các lệnh của bạn thành nhiều đợt và điều đó gây ra sự cố. Thay đổi nó thành thế này:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

1
Bạn đúng. Đây là điểm! Lô lệnh tiếp theo để chèn phải bắt đầu với SET IDENTITY_INSERT tbl_content ON; lệnh một lần nữa.
Jettero

9

Nhắc nhở

SQL Server chỉ cho phép một bảng có thuộc tính IDENTITY_INSERT được đặt thành BẬT.

Điều này không hoạt động:

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

Thay thế:

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

Thêm dòng này phía trên bạn Truy vấn

SET IDENTITY_INSERT tbl_content ON

2

Thêm thiết lập cũng

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.