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
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
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).
Greate. Cảm ơn. –
Tôi sẽ luôn ** sử dụng SCOPE_IDENTITY thay vì @@ IDENTITY –
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. –
Như thế này:
INSERT INTO Table(...)
OUTPUT INSERTED.IdColumn
VALUES(...)
điều này sẽ làm việc trong t-sql? khi sử dụng exec @sql? –
Đ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
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)
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
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)
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
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? –
Tôi cần chính xác @@ Identity. –
@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 đó? –