ใน SQL Server คุณควรใช้ GO เมื่อใดและคุณควรใช้เซมิโคลอนเมื่อใด?


100

ฉันสับสนมาตลอดว่าเวลาไหนควรใช้คีย์เวิร์ด GO หลังคำสั่งและต้องใช้เซมิโคลอนต่อท้ายคำสั่งหรือไม่ ความแตกต่างคืออะไรและทำไม / เมื่อใดจึงควรใช้?

เมื่อฉันเรียกใช้ Generate-script ใน SQL Server Management Studio ดูเหมือนว่าจะใช้ GO ทั่วทุกที่ แต่ไม่ใช่เซมิโคลอน


คำตอบ:


93

GOเกี่ยวข้องกับ SSMS เท่านั้น - ไม่ใช่ Transact SQL จริง แต่เพียงแค่บอกให้ SSMS ส่งคำสั่ง SQL ระหว่างแต่ละชุดGOในแต่ละชุดตามลำดับ

;เป็นตัวคั่นคำสั่ง SQL แต่ส่วนใหญ่เครื่องยนต์สามารถตีความที่งบของคุณจะแตก

ข้อยกเว้นหลักและสถานที่ที่;มีการใช้บ่อยที่สุดอยู่ก่อนหน้าคำสั่ง Common Table Expression


5
เน้นการGOไม่ได้เป็น T-SQL ส่วนในขณะที่;เป็น
msarchet

2
MERGEคำสั่งจะต้องถูกยกเลิกโดยเซมิโคลอน
onedaywhen

15
อัปเดต: ใน SQL Server 2012 ที่ไม่ใช้อัฒภาคจะเลิกใช้แล้วซึ่งหมายความว่าจะต้องใช้ในเวอร์ชันถัดไป ดังนั้นจึงเป็นแนวทางปฏิบัติที่ดีในการใช้อัฒภาคเนื่องจากจะต้องใช้งานน้อยลงในกรณีของการย้ายข้อมูล (และเนื่องจากเป็นมาตรฐาน) ที่มา: technet.microsoft.com/en-us/library/ms143729.aspxหรือหนังสือบน SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014 ยังคงแสดงรายการอัฒภาคตามที่จำเป็นสำหรับเวอร์ชันถัดไป ฉันสงสัยว่ามันจะเลิกใช้เมื่อไหร่ technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buli ไม่ได้ระบุว่า;เลิกใช้งานไม่ได้ใช้งานคือเลิกใช้งานกล่าวคือจะกลายเป็นข้อบังคับตามแหล่งที่มา
cjk

78

สาเหตุที่คุณเห็น GO จำนวนมากในสคริปต์ DDL ที่สร้างขึ้นนั้นเป็นเพราะกฎต่อไปนี้เกี่ยวกับแบทช์

สร้างคำสั่งเริ่มต้นสร้างฟังก์ชันสร้างกระบวนการสร้างกฎสร้างทริกเกอร์และสร้างคำสั่งมุมมองไม่สามารถใช้ร่วมกับคำสั่งอื่นในชุดงานได้ คำสั่ง CREATE ต้องเริ่มต้นชุดงาน ข้อความอื่น ๆ ทั้งหมดที่ตามมาในชุดนั้นจะถูกตีความเป็นส่วนหนึ่งของคำจำกัดความของคำสั่ง CREATE แรก

หนึ่งในกรณีการใช้งานสำหรับ Generated DDL คือการสร้างหลายอ็อบเจ็กต์ในไฟล์เดียว ด้วยเหตุนี้เครื่องกำเนิด DDL จึงต้องสามารถสร้างแบทช์ได้ ดังที่คนอื่น ๆ กล่าวว่าคำสั่ง GO สิ้นสุดชุดงาน


10
นี่คือคนเดียวที่ตอบคำถาม "... เมื่อไหร่ที่คุณควรใช้ GO ... ?" ส่วนหนึ่งของคำถาม
Roimer

สำหรับฉันแล้วดูเหมือนว่า GO จะยกเลิกคำสั่งที่สร้างวัตถุที่มี SQL ซึ่งอาจมี; ตัวยุติคำสั่ง ใน DBMS อื่นฉันได้เห็นความสามารถในการตั้งค่าสตริงการสิ้นสุด ตัวอย่างเช่นคุณอาจระบุว่าคำสั่งนั้นลงท้ายด้วยอักขระไปป์สองตัว || จากนั้นคุณสามารถออก CREATE PROCEDURE ... SQL จำนวนมากที่ลงท้ายด้วย; ... || และท่อคู่จะสิ้นสุดคำสั่ง CREATE PROCEDURE ดังนั้นคำถามของฉันคือว่านี่เป็นข้อสรุปของคำสั่ง MS GO หรือไม่? ประการที่สองคุณสามารถกำหนดสตริงการยุติใน SQLSERVER ใหม่ได้หรือไม่
youcantryreachingme

