แทรกข้อมูล

เสร็จสมบูรณ์เมื่อ

Transact-SQL มีหลายวิธีในการแทรกแถวลงในตาราง

คําสั่ง INSERT

คําสั่ง INSERT ใช้เพื่อเพิ่มแถวอย่างน้อยหนึ่งแถวลงในตาราง มีหลายแบบฟอร์มของใบแจ้งยอด

ไวยากรณ์พื้นฐานของคําสั่ง INSERT แบบง่ายจะแสดงอยู่ด้านล่าง:

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

ด้วยรูปแบบของคําสั่ง INSERT นี้ ซึ่งเรียกว่า INSERT VALUES คุณสามารถระบุคอลัมน์ที่จะมีค่าที่จะวางค่าไว้ในนั้นและลําดับที่จะแสดงข้อมูลสําหรับแต่ละแถวที่แทรกลงในตารางได้ column_list เป็นทางเลือก แต่แนะนํา หากไม่มี column_list คําสั่ง INSERT จะคาดหวังค่าสําหรับทุกคอลัมน์ในตารางตามลําดับที่กําหนดคอลัมน์ คุณยังสามารถใส่ค่าสําหรับคอลัมน์เหล่านั้นเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคได้

เมื่อแสดงรายการค่าคําสําคัญ ค่าเริ่มต้นของคําสําคัญหมายถึงค่าที่กําหนดไว้ล่วงหน้า ซึ่งระบุเมื่อสร้างตาราง จะถูกใช้ คุณสามารถกําหนดค่าเริ่มต้นได้สามวิธี:

  • ถ้ามีการกําหนดคอลัมน์เพื่อให้มีค่าที่สร้างขึ้นโดยอัตโนมัติ ค่านั้นจะถูกใช้ ค่าที่สร้างขึ้นโดยอัตโนมัติจะถูกกล่าวถึงในภายหลังในโมดูลนี้
  • เมื่อสร้างตาราง ค่าเริ่มต้นสามารถถูกกําหนดให้กับคอลัมน์ และจะใช้ค่านั้นหากมีการระบุค่าเริ่มต้น
  • ถ้ามีการกําหนดคอลัมน์เพื่ออนุญาตให้มีค่า NULL และคอลัมน์ไม่ใช่คอลัมน์ที่สร้างขึ้นโดยอัตโนมัติและไม่มีค่าเริ่มต้นที่กําหนดไว้ ค่า NULL จะถูกแทรกเป็นค่าเริ่มต้น

รายละเอียดของการสร้างตารางอยู่นอกเหนือขอบเขตของโมดูลนี้ อย่างไรก็ตาม จะเป็นประโยชน์มากที่จะดูว่าคอลัมน์ใดอยู่ในตาราง วิธีที่ง่ายที่สุดคือเพียงแค่ดําเนินการคําสั่ง SELECT บนตารางโดยไม่ต้องส่งกลับแถวใด ๆ โดยใช้เงื่อนไข WHERE ที่ไม่สามารถเป็น TRUE จะไม่สามารถส่งกลับแถวได้

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

คําสั่งนี้จะแสดงคอลัมน์และชื่อของคอลัมน์ทั้งหมดให้คุณเห็น แต่จะไม่แสดงชนิดข้อมูลหรือคุณสมบัติใด ๆ เช่น อนุญาตค่า NULL หรือถ้ามีการระบุค่าเริ่มต้น ตัวอย่างของผลลัพธ์จากคิวรีอาจมีลักษณะดังนี้:

ชื่อการส่งเสริมการขาย

StartDate

ProductModelID

ส่วนลด

หมาย เหตุ

เมื่อต้องการแทรกข้อมูลลงในตารางนี้ คุณสามารถใช้คําสั่ง INSERT ดังที่แสดงไว้ที่นี่

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

สําหรับตัวอย่างข้างต้น รายการคอลัมน์สามารถเว้นไว้ได้ เนื่องจากเรากําลังใส่ค่าสําหรับทุกคอลัมน์ในลําดับที่ถูกต้อง:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

สมมติว่าตารางถูกกําหนดเพื่อให้ค่าเริ่มต้นของวันที่ปัจจุบันถูกนําไปใช้กับคอลัมน์ StartDate และคอลัมน์ บันทึกย่อ จะอนุญาตให้มีค่า NULL คุณสามารถระบุว่าคุณต้องการใช้ค่าเหล่านี้อย่างชัดเจนดังนี้:

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

อีกวิธีหนึ่งคือ คุณสามารถละเว้นค่าในคําสั่ง INSERT ซึ่งในกรณีนี้จะมีการใช้ค่าเริ่มต้นหากกําหนดไว้ และหากไม่มีค่าเริ่มต้นแต่คอลัมน์อนุญาตค่า NULL จะมีการแทรก NULL ถ้าคุณไม่ได้ใส่ค่าสําหรับคอลัมน์ทั้งหมด คุณต้องมีรายการคอลัมน์ที่ระบุว่าคุณกําลังใส่ค่าคอลัมน์ใด

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

