2008-09-10 12 views
12

Trong SQL Server 2005, tôi có trường "id" trong bảng có thuộc tính "Nhận dạng" được đặt thành 'Có'. Vì vậy, khi một Chèn được thực hiện trên bảng đó, "id" được đặt tự động thành số nguyên gia tăng tiếp theo. Có cách nào dễ dàng khi Chèn được thực hiện để có được những gì "id" đã được thiết lập mà không cần phải làm một lệnh Select ngay sau khi chèn?Trong SQL Server có thể nhận được "id" của một bản ghi khi Chèn được thực thi không?

bản sao của:
Best way to get identity of inserted row?

Trả lời

32

Trong Net ít nhất, bạn có thể gửi nhiều truy vấn đến máy chủ trong một đi. Tôi làm điều này trong ứng dụng của tôi:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; 
int id = (int)command.ExecuteScalar(); 

Hoạt động như một sự quyến rũ.

+3

Giải pháp này là tốt khi chỉ đối phó với thông tin cập nhật hàng duy nhất. Để có giải pháp cập nhật hàng loạt tốt, hãy xem câu trả lời của kamajo. – CodeWarrior

+1

Đối với những người tìm cách làm điều đó với MySQL: chỉ cần thay SCOPE_IDENTITY bằng LAST_INSERT_ID. Hoặc đơn giản là sử dụng tham số LastInsertedId trên MySqlCommand; –

+0

Tôi gặp lỗi khi truyền giá trị trả về của ExecuteScalar() thẳng đến int. Hoạt động OK khi tôi truyền nó thành số thập phân. –

1

Bạn phải chọn SCOPE_IDENTITY() chức năng.

Để thực hiện điều này từ mã ứng dụng, tôi thường đóng gói quy trình này trong quy trình được lưu trữ để nó vẫn trông giống như một truy vấn cho ứng dụng của tôi.

2

SCOPE_IDENTITY(); là đặt cược tốt nhất của bạn. Và nếu bạn đang sử dụng .NET chỉ cần vượt qua một tham số của chúng tôi và kiểm tra giá trị sau khi thủ tục được chạy.

CREATE PROCEDURE [dbo].[InsertProducts] 
    @id    INT    = NULL OUT, 
    @name   VARCHAR(150) = NULL, 
    @desc   VARCHAR(250) = NULL 

AS 

    INSERT INTO dbo.Products 
     (Name, 
     Description) 
    VALUES 
     (@name, 
     @desc) 

    SET @id = SCOPE_IDENTITY(); 
14

Nếu bạn đang chèn nhiều hàng, việc sử dụng các OUTPUTINSERTED.columnname khoản trên báo cáo kết quả insert là một cách đơn giản để nhận được tất cả các id vào một bảng temp.

DECLARE @MyTableVar table(ID int, 
           Name varchar(50), 
           ModifiedDate datetime); 
INSERT MyTable 
     OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar 
SELECT someName, GetDate() from SomeTable 
+0

Tôi thích điều này! Cảm ơn vì tiền hỗ trợ. – CodeWarrior

+0

BTW, không chắc chắn nếu nó là phiên bản cụ thể (bây giờ là 2012 và tôi đang trên SQL 10.0.1600) nhưng bạn không cần phải đi qua một bảng tạm thời cho điều này - bạn chỉ có thể đầu ra trực tiếp. Tôi cũng thích rằng điều này làm việc cho các lĩnh vực GUID quá, nếu chúng được sử dụng như PK ... không phải là tôi ủng hộ làm điều đó rất nhiều, nhưng nó hoạt động. –

1

Tôi có xu hướng thích gắn trình kích hoạt vào bảng bằng trình quản lý doanh nghiệp. Bằng cách đó bạn không cần phải lo lắng về việc viết ra các câu lệnh sql bổ sung trong mã của bạn. Mine giống như thế này:

Tạo Kích hoạt tblName On dbo.tblName Đối Chèn Như chọn NEW_ID = @@ IDENTITY

Sau đó, từ bên trong mã của bạn, đối xử với báo cáo chèn của bạn như chọn statements- Just thực hiện và đánh giá kết quả. cột "newID" sẽ chứa danh tính của hàng bạn vừa tạo.