ฉันจะใช้ส่วนคำสั่ง INSERT ของคำสั่ง INSERT เพื่อรับค่าตัวตนได้อย่างไร


240

หากฉันมีคำสั่งแทรกเช่น:

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

ฉันจะตั้งค่า@var INTตัวตนของแถวใหม่ (เรียกว่าId) โดยใช้คำสั่ง OUTPUT ได้อย่างไร ฉันเห็นตัวอย่างของการใส่ INSERTED.Name ลงในตัวแปรตารางตัวอย่างเช่น แต่ฉันไม่สามารถทำให้มันเป็นตัวแปรที่ไม่ใช่ตารางได้

ฉันได้พยายามOUPUT INSERTED.Id AS @var, SET @var = INSERTED.Idแต่ไม่ได้ทำงาน


3
ฉันรู้เกี่ยวกับ @@ SCOPE_IDENTITY แล้วฉันต้องการทราบวิธีการใช้ OUPUT เป็นพิเศษ ขอบคุณ
Yatrix

6
คุณต้องแทรกมันลงในตัวแปรตารางจากนั้นเลือกจากนั้น ไม่มีไวยากรณ์ที่จะกำหนดให้กับตัวแปรสเกลาร์โดยตรงจากส่วนOUTPUTคำสั่ง
Martin Smith

3
ส่วนคำสั่ง OUTPUTจะต้องส่งออกเป็นตัวแปรตารางหรือตาราง ..
mellamokb

5
OUTPUTประโยคเขียนลงในตาราง สามารถเป็นตัวแปรตาราง, ตารางชั่วคราว, ...
HABO

2
คำถามของฉันถามถึงข้อ OUTPUT โดยเฉพาะ
Yatrix

คำตอบ:


464

คุณสามารถให้ ID ที่แทรกใหม่ซึ่งกำลังถูกส่งออกไปยังคอนโซล SSMS ดังนี้:

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

คุณสามารถใช้สิ่งนี้ได้จาก C # เช่นเมื่อคุณต้องการรับ ID กลับไปที่แอพที่คุณโทร - เพียงแค่รันการสืบค้น SQL ด้วย.ExecuteScalar()(แทน.ExecuteNonQuery()) เพื่ออ่านผลลัพธ์IDกลับมา

หรือถ้าคุณต้องการจับภาพแทรกใหม่IDภายใน T-SQL (เช่นสำหรับการประมวลผลเพิ่มเติมภายหลัง) คุณต้องสร้างตัวแปรตาราง:

DECLARE @OutputTbl TABLE (ID INT)

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

ด้วยวิธีนี้คุณสามารถใส่ค่าหลายค่าลงใน@OutputTblและทำการประมวลผลเพิ่มเติมสำหรับค่าเหล่านั้น คุณสามารถใช้ตารางชั่วคราว "ปกติ" ( #temp) หรือแม้กระทั่งตารางถาวร "ของจริง" เป็น "เป้าหมายเอาต์พุต" ของคุณได้ที่นี่


2
คำตอบที่นี่สำหรับโค้ดด้านหลังนั้นรัดกุม ExecuteScalar () FTW
Joe Johnston

10
คุณสามารถแทรกผลลัพธ์ในreal persistent table- นี่ยอดเยี่ยมมากเพราะมันหมายความว่าคุณสามารถINSERTข้อมูลในTWOตารางในเวลาเดียวกัน
gotqn

7
อย่าใช้ @@ ตัวระบุเพื่อดึงจากด้านบน เล่าถึงวิธีการทำงานอย่างหนักกับทริกเกอร์และเนื่องจากพวกเขาบันทึกประวัติการเปลี่ยนแปลงที่เกิดขึ้นกับหนึ่งตารางและแทรกเข้าไปในตารางใหม่ในเวลาเดียวกัน @@ IDENTITY เริ่มส่งคืนค่าจากตารางประวัติ ความฮือฮามาจากที่นั่น! โปรดใช้โซลูชันของ marc_s ตอนนี้ฉันได้ใช้วิธีการ @OutputTbl แต่ฉันสนใจตัวเลือกอื่น ๆ
Eric Bishard

4
ผลลัพธ์ที่ยอดเยี่ยมมากยกเว้นว่า "ตารางเป้าหมายของส่วนคำสั่ง OUTPUT INTO ไม่สามารถอยู่บนทั้งสองด้านของความสัมพันธ์ (คีย์หลัก, คีย์ต่างประเทศ)" ซึ่งสำหรับฉันมีโอกาสใช้งานประมาณ 99% ฉันคิดว่านี่เป็นเพราะส่วนคำสั่ง OUTPUT สามารถส่งคืนข้อมูลได้แม้เมื่อธุรกรรมถูกย้อนกลับ แต่มันก็น่ารำคาญนิดหน่อยมันยากที่จะแทรกข้อมูลลงในตาราง A และ B ที่เกี่ยวข้องในนัดเดียว
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()ทำงานได้ดีขึ้นสำหรับสิ่งนั้น
Derreck Dean
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.