2012-06-12 49 views
163

Nếu tôi có một tuyên bố chèn như:Làm cách nào để sử dụng mệnh đề OUTPUT của câu lệnh INSERT để nhận giá trị nhận dạng?

INSERT INTO MyTable 
( 
    Name, 
    Address, 
    PhoneNo 
) 
VALUES 
(
    'Yatrix', 
    '1234 Address Stuff', 
    '1112223333' 
) 

Làm thế nào để tôi thiết @var INT giá trị bản sắc hàng mới (gọi là Id) sử dụng mệnh đề OUTPUT? Tôi đã nhìn thấy các mẫu đặt INSERTED.Name vào các biến bảng, ví dụ, nhưng tôi không thể đưa nó vào một biến không phải bảng.

Tôi đã thử OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, nhưng cả hai đều không hoạt động.

+2

Tôi biết về @@ SCOPE_IDENTITY, tôi đặc biệt muốn biết cách làm điều đó với OUPUT. Cảm ơn. – Yatrix

+6

Bạn cần phải chèn nó vào một biến bảng sau đó chọn từ đó. Không có cú pháp nào gán trực tiếp cho biến vô hướng từ mệnh đề 'OUTPUT'. –

+3

[Mệnh đề OUTPUT] (http://msdn.microsoft.com/en-us/library/ms177564.aspx) phải xuất thành một biến bảng hoặc bảng .. – mellamokb

Trả lời

320

Bạn có thể có mới chèn ID đang được đầu ra cho SSMS console như thế này:

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

Bạn có thể sử dụng điều này cũng từ ví dụ C#, khi bạn cần lấy lại ID cho ứng dụng gọi điện của mình - chỉ cần thực hiện truy vấn SQL với .ExecuteScalar() (thay vì .ExecuteNonQuery()) để đọc kết quả ID quay lại.

Hoặc nếu bạn cần phải nắm bắt mới được chèn ID bên trong T-SQL (ví dụ để chế biến tiếp sau đó), bạn cần phải tạo ra một biến bảng:

DECLARE @OutputTbl TABLE (ID INT) 

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID INTO @OutputTbl(ID) 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

Bằng cách này, bạn có thể đặt nhiều giá trị vào @OutputTbl và tiến hành xử lý thêm trên chúng. Bạn cũng có thể sử dụng bảng tạm thời "thông thường" (#temp) hoặc thậm chí là bảng liên tục "thực" là "mục tiêu đầu ra" của bạn tại đây.

+2

Câu trả lời ở đây cho mã phía sau là ngắn gọn. ExecuteScalar() FTW –

+5

Bạn có thể chèn kết quả vào một bảng 'persistent thực' - điều này cực kỳ tuyệt vời vì nó có nghĩa là bạn có thể 'INSERT' thông tin trong các bảng' HAI 'cùng một lúc. – gotqn

+2

Đừng bao giờ sử dụng @@ IDENTITY để kéo từ trên xuống. Nói cách khó khăn khi làm việc với trình kích hoạt và vì họ ghi lại lịch sử các thay đổi được thực hiện cho một bảng và chèn vào một bảng mới cùng lúc @@ IDENTITY bắt đầu trả về các giá trị từ bảng lịch sử. sự vui nhộn xảy ra từ đó! Vui lòng sử dụng giải pháp marc_s '. trong thời gian này tôi đã đi với phương pháp @OutputTbl, nhưng tôi bị hấp dẫn bởi các tùy chọn khác. –

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