2010-09-13 30 views
6

Có ai đó biết cách tôi có thể trả lại số @@Identity khi sử dụng T-Sql không?T-Sql @@ Identity

Something như thế này:

set @Sql = "insert into table....values()..." 
exec @sql 
return @@Identity 
+1

gì làm bạn có nghĩa là trở lại @@ Identity? Từ đâu? Và bạn có thực sự cần @@ Identity hoặc scope_identity không? –

+0

Tôi cần chính xác @@ Identity. –

+0

@user - Vì vậy, nếu một kích hoạt trên bảng gốc chèn vào một bảng khác với một cột nhận dạng bạn cần danh tính cho bảng thứ hai đó? –

Trả lời

3
INSERT INTO TableName (Field1, Field2, Field3) VALUES (1, 2, 3); 
SELECT SCOPE_IDENTITY(); 

Đây là một lô nhiều câu lệnh, vì vậy tôi không chắc chắn rằng mọi thư viện ứng dụng sẽ trả về các giá trị theo cùng một cách; ví dụ, trong ADO cổ điển, có thể bạn cần phải chuyển sang bản ghi tiếp theo trước khi bạn có thể đọc giá trị. Nhưng nếu bạn đang sử dụng ADO.NET, tôi biết rằng bạn chỉ có thể sử dụng ExecuteScalar trên toàn bộ chuỗi ở trên và nó sẽ trả lại giá trị SCOPE_IDENTITY của bạn tốt.

Thận trọng: ADO.NET sẽ trả lại giá trị là decimal, không phải là int như bạn có thể mong đợi. Điều này là do SCOPE_IDENTITY, vì bất kỳ lý do gì, được nhập là numeric(38,0). Vì vậy, bạn cần phải đưa kết quả ExecuteScalar lên decimal trước khi bạn truyền đến int hoặc bạn cần SELECT CAST(SCOPE_IDENTITY() AS INT) (giả sử trường IDENTITY của bạn là INT và không phải là loại số lớn hơn).

+0

Greate. Cảm ơn. –

+3

Tôi sẽ luôn ** sử dụng SCOPE_IDENTITY thay vì @@ IDENTITY –

+0

Tôi thậm chí không biết về 'SCOPE_IDENTITY', nhưng có vẻ như bạn đã đúng. Từ một vài phút lướt web, có vẻ như sẽ có một số trường hợp kỳ lạ (như INSERT gây ra nhiều INSERTs vào các bảng khác) để làm cho '@@ IDENTITY' sai; nhưng bạn vẫn đúng, 'SCOPE_IDENTITY' là Điều Đúng. Tôi đã cập nhật câu trả lời của mình. –

5

Như thế này:

INSERT INTO Table(...) 
OUTPUT INSERTED.IdColumn 
VALUES(...) 
+0

điều này sẽ làm việc trong t-sql? khi sử dụng exec @sql? –

+0

Điều này sẽ hoạt động trong năm 2008 trở lên. Và vẻ đẹp của nó là bạn có thể reutrn các lĩnh vực khác là tốt nếu bạn cần chúng. – HLGEM

4

Nối "; chọn @@ sắc" để tuyên bố chèn của bạn:

insert into tab (x,y,z) values (a,b,c); select @@identity 

Các giá trị trả về là ID (sử dụng ExecuteScalar)

+1

Xin lưu ý rằng việc sử dụng @@ identity sẽ mang lại kết quả không chính xác nếu bạn có trình kích hoạt chèn chèn hàng vào một bảng khác với cột nhận dạng. Đó là an toàn hơn và tương lai hơn bằng chứng để sử dụng SCOPE_IDENTITY như Ken cho thấy. Xem http://msdn.microsoft.com/vi-us/library/ms190315.aspx. – EventHorizon

7

Dường như một trong các yêu cầu tiềm ẩn của bạn là thực thi SQL động. Trong khi tôi muốn tư vấn cho chống lại điều này, bạn có thể thực hiện những gì bạn đang tìm kiếm với điều này:

set @Sql = 'insert into table....values()...; select SCOPE_IDENTITY()' 
exec(@Sql) 
1

Bạn có thể sử dụng này

Insert into Table(Col2, Col3) 
output inserted.Id 
values ('xyz', 'abc') 

đâu Id là lĩnh vực nhận dạng của bạn