วันนี้ฉันดูส่วนคำสั่งเอาต์พุตใน SQL Server 2005 เพื่อให้คุณสามารถส่งคืนข้อมูลไปยังตัวแปรตารางจากคำสั่งการแก้ไข (INSERT, UPDATE, DELETE) สถานการณ์ที่เป็นประโยชน์สำหรับ DML พร้อมผลลัพธ์ ได้แก่ การล้างข้อมูลและการเก็บถาวร แอปพลิเคชันการรับส่งข้อความ และสถานการณ์อื่นๆ ไวยากรณ์ของส่วนคำสั่ง OUTPUT ใหม่นี้คือ:
เอาต์พุต <dml_select_list> INTO @table_variable
สามารถเข้าถึงรูปภาพเก่า/ใหม่ของแถวที่แก้ไขโดยอ้างอิงตารางที่แทรกและตารางที่ถูกลบ ในวิธีเดียวกันกับการเข้าถึงทริกเกอร์ ในคำสั่ง INSERT สามารถเข้าถึงได้เฉพาะตารางที่แทรกไว้เท่านั้น ในคำสั่ง DELETE คุณจะสามารถเข้าถึงเฉพาะตารางที่ถูกลบเท่านั้น ในคำสั่ง UPDATE คุณสามารถเข้าถึงตารางที่แทรกและตารางที่ถูกลบได้ ต่อไปนี้คือตัวอย่างจาก MSDN:
เป็นตัวอย่างของการล้างและการเก็บถาวรโครงร่างที่อาจเป็นประโยชน์สำหรับ DML พร้อมผลลัพธ์ สมมติว่าคุณมีตาราง Order ขนาดใหญ่ และคุณต้องการล้างข้อมูลประวัติเป็นประจำ คุณยังต้องการคัดลอกข้อมูลที่ล้างข้อมูลไปยังตารางเก็บถาวรชื่อ OrderArchive คุณประกาศตัวแปรตารางชื่อ @DeletedOrders และป้อนลูปที่คุณลบข้อมูลประวัติเป็นกลุ่มๆ (เช่น คำสั่งซื้อที่เก่ากว่าปี 2003) รหัสที่เพิ่มที่นี่คือส่วนคำสั่ง OUTPUT ซึ่งคัดลอกแอตทริบิวต์ทั้งหมดของแถวที่ถูกลบทั้งหมดไปยังตัวแปรตาราง @DeletedOrders จากนั้นใช้คำสั่ง INSERT INTO เพื่อคัดลอกแถวทั้งหมดในตัวแปรตารางไปยังตาราง OrderArchive:
DECLARE @DeletedOrders TABLE
-
สั่งซื้อ INT,
วันที่สั่งซื้อ DATETIME,
ชัดเจน,
ผู้ดูแล VARCHAR(5)
จำนวนINT
-
ในขณะที่ 1=1
เริ่ม
เริ่มต้นทราน
ลบด้านบน (5,000) จากคำสั่งซื้อ
ลบเอาต์พุตแล้ว* เข้าสู่ @DeletedOrders
วันที่สั่งซื้อที่ไหน < '20030101'
แทรกลงในเอกสารคำสั่งซื้อ
SELECT * จาก @DeletedOrders
มุ่งมั่นทราน
ลบจาก @DeletedOrders
ถ้า @@จำนวนแถว < 5,000
หยุดพัก
END
อีกตัวอย่างหนึ่งมีดังนี้ หากมีตารางดังนี้: สร้างตาราง Employee(EmpID int Identity(1, 1) ข้อจำกัด Employee_pk คีย์หลัก, FirstName varchar(100), LastName Varchar(100), Sex char(1) คำทักทายเป็นกรณี เมื่อ Sex ='M' แล้วก็ 'Mr.' เมื่อ Sex ='F' แล้ว 'Ms.' อย่างอื่น '' จบ, เงินเงินเดือน, การหักเงินเป็นกรณี เมื่อเงินเดือน <3,000 แล้ว .20 * เงินเดือนเมื่อเงินเดือนระหว่าง 30,000 ถึง 50,000 จากนั้น .26* เงินเดือน เมื่อเงินเดือนระหว่าง 50,001 ถึง 75,000 จากนั้น .30*เงินเดือน .35*สิ้นสุดเงินเดือน, DOJ datetime constraint DOJ_DEF default getdate())
} ตารางที่เรียบง่ายมาก ซึ่งในกรณีนี้ clauses ถูกใช้เพื่อตั้งค่าคำทักทาย การหักเงิน doj ฯลฯ ตามลำดับ และเราสามารถสร้างขั้นตอนการจัดเก็บอื่นได้ดังนี้: สร้างขั้นตอน Employee_insert@Fname varchar(100),@Lname varchar(100),@sex char(1),@Salary Moneyasdeclare @empoutput table (EmpID int, FirstName varchar(100) , นามสกุล Varchar(100),อักขระเพศ(1), ตัวอักษรคำทักทาย(3),เงินเงินเดือน,เงินหัก,DOJ datetime )ใส่เข้าไปในพนักงาน(ชื่อ,นามสกุล,เงินเดือน,เพศ)ใส่ OUTPUT แล้ว* ลงใน @empoutputvalues(@Fname ,@Lname ,@Salary,@sex )เลือก * จาก @empoutput
จากนั้นเมื่อทำการเรียก Stored Procedure คุณสามารถใช้ USE [MyDatabase] เช่นนี้
GOexec Employee_insert 'Miho', 'Yoshikawa', 'F', 146000
ด้วยวิธีนี้ ข้อมูลจะถูกแทรกลงในตารางพนักงานในระหว่างการดำเนินการ และตัวแปรชั่วคราวจะถูกกำหนด โปรดทราบว่าข้อมูลนี้สามารถอยู่ในรูปแบบของตารางได้ เมื่อกำหนดในรูปแบบนี้ จะเห็นได้ง่ายที่นี่ และข้อมูลที่แทรกลงในตารางพนักงานจะถูกส่งออกไปยังตัวแปร empoutput ในเวลาเดียวกัน หลังจากที่เราดำเนินการตามขั้นตอนที่เก็บไว้นี้ เราจะพบผลลัพธ์ดังต่อไปนี้
EmpID,ชื่อ,นามสกุล,เพศ,คำทักทาย,เงินเดือน,การหักเงิน,DOJ
7,มิโฮะ,โยชิกาว่า,F,นางสาว,146000.00,51100.00,2006-04-09 23:16:44.920
และบันทึกจะถูกแทรกลงในตารางพนักงานจริงๆ
คุณสามารถดู
แหล่งที่มา: jackyrong BLOG