@youcantryreachingme ฉันไม่รู้ว่ามันเป็นเรื่องจริงในปี 2010 หรือไม่ แต่ดูเหมือนว่าคุณจะทำได้ ดูSSMS: ชุดแยก ฉันไม่แน่ใจว่าข้อ จำกัด ของสิ่งนี้คืออะไร
Conrad Frix

34

ไป

Go คือตัวคั่นแบทช์ ซึ่งหมายความว่าทุกอย่างในแบทช์นั้นเป็นแบบโลคัลสำหรับแบทช์นั้น ๆ

การประกาศตัวแปรตัวแปรตารางและอื่น ๆ จะไม่ข้ามGOคำสั่ง

ตาราง #Temp เป็นตารางภายในสำหรับการเชื่อมต่อดังนั้นจึงขยายข้ามคำสั่ง GO

อัฒภาค

อัฒภาคเป็นตัวยุติคำสั่ง สิ่งนี้ใช้เพื่อระบุว่าคำสั่งใด ๆ สิ้นสุด

ในกรณีส่วนใหญ่ไวยากรณ์คำสั่งเองก็เพียงพอที่จะกำหนดจุดสิ้นสุดของคำสั่ง

อย่างไรก็ตาม CTE ต้องการให้ C เป็นคำสั่งแรกดังนั้นคุณต้องมีอัฒภาคก่อน C


4
MERGEคำสั่งจะต้องถูกยกเลิกโดยเซมิโคลอน
onedaywhen

11

คุณควรใช้เซมิโคลอนเพื่อยุติคำสั่ง SQL ทุกคำสั่ง สิ่งนี้ถูกกำหนดไว้ในมาตรฐาน SQL

แน่นอนว่าบ่อยกว่า SQL Server ไม่อนุญาตให้คุณละเว้นคำสั่ง terminator แต่ทำไมถึงมีนิสัยไม่ดี?

ตามที่คนอื่น ๆ ได้กล่าวไว้คำสั่งที่นำหน้านิพจน์ตารางทั่วไป (CTE) ต้องถูกปิดท้ายด้วยเครื่องหมายอัฒภาค ด้วยเหตุนี้จากคนพื้นบ้านที่ไม่ได้รับการยอมรับอย่างเต็มที่จากตัวบ่งชี้กึ่งลำไส้ใหญ่เราจะเห็นสิ่งนี้:

;WITH ...

ซึ่งฉันคิดว่ามันดูแปลกจริงๆ ฉันคิดว่ามันสมเหตุสมผลในฟอรัมออนไลน์เมื่อคุณไม่สามารถบอกคุณภาพของโค้ดที่จะวางลงไปได้

นอกจากนี้MERGEคำสั่งต้องถูกยกเลิกโดยอัฒภาค คุณเห็นรูปแบบที่นี่ไหม นี่เป็นส่วนเพิ่มเติมที่ใหม่กว่าใน TSQL ซึ่งปฏิบัติตามมาตรฐาน SQL อย่างใกล้ชิด ดูเหมือนว่าทีม SQL Server กำลังดำเนินการตามคำสั่งให้ใช้ตัวบอกเลิกกึ่งโคลอน


2
" ซึ่งฉันคิดว่ามันดูแปลกจริงๆ " - ฉันไม่เห็นด้วยมากกว่านี้ และการทำซ้ำอย่างต่อเนื่องทำให้เกิดคำถามแปลก ๆ เช่นนี้หรือนี่
a_horse_with_no_name

SQL Server ไม่อนุญาตให้คุณทำเลอะเทอะ - ช่วยให้คุณไม่ต้องใช้ตัวยุติคำสั่งซ้ำซ้อน T-SQL เช่นเดียวกับ SQL อื่น ๆ ส่วนใหญ่ไม่ใช่ SQL มาตรฐานบริสุทธิ์ซึ่งเหมือนกับคลาสฐานนามธรรม - ไม่ได้ใช้ในทางปฏิบัติเพื่อสนับสนุนภาษาถิ่นของ DB engine
ProfK

@ProfK: ขอบคุณสำหรับการใส่เครื่องหมายวรรคตอนในความคิดเห็นของคุณทำให้ฉันอ่านและทำความเข้าใจได้ง่ายโดยเฉพาะตัวอักษรตัวยุติประโยค แม้ว่าการใช้ยัติภังค์ของคุณจะไม่เป็นไปตามภาษาอังกฤษมาตรฐาน ...
58

8

GO เป็นตัวยุติแบบแบตช์เซมิโคลอนเป็นตัวยุติคำสั่ง

คุณจะใช้ GO เมื่อคุณต้องการมีคำสั่ง create proc หลายรายการใน 1 สคริปต์เนื่องจาก create proc ต้องเป็นคำสั่งแรกในชุดงาน ถ้าคุณใช้นิพจน์ตารางทั่วไปคำสั่งก่อนที่จะถูกยกเลิกด้วยเซมิโคลอน


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