2012-11-15 43 views
16

Tôi sẽ nhập nhiều hàng dữ liệu từ tệp csv vào cơ sở dữ liệu SQL Server (thông qua ứng dụng web). Tôi cần giá trị id được tạo tự động cho khách hàng.Có cách nào để sử dụng SCOPE_IDENTITY nếu sử dụng câu lệnh chèn nhiều không?

Nếu tôi làm điều này trong một vòng lặp, hiệu suất là rất xấu (nhưng tôi có thể sử dụng SCOPE_IDENTITY() mà không có bất kỳ vấn đề nào).

Một giải pháp performant hơn sẽ là một cách như thế này:

INSERT INTO [MyTable] 
VALUES ('1'), ('2'), ('3') 
SELECT SCOPE_IDENTITY() 

Có cách nào để có được tất cả các ID được tạo ra và không chỉ là id tạo cuối cùng?

Cảm ơn sự giúp đỡ của bạn!

Trân trọng, Thorsten

+5

Không, 'SCOPE_IDENTITY()' chỉ cung cấp cho bạn giá trị ** IDENTITY' mới nhất ** được chèn vào **. Nhưng bạn có thể kiểm tra mệnh đề 'OUTPUT' của SQL Server .... –

+0

Nhận xét câu trả lời đã xóa của bạn: Tôi nghĩ bạn nên loại bỏ dòng đầu tiên và thay đổi dòng thứ ba thành' sqlBuilder.Append ("OUTPUT INSERTED.autoid")); Không cần phải đặt đầu ra trong một biến bảng nếu bạn muốn đầu ra cho mã máy khách của bạn. –

Trả lời

33

Không, SCOPE_IDENTITY() chỉ mang đến cho bạn một, mới nhất chèn IDENTITY giá trị. Nhưng bạn có thể check out the OUTPUT clause of SQL Server ....

DECLARE @IdentityTable TABLE (SomeKeyValue INT, NewIdentity INT) 

INSERT INTO [MyTable] 
OUTPUT Inserted.Keyvalue, Inserted.ID INTO @IdentityTable(SomeKeyValue, NewIdentity) 
VALUES ('1'), ('2'), ('3') 

Một khi bạn đã chạy tuyên bố INSERT của bạn, biến bảng sẽ tổ chức "một số giá trị quan trọng" (đối với bạn, để xác định hàng) và mới được chèn ID giá trị cho mỗi hàng được chèn vào. Bây giờ đi điên với điều này! :-)

+0

Cảm ơn tôi sẽ thử nó. –

+0

Có rủi ro nào nếu nhiều người dùng làm việc trên cùng một bảng - họ có thể nhận được id sai (của những người dùng khác) không? –

+0

@ThorstenKraus: không, mỗi giao dịch chỉ nhận được các giá trị của riêng chúng trở lại –