2010-10-12 27 views

Trả lời

11
SELECT SCOPE_IDENTITY() 

Sử dụng này sau khi tuyên bố chèn của bạn và nó sẽ đưa bạn trở bản sắc của chèn vào trong phạm vi của bạn. Bạn có thể gán điều này cho biến hoặc trả về nó trong một tham số đầu ra.

+0

Phạm vi là gì? 2 chủ đề là phạm vi khác nhau? –

+0

có chúng. kiểm tra http://msdn.microsoft.com/en-us/library/ms190315.aspx để biết tài liệu chi tiết về SCOPE_IDENTITY – Numenor

+0

cách SCOPE_IDENTITY() khác với @@ identity, SCOPE_IDENTITY() tự trả về @@ identity ... và trong câu trả lời của tôi, tôi đã trả về danh tính @@ sau khi chèn ... – RameshVel

0

Tôi nghĩ bạn có thể viết một proc được lưu trữ có tham số vào/ra và sau đó lấy giá trị từ tham số.

2

Hãy thử điều này

@@identity 

dưới mẫu mã

strSQL = "INSERT INTO tablename (name) VALUES (@name);SELECT @@Identity" 
SQLCommand.CommandText = strSQL 
Id = SQLCommand.ExecuteScalar() 
+0

này sẽ không được đề an toàn. – Numenor

+0

@Numenor, Làm thế nào đây không phải là chủ đề an toàn ... ?? – RameshVel

+0

@Numenor - bạn đang nói về cái gì?Đó là chủ đề hoàn toàn an toàn, vì cả hai lệnh đang được thực hiện trong một truy vấn đơn lẻ. –

3

Bạn nên sử dụng Scope_Identity() cho trường hợp này. Điều này sẽ trả về Identity cho phạm vi hiện tại. @@Identity trả về danh tính được chèn cuối cùng.

Hãy xem Scope Identity on MSDN - có ví dụ về cách @@Identity sẽ trở lại giá trị không chính xác so với sử dụng Scope_Identity

2

Một phương pháp thực hiện thay thế là sử dụng OUTPUT khoản của ngôn ngữ T-SQL.

Ví dụ:

create table #tmpTable 
(
    ID int identity(1,1) not null primary key, 
    SomeValue varchar(20) not null 
); 

insert #tmpTable 
output INSERTED.ID 
values('SomeTextData') 

drop table #tmpTable; 

Từ một quan điểm thiết kế giải pháp tổng thể tôi sẽ ủng hộ mà bạn nhìn quấn Logic chèn của bạn thành một Stored Procedure (trở về ID bản ghi chèn) mà bạn gọi từ mã nguồn ứng dụng của bạn .

0

Tôi khá chắc chắn bạn sẽ muốn sử dụng phương thức ObjectContext.ExecuteStoreQuery nếu bạn cần giá trị danh tính, thay vì ObjectContext.ExecuteStoreCommand.

Bạn sẽ cần phải sử dụng, như những người khác đã đề cập SCOPE_IDENTITY(), chứ không phải là @@IDENTITY như SCOPE_IDENTITY() trả về giá trị bản sắc cho phạm vi thực hiện currente wheras @@IDENTITY "Là một chức năng hệ thống mà trả về giá trị bản sắc cuối chèn vào."

Something như thế này nên làm như lừa:

using(var context = GetAContextThatsReadyToUse()) 
{ 
    var valueForColumn1 = 5; 
    var result = ExecuteStoreQuery<int>("INSERT INTO table1 (Column1) VALUES ({0});SELECT SCOPE_IDENTITY()", valueForColumn1); 

    foreach(var item in result) 
    { 
     // Should only return one result, which is the identity value inserted by ExecuteStoreQuery 
     Console.WriteLine(item); 
    } 
} 
0

Tôi có rất nhiều tình huống mà một cái gì đó như 100 các quy trình đã được viết tại một bảng cùng một lúc. Tôi đã không sử dụng SCOPE_IDENTITY() nhưng đã được gói toàn bộ chèn/ID lấy vào một giao dịch, và không có bất kỳ vấn đề với cách tiếp cận đó.

Các vấn đề liên quan