นอกเหนือจากการแทรกแถวเดียวในแต่ละครั้ง สามารถใช้คําสั่ง INSERT VALUES เพื่อแทรกหลายแถวโดยการใส่ค่าที่คั่นด้วยเครื่องหมายจุลภาคหลายชุด ชุดของค่าจะถูกคั่นด้วยเครื่องหมายจุลภาคดังนี้:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

รายการของค่านี้เรียกว่า คอนสตรักเตอร์ของค่าตาราง นี่คือตัวอย่างของการแทรกแถวเพิ่มเติมสองแถวลงในตารางของเราด้วยคอนสตรักเตอร์ของค่าตาราง:

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

สอด เลือก

นอกเหนือจากการระบุชุดสัญพจน์ของค่าในคําสั่ง INSERT แล้ว T-SQL ยังสนับสนุนโดยใช้ผลลัพธ์ของการดําเนินการอื่นเพื่อให้ค่าสําหรับ INSERT คุณสามารถใช้ผลลัพธ์ของคําสั่ง SELECT หรือผลลัพธ์ของกระบวนงานที่เก็บไว้เพื่อให้ค่าสําหรับคําสั่ง INSERT ได้

หากต้องการใช้ INSERT กับ SELECT ที่ซ้อนกัน ให้สร้างคําสั่ง SELECT เพื่อแทนที่ส่วนคําสั่ง VALUES ด้วยฟอร์มนี้ ที่เรียกว่าแทรก SELECT คุณสามารถแทรกชุดของแถวที่ส่งกลับโดยคิวรี SELECT ลงในตารางปลายทางได้ การใช้ INSERT SELECT จะแสดงข้อควรพิจารณาเดียวกับ INSERT VALUES:

  • คุณอาจระบุรายการคอลัมน์ตามชื่อตาราง
  • คุณต้องระบุค่าคอลัมน์หรือค่าเริ่มต้น หรือ NULL สําหรับแต่ละคอลัมน์

ไวยากรณ์ต่อไปนี้แสดงการใช้ INSERT SELECT:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

หมายเหตุ

ชุดผลลัพธ์จากกระบวนงานที่จัดเก็บไว้ (หรือแม้แต่ชุดงานแบบไดนามิก) อาจถูกใช้เป็นข้อมูลป้อนเข้าไปยังคําสั่ง INSERT ด้วยเช่นกัน รูปแบบนี้ของ INSERT ซึ่งเรียกว่า INSERT EXEC จะคล้ายกับ INSERT SELECT และจะนําเสนอข้อควรพิจารณาเดียวกัน อย่างไรก็ตาม กระบวนงานที่เก็บไว้สามารถส่งกลับชุดผลลัพธ์ได้หลายชุด ดังนั้นจึงจําเป็นต้องมีการดูแลเป็นพิเศษ

ตัวอย่างต่อไปนี้แทรกหลายแถวสําหรับการเลื่อนระดับใหม่ชื่อ Get Framed โดยการเรียกข้อมูล ID แบบจําลองและชื่อแบบจําลองจาก Production.ProductModel ตารางสําหรับทุกแบบจําลองที่มี "เฟรม" ในชื่อ

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

SELECT ที่ซ้อนกันกับ INSERT ไม่ได้อยู่ในวงเล็บ ซึ่งแตกต่างจากคิวรีย่อย

เลือก กลายเป็น

อีกตัวเลือกหนึ่งสําหรับการแทรกแถว ซึ่งคล้ายกับ INSERT SELECT คือคําสั่ง SELECT INTO ความแตกต่างที่สําคัญที่สุดระหว่างแทรก SELECT และ SELECT INTO คือ SELECT INTO ไม่สามารถใช้เพื่อแทรกแถวลงในตารางที่มีอยู่ได้ เนื่องจากจะสร้างตารางใหม่ที่ยึดตามผลลัพธ์ของ SELECT เสมอ แต่ละคอลัมน์ในตารางใหม่จะมีชื่อ ชนิดข้อมูล และ nullability เหมือนกันกับคอลัมน์ที่เกี่ยวข้อง (หรือนิพจน์) ในรายการ SELECT

หากต้องการใช้ SELECT INTO ให้เพิ่ม ลงใน <new_table_name> ในส่วนคําสั่ง SELECT ของคิวรี ก่อนส่วนคําสั่ง FROM นี่คือตัวอย่างที่ดึงข้อมูลจากตาราง Sales.SalesOrderHeader ลงในตารางใหม่ที่ชื่อว่า Sales.Invoice

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

SELECT INTO จะล้มเหลวถ้ามีตารางที่มีชื่อที่ระบุหลังจาก INTO อยู่แล้ว หลังจากสร้างตารางแล้ว สามารถดําเนินการได้เช่นเดียวกับตารางอื่น ๆ คุณสามารถเลือกจากมัน รวมเข้ากับตารางอื่น หรือแทรกแถวเพิ่มเติมลงในตารางนั้นได้