Làm cách nào để sử dụng mệnh đề OUTPUT của câu lệnh INSERT để nhận giá trị danh tính?


240

Nếu tôi có một câu lệnh chèn như:

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

Làm cách nào để đặt @var INTgiá trị nhận dạng của hàng mới (được gọi Id) bằng mệnh đề OUTPUT? Ví dụ, tôi đã thấy các mẫu đưa INSERTED. Ví dụ vào các biến bảng, 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.Idnhưng không phải đã làm việc.


3
Tôi đã biết về @@ SCOPE_IDENTITY, tôi đặc biệt muốn biết cách thực hiện với OUPUT. Cảm ơn.
Yatrix

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

3
Các khoản OUTPUT có đầu ra vào một bảng hoặc bảng biến ..
mellamokb

5
Các OUTPUTkhoản ghi vào một bảng. Nó có thể là một biến bảng, bảng tạm thời, ....
HABO

2
Câu hỏi của tôi đặc biệt yêu cầu mệnh đề OUTPUT.
Yatrix

Câu trả lời:


464

Bạn có thể có ID mới được chèn vào đầu ra cho bảng điều khiển SSMS như thế này:

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

Bạn cũng có thể sử dụng điều này 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 bằng .ExecuteScalar()(thay vì .ExecuteNonQuery()) để đọc IDlại kết quả .

Hoặc nếu bạn cần chụp IDT-SQL mới được chèn bên trong (ví dụ để xử lý tiếp theo), bạn cần tạo 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 @OutputTblvà xử lý thêm trên các giá trị đó. 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 "mục tiêu đầu ra" của mình tại đây.


2
Câu trả lời ở đây cho mã phía sau là súc tích. ExecuteScalar () FTW
Joe Johnston

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

7
Đừng bao giờ sử dụng @@ IDENTITY để lấy từ đầu. Phát huy cách làm việc chăm chỉ với các trình kích hoạt và vì chúng đã 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ử. vui nhộn nảy sinh từ đó! Vui lòng sử dụng giải pháp marc_s '. hiện tại tôi đã sử dụng phương pháp @OutputTbl, nhưng tôi bị hấp dẫn bởi các tùy chọn khác.
Eric Bishard

4
OUTPUT INTO cực kỳ tuyệt vời ngoại trừ "Bảng mục tiêu của mệnh đề OUTPUT INTO không thể nằm ở hai bên của mối quan hệ (khóa chính, khóa ngoại)", đối với tôi là khoảng 99% trường hợp sử dụng tiềm năng. Tôi cho rằng điều này là do mệnh đề OUTPUT có thể trả về dữ liệu ngay cả khi giao dịch được khôi phục, nhưng hơi khó chịu nên rất khó để chèn dữ liệu vào các bảng A và B liên quan trong một lần chụp.
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()hoạt động tốt hơn cho điều đó.
Derreck Trưởng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.