SQL Server Output Clause ลงในตัวแปรสเกลาร์


134

มีวิธี "ง่ายๆ" ในการทำเช่นนี้หรือไม่หรือฉันต้องส่งผ่านตัวแปรตารางด้วยไวยากรณ์ "OUTPUT ... INTO"

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

คำตอบ:


162

คุณต้องมีตัวแปรตารางและมันอาจจะง่ายขนาดนี้

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

47
แต่ฉันต้อง "SELECT @someInt = ID FROM @ID" ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะข้ามขั้นตอนพิเศษนั้น (และตัวแปรตารางตัวกลาง) หากสิ่งที่ฉันต้องการคือ int ที่เป็นผลลัพธ์
Benoittr

@Benoittr - ขึ้นอยู่กับว่าคุณจะใช้ค่าอย่างไรอาจไม่จำเป็นคุณสามารถใช้ตารางในประโยคจากประโยคเลือก เมื่อคุณกำหนดตัวแปรคุณต้องแน่ใจด้วยว่าแทรกได้แทรกเพียงแถวเดียว และถ้าแทรกเพียงแถวเดียวอาจจะง่ายกว่าที่จะยึดสิ่งที่ใช้ในอนุประโยคค่าโดยตรงแทนที่จะใช้output?
Mikael Eriksson

4
ในกรณีของค่าที่สร้างขึ้นโดยอัตโนมัติจะไม่สามารถทราบค่าล่วงหน้าได้เสมอไป (ข้อมูลประจำตัวคอลัมน์จากการคำนวณ) ฉันเข้าใจว่ามีวิธีแก้ปัญหามากมาย ถึงกระนั้นคุณก็ให้คำตอบที่ฉันต้องการ ขอบคุณ
Benoittr

1
ต้องการในตัวแปรปกติหรือไม่? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
Arvo Bowen

32

ในอีกหนึ่งปีต่อมา ... หากสิ่งที่คุณต้องการคือรับรหัสที่สร้างขึ้นโดยอัตโนมัติของตารางคุณก็ทำได้

SELECT @ReportOptionId = SCOPE_IDENTITY()

มิฉะนั้นดูเหมือนว่าคุณจะติดอยู่กับการใช้โต๊ะ


6
ตัวแปรที่ฉันกำลังมองหาเป็นอย่างอื่นจากนั้นก็คือคอลัมน์เอกลักษณ์ ยังคงขอบคุณสำหรับคำตอบ
Benoittr

27
เห็นได้ชัดว่าสิ่งนี้มีปัญหาใน Multi Processor Parallel Plan และ OUTPUT เป็นวิธีเดียวที่น่าเชื่อถือเสมอ
andrewb

6
SCOPE_IDENTITY () อาจส่งคืนบางสิ่งแม้ว่าINSERT สุดท้ายจะไม่ได้แทรกอะไรเลยใช่ไหม นั่นจะทำให้ไม่สามารถใช้งานได้ในบางกรณี
Patrick Honorez

2
ดีกว่าที่จะใช้ประโยคผลลัพธ์
Clay Smith

1
ข้อผิดพลาด @andrewb หมายถึงการแก้ไขใน2008 R2 SP1
adam0101

6

ในภายหลัง แต่ก็ยังควรกล่าวถึงคือคุณยังสามารถใช้ตัวแปรเพื่อส่งออกค่าใน SET clause ของ UPDATE หรือในฟิลด์ของ SELECT

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

ในตัวอย่างด้านบน @ val1 มีค่า before และ @ val2 มีค่า after แม้ว่าฉันสงสัยว่าการเปลี่ยนแปลงใด ๆ จากทริกเกอร์จะไม่อยู่ใน val2 ดังนั้นคุณต้องไปกับตารางผลลัพธ์ในกรณีนั้น สำหรับอะไรก็ตามนอกจากกรณีที่ง่ายที่สุดฉันคิดว่าตารางผลลัพธ์จะสามารถอ่านได้มากขึ้นในโค้ดของคุณเช่นกัน

สถานที่แห่งหนึ่งที่มีประโยชน์มากคือหากคุณต้องการเปลี่ยนคอลัมน์ให้เป็นรายการที่คั่นด้วยจุลภาค

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

ขอบคุณ! นี่คือข้อมูลที่ฉันต้องการ
Wizou

1
ว้าว! SET @val2 = NextNum = NextNum + 1ผมไม่ทราบว่าคุณที่คุณสามารถทำได้
แซม

แตกต่างอย่างสิ้นเชิงกับสิ่งที่ถามไม่ได้ช่วยอะไรเลยเพราะฉันกำลังมองหาวิธีกำหนดOUTPUTค่าให้กับตัวแปรในINSERTประโยคโดยใช้INSERT-OUTPUT-VALUESวิธีการตามที่ผู้ถามถาม
Fawad Raza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.