เมื่อใดที่ฉันควรใช้เครื่องหมายอัฒภาคใน SQL Server


221

ในขณะที่ตรวจสอบรหัสบางส่วนบนเว็บและสคริปต์ที่สร้างขึ้นโดย SQL Server Management Studio ฉันสังเกตว่าคำสั่งบางคำจะจบลงด้วยเครื่องหมายอัฒภาค

ดังนั้นเมื่อไรฉันจึงควรใช้


23
SQL Server 2008 R2 msdn.microsoft.com/en-us/library/ms177563.aspx "อนุสัญญาไวยากรณ์ของ Transact SQL (Transact-SQL)" ; == ตัวยุติคำสั่ง Transact-SQL แม้ว่าอัฒภาคไม่จำเป็นต้องใช้งบมากที่สุดในรุ่นนี้ของ SQL Server, มันจะถูกต้องในรุ่นอนาคต
gerryLowry

2
แม้ว่าพวกเขาอ้างว่าจะต้องใช้เครื่องหมายอัฒภาคในเวอร์ชันในอนาคต แต่สิ่งนี้จะไม่เกิดขึ้นจริง พวกเขาไม่สามารถมอบมันด้วยเหตุผลด้านความเข้ากันได้ มันจะทำลายแอปพลิเคชันประมาณ 100%
usr

1
ตอนนี้เป็นปี 2019 และยังไม่มีเซมิโคลอนที่ยอมรับใน SQL Server เวอร์ชันล่าสุดอย่างมีความสุข ดังที่ @usr กล่าวยกเว้นว่า Microsoft ต้องการหยุดพักอย่างสมบูรณ์ 100% ไม่มีวิธีที่พวกเขาสามารถบังคับใช้สิ่งนี้
Ian Kemp

คำตอบ:


152

จากบทความ SQLServerCentral.Com โดย Ken Powers:

อัฒภาค

อักขระเครื่องหมายอัฒภาคเป็นตัวสิ้นสุดของคำสั่ง มันเป็นส่วนหนึ่งของมาตรฐาน ANSI SQL-92 แต่ไม่เคยใช้ภายใน Transact-SQL แน่นอนว่ามันเป็นไปได้ที่จะใช้รหัส T-SQL เป็นเวลาหลายปีโดยไม่ต้องใช้เครื่องหมายอัฒภาค

การใช้

มีสองสถานการณ์ที่คุณต้องใช้เครื่องหมายอัฒภาค สถานการณ์แรกคือตำแหน่งที่คุณใช้ Common Table Expression (CTE) และ CTE ไม่ใช่คำสั่งแรกในแบตช์ ข้อที่สองคือที่ที่คุณใช้คำสั่ง Service Broker และคำสั่ง Service Broker ไม่ใช่คำสั่งแรกในแบตช์


9
เป็นTHROWคำสั่งที่บริการนายหน้า? เราต้องรวมเซมิโคลอนไว้ก่อนที่จะแสดงในตัวอย่างนี้:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
Chris Walsh

1
ดูเหมือนว่าพวกเขาสนับสนุนให้ใช้เครื่องหมายอัฒภาคโดยทั่วไปโดยกำหนดให้ใช้ก่อนทุกประเภทข้อความใหม่ที่ได้รับการแนะนำในปีที่ผ่านมา ( MERGEตัวอย่างเช่น) ดังที่กล่าวไว้ในคำตอบอื่น ๆ ในมาตรฐาน ANSI พวกเขาจำเป็นต้องใช้
Mark Sowul

2
@maurocam ฉันคิดว่าคุณอ่านเอกสารไม่ถูกต้อง ถ้าคุณดูที่ลิงค์นั้นมันบอกว่า " ยังไม่สิ้นสุดคำสั่ง Transact-SQL ด้วยเครื่องหมายอัฒภาค" เลิกใช้แล้ว
Caltor

อย่างที่ฉันเห็นมันไม่ได้ตอบคำถามจริงๆว่าเมื่อใดควรใช้เซมิโคลอน(ตรงข้ามกับต้อง )
สจ๊วต

81

โดยค่าเริ่มต้นคำสั่ง SQL จะถูกยกเลิกด้วยเครื่องหมายอัฒภาค คุณใช้เครื่องหมายอัฒภาคเพื่อยกเลิกคำสั่งเว้นแต่ว่าคุณจะตั้งค่าตัวยกเลิกคำสั่งใหม่ (ไม่ค่อย)

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

ในทางปฏิบัติให้รวมเทอร์มิเนเตอร์เสมอแม้ว่าคุณจะส่งคำสั่งหนึ่งไปยังฐานข้อมูล

แก้ไข: ในการตอบสนองต่อคำพูดที่บอกเลิกไม่จำเป็นต้อง [โดยเฉพาะ RDBMS] ในขณะที่อาจเป็นจริงพวกเขาจะต้องใช้มาตรฐาน ANSI SQL ในการเขียนโปรแกรมทั้งหมดหากเราสามารถปฏิบัติตามมาตรฐานโดยไม่สูญเสียฟังก์ชันการทำงานเราควรเพราะรหัสของเราหรือนิสัยของเรานั้นไม่ได้ผูกติดอยู่กับผู้ให้บริการรายเดียว

ด้วยคอมไพเลอร์ C บางตัวเป็นไปได้ที่จะมีโมฆะการส่งคืนหลักแม้ว่ามาตรฐานจะต้องการ main เพื่อคืนค่า int แต่การทำเช่นนั้นทำให้โค้ดของเราและตัวเราเองพกพาได้น้อยลง

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


26

ใน SQL2008 BOL พวกเขากล่าวว่าในเซมิโคลอนรุ่นถัดไปจะต้องใช้ ดังนั้นควรใช้มันเสมอ

อ้างอิง:


25

คุณต้องใช้มัน

การฝึกใช้เซมิโคลอนเพื่อบอกเลิกคำสั่งเป็นมาตรฐานและอันที่จริงเป็นข้อกำหนดในแพลตฟอร์มฐานข้อมูลอื่น ๆ SQL Server จำเป็นต้องใช้เครื่องหมายอัฒภาคในบางกรณีเท่านั้น แต่ในกรณีที่ไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคการใช้อันหนึ่งจะไม่ทำให้เกิดปัญหา ฉันขอแนะนำอย่างยิ่งให้คุณรับเอาแนวปฏิบัติในการยกเลิกข้อความทั้งหมดด้วยเครื่องหมายอัฒภาค ไม่เพียง แต่การทำเช่นนี้จะช่วยปรับปรุงความสามารถในการอ่านโค้ดของคุณ แต่ในบางกรณีอาจช่วยให้คุณเศร้าโศกได้ (เมื่อต้องการใช้เครื่องหมายอัฒภาคและไม่ได้ระบุข้อความแสดงข้อผิดพลาดที่ SQL Server สร้างขึ้นจะไม่ชัดเจนเสมอไป)

และที่สำคัญที่สุด:

เอกสารคู่มือ SQL Server บ่งชี้ว่าการยกเลิกคำสั่ง T-SQL ด้วยเครื่องหมายอัฒภาคนั้นเป็นคุณสมบัติที่เลิกใช้แล้ว ซึ่งหมายความว่าเป้าหมายระยะยาวคือการบังคับใช้เครื่องหมายอัฒภาคในผลิตภัณฑ์รุ่นอนาคต นั่นเป็นอีกเหตุผลหนึ่งที่ทำให้การเลิกใช้งบทั้งหมดของคุณเป็นไปได้แม้จะไม่จำเป็นก็ตาม

ที่มา: พื้นฐาน T-SQL ของ Microsoft SQL Server 2012 โดย Itzik Ben-Gan


ตัวอย่างของเหตุผลที่คุณต้องใช้เสมอ;คือแบบสอบถามสองแบบต่อไปนี้ (คัดลอกมาจากโพสต์นี้):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

ป้อนคำอธิบายรูปภาพที่นี่

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

ป้อนคำอธิบายรูปภาพที่นี่


7
นี้น่าจะเป็นอาร์กิวเมนต์ที่แข็งแกร่งที่คุณควรใช้เครื่องหมายอัฒภาค (สำรองโดยราคา) แต่เพียงกรณีเดียวที่มีความต้อง
Gregor Thomas

3
@Gregor หากมีการประกาศว่าการใช้เครื่องหมายอัฒภาคเป็นสิ่งจำเป็นและnot using themเป็นเทคนิคที่เลิกใช้แล้วคุณควรใช้มัน หากไม่มีความเสี่ยงที่จะประสบในอนาคต หากคุณไม่ได้วางแผนที่จะอัพเกรด / สลับงานและมักจะทำงานกับ SQL Server 2000 คุณจะปลอดภัย :-)
gotqn

5
ถูกต้องฉันเห็นด้วย แต่เขาบรรทัดแรกของคำตอบของคุณจะต้องเน้นย้ำซึ่งไม่เป็นเช่นนั้น
Gregor Thomas

2
ตัวอย่างที่มีเครื่องหมายอัฒภาคส่งผลให้ในIncorrect syntax near 'THROW'.SQL Server 2008 (10.0.6241.0) ซึ่งเป็นรุ่นที่ฉันต้องจัดการกับที่ทำงาน มันทำงานตามที่แสดงในปี 2012 ฉันมั่นใจที่จะเริ่มใช้เครื่องหมายอัฒภาคเนื่องจากการคัดค้าน ฉันไม่คาดหวังว่ามันจะเป็นปัญหาในปี 2008 โดยส่วนใหญ่
Pilot_51

1
คำตอบของคุณดีที่สุด! มันสมควรได้รับการโหวตมากขึ้น
สจ๊วต

22

ถ้าฉันอ่านอย่างถูกต้องมันจะเป็นข้อกำหนดให้ใช้เครื่องหมายอัฒภาคเพื่อสิ้นสุดคำสั่ง TSQL http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

แก้ไข: ฉันพบปลั๊กอินสำหรับ SSMS 2008R2 ที่จะจัดรูปแบบสคริปต์ของคุณและเพิ่มเครื่องหมายอัฒภาค ฉันคิดว่ามันยังอยู่ในช่วงเบต้า แต่ ...

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

แก้ไข: ฉันพบเครื่องมือที่ดียิ่งขึ้น / ปลั๊กอินที่เรียกว่า ApexSQL ... http://www.apexsql.com/


11

ความคิดเห็นส่วนตัว:ใช้งานเฉพาะเมื่อจำเป็นเท่านั้น (ดูคำตอบของ TheTXI ด้านบนสำหรับรายการที่ต้องการ)

เนื่องจากคอมไพเลอร์ไม่ต้องการพวกเขาคุณสามารถวางมันไว้ได้ แต่ทำไม? คอมไพเลอร์จะไม่บอกตำแหน่งที่คุณลืมไปดังนั้นคุณจะต้องใช้งานอย่างไม่สอดคล้องกัน

[ความคิดเห็นนี้เฉพาะกับ SQL Server ฐานข้อมูลอื่นอาจมีข้อกำหนดที่เข้มงวดกว่านี้ หากคุณกำลังเขียน SQL ให้ทำงานบนฐานข้อมูลหลาย ๆ ข้อกำหนดของคุณอาจแตกต่างกันไป]

tpdi ระบุไว้ข้างต้น "ในสคริปต์เนื่องจากคุณส่งข้อความมากกว่าหนึ่งรายการคุณจำเป็นต้องใช้มัน" ที่จริงไม่ถูกต้อง คุณไม่ต้องการพวกเขา

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

เอาท์พุท:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional

1
คุณคิดอย่างไรเกี่ยวกับการสนทนานี้ sqlservercentral.com/Forums/Topic636549-8-1.aspx (Yoy สามารถใช้ bugmenot@bugmenot.com: bugmenot หากคุณไม่มีบัญชี)
Anwar Pinto

2
ฉันขอขอบคุณที่คุณระบุไว้อย่างชัดเจนว่านี่เป็นเพียงความคิดเห็นของคุณ แต่ฉันไม่คิดว่าจะเป็นคำตอบที่ดีเพราะขัดแย้งกับทั้งเอกสารของ Microsoft และมาตรฐาน ANSI ฉันคิดว่าความคิดเห็นนี้จะดีกว่าในความคิดเห็น (ไม่พยายามทุบตีคุณมีสิทธิ์อย่างเต็มที่ที่จะแสดงความคิดเห็นในการใช้งานเซมิโคลอน!)
izzy

4

ฉันยังมีอีกมากที่ต้องเรียนรู้เกี่ยวกับ T-SQL แต่ในการทำงานโค้ดบางอย่างสำหรับธุรกรรม (และการอ้างอิงรหัสจากตัวอย่างจาก stackoverflow และไซต์อื่น ๆ ) ฉันพบกรณีที่ดูเหมือนว่าต้องใช้เครื่องหมายอัฒภาคและหากมันหายไป ดูเหมือนว่าคำสั่งจะไม่ดำเนินการเลยและไม่มีข้อผิดพลาดเกิดขึ้น สิ่งนี้ดูเหมือนจะไม่ครอบคลุมในคำตอบข้างต้นใด ๆ (สิ่งนี้ใช้ MS SQL Server 2012)

เมื่อฉันทำรายการทำงานตามที่ฉันต้องการฉันตัดสินใจที่จะลองทำมันดังนั้นหากมีข้อผิดพลาดใด ๆ ที่จะได้รับการย้อนกลับ หลังจากทำเช่นนี้แล้วการทำธุรกรรมดังกล่าวก็ไม่ได้กระทำ (SSMS ยืนยันสิ่งนี้เมื่อพยายามปิดหน้าต่างด้วยข้อความที่ดีเพื่อเตือนให้คุณทราบว่ามีการทำธุรกรรมที่ไม่ได้รับการยอมรับ

ดังนั้นนี่

COMMIT TRANSACTION 

นอกบล็อกเริ่มต้น BEGIN TRY / END TRY ทำงานได้ดีในการส่งมอบธุรกรรม แต่ภายในบล็อกนั้นจะต้องเป็น

COMMIT TRANSACTION;

หมายเหตุไม่มีข้อผิดพลาดหรือคำเตือนให้และไม่มีการบ่งชี้ว่าการทำธุรกรรมยังคงปราศจากข้อผูกมัดจนกว่าจะพยายามที่จะปิดแท็บแบบสอบถาม

โชคดีที่สิ่งนี้ทำให้เกิดปัญหาใหญ่ที่เห็นได้ชัดในทันทีว่ามีปัญหา น่าเสียดายเนื่องจากไม่มีรายงานข้อผิดพลาด (ไวยากรณ์หรืออย่างอื่น) จึงไม่ชัดเจนว่าปัญหานั้นเกิดขึ้นในทันที

ตรงกันข้ามการทำธุรกรรม ROLLBACK ดูเหมือนจะทำงานได้ดีพอ ๆ กันในบล็อก BEGIN CATCH ที่มีหรือไม่มีเครื่องหมายอัฒภาค

อาจมีเหตุผลบางอย่างในเรื่องนี้ แต่มันให้ความรู้สึกตามอำเภอใจและ Alice-in-Wonderland-ish


สาเหตุหนึ่งที่เป็นไปได้คือสิ่งนี้COMMIT TRANSACTIONยอมรับการทำธุรกรรมหรือชื่อจุดบันทึก (ซึ่งจะละเว้น) หากไม่มีเครื่องหมายอัฒภาคCOMMIT TRANSACTIONสามารถกินสัญลักษณ์ต่อไปหากแยกวิเคราะห์เป็นตัวบ่งชี้ซึ่งสามารถเปลี่ยนความหมายของรหัสได้อย่างรุนแรง หากสิ่งนี้ส่งผลให้เกิดข้อผิดพลาดCATCHอาจเรียกใช้โดยไม่COMMITต้องถูกดำเนินการ ในทางกลับกันในขณะที่ROLLBACK TRANSACTIONยังยอมรับตัวระบุที่เป็นตัวเลือกเช่นนี้ข้อผิดพลาดในการแยกวิเคราะห์มีแนวโน้มมากที่สุดที่จะทำให้ธุรกรรมถูกย้อนกลับ
Jeroen Mostert

3

ปรากฏว่าอัฒภาคไม่ควรนำมาใช้ร่วมกับการดำเนินงานของเคอร์เซอร์: OPEN, FETCH, และCLOSE DEALLOCATEฉันเพิ่งเสียเวลาสองสามชั่วโมงกับสิ่งนี้ ฉันดู BOL อย่างใกล้ชิดและสังเกตว่า [;] ไม่แสดงในไวยากรณ์สำหรับคำสั่งเคอร์เซอร์เหล่านี้ !!

ดังนั้นฉันจึง:

OPEN mycursor;

และนี่ทำให้ฉันเกิดข้อผิดพลาด 16916

แต่:

OPEN mycursor

ทำงาน


2
ฉันไม่คิดว่ามันถูกต้อง BOL ไม่สอดคล้องกันมากในการกล่าวถึงอัฒภาคบนไวยากรณ์ของคำสั่งให้ดูที่ SELECT สำหรับอินสแตนซ์ รวมทั้งฉันได้เห็นเคอร์เซอร์เปิดแล้ว ทำงานได้ดีเหมือนกันสำหรับ FETCH, CLOSE และ DEALLOCATE ...
Valentino Vranken

ที่แนะนำให้ฉันข้อผิดพลาดกับ parser คุณใช้ SQL Server เวอร์ชันใดอยู่ /
Stewart

2

ตามอนุสัญญาไวยากรณ์ของ Transact-SQL (Transact-SQL) (MSDN)

ตัวสิ้นสุดคำสั่ง Transact-SQL แม้ว่าจะไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคสำหรับคำสั่งส่วนใหญ่ใน SQL Server รุ่นนี้ แต่จะต้องใช้ในรุ่นอนาคต

(โปรดดูความคิดเห็นของ @gerryLowry)


0

เมื่อใช้คำสั่ง DISABLE หรือ ENABLE TRIGGER ในแบทช์ที่มีคำสั่งอื่นอยู่คำสั่งก่อนที่จะต้องจบด้วยเซมิโคลอน มิฉะนั้นคุณจะได้รับข้อผิดพลาดทางไวยากรณ์ ฉันฉีกผมออกด้วยอันนี้ ... และหลังจากนั้นฉันก็สะดุดกับรายการ MS Connect นี้เกี่ยวกับสิ่งเดียวกัน มันถูกปิดเนื่องจากไม่สามารถแก้ไขได้

ดูที่นี่


0

หมายเหตุ: นี่ตอบคำถามตามที่เขียน แต่ไม่ใช่ปัญหาตามที่ระบุไว้ เพิ่มที่นี่เนื่องจากผู้คนจะค้นหา

อัฒภาคยังใช้มาก่อนWITHในคำสั่ง CTE แบบเรียกซ้ำ:

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

แบบสอบถามนี้จะสร้าง CTE ที่เรียกว่า Numbers ซึ่งประกอบด้วยจำนวนเต็ม [1..10] ทำได้โดยการสร้างตารางที่มีค่า 1 เท่านั้นจากนั้นเรียกซ้ำจนกว่าจะถึง 10


8
ในทางเทคนิคไม่ 'มาก่อนด้วย' แต่หลังจากสิ่งที่มาก่อนด้วย ถ้า with เป็นคำสั่งแรกในแบตช์ไม่ต้องใช้เครื่องหมายอัฒภาค
Tor Haugen

มันไม่ได้เป็นยังใช้มาก่อนด้วย นี่เป็นเพียงอัฒภาคที่ยุติคำสั่งก่อนหน้า ดูเหมือนว่าบางคนตัดสินใจว่าเครื่องหมายอัฒภาคควรอยู่ที่นี่เนื่องจากเป็นสถานการณ์ที่ต้องใช้เครื่องหมายอัฒภาค ทำไมคนเหล่านี้ได้ตัดสินใจนี้จะดีกว่าเสมอยุติงบกับอัฒภาคฉันคิดไม่ออก
สจ๊วต

0

ถ้าคุณชอบรับCommand Timeoutแบบสุ่มข้อผิดพลาดใน SQLServer ให้ละจากเครื่องหมายทวิภาคตอนท้ายของสตริง CommandText ของคุณ

ฉันไม่รู้ว่านี่เป็นเอกสารที่ใดหรือเป็นข้อผิดพลาดหรือไม่ แต่มันเกิดขึ้นและฉันได้เรียนรู้จากประสบการณ์ที่ขมขื่น

ฉันมีตัวอย่างที่ตรวจสอบได้และทำซ้ำได้โดยใช้ SQLServer 2008

aka -> ในทางปฏิบัติให้ใส่เทอร์มิเนเตอร์แม้ว่าคุณจะส่งคำสั่งหนึ่งไปยังฐานข้อมูล


หากคุณได้รับไทม์เอาต์สำหรับการค้นหาโดยไม่มีอะไรเลย แต่ท้ายที่สุดแล้วนั่นเป็นสาเหตุที่เกิดจากการมีแผนการดำเนินการที่แตกต่างกันไปหรือไม่ แต่ก็มีการใช้แคชด้วยการจับคู่กับข้อความค้นหาที่แน่นอนสิ่งต่าง ๆ เช่นช่องว่างความคิดเห็นและเครื่องหมายอัฒภาค อัฒภาคนั้นจะไร้เดียงสาอย่างสิ้นเชิงที่ก่อให้เกิดปัญหาเรื่องเวลาใด ๆ
Jeroen Mostert

-2

อัฒภาคไม่ทำงานเสมอในคำสั่งผสมคำสั่ง

เปรียบเทียบทั้งสองเวอร์ชันที่แตกต่างกันของคำสั่ง SELECT แบบผสม

รหัส

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

ผลตอบแทน

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.

อย่างไรก็ตามรหัส

DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

ผลตอบแทน

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)

11
[หนึ่งปีต่อมา]: ว้าวฉันยังไม่มีใครพูดถึงคำตอบนี้! แน่นอนว่ามันใช้งานไม่ได้เครื่องหมายอัฒภาคเป็นตัวคั่นคำสั่งดังนั้นโค้ดของคุณที่มีเครื่องหมายอัฒภาคคือ: 1- SELECT @ Test = (SELECT (SELECT (SELECT (SELECT (เลือก 'เซมิโคลอนไม่ทำงานได้ดีเสมอ') - นี่ไม่ถูกต้อง คำสั่ง 2-); - ทั้งสามนี้คือ) - ทั้งที่ 4-); - ไม่ว่าเซมิโคลอนตัวใดตัวหนึ่งควรอยู่หลังวงเล็บ 3 ตัว
PhpLou

1
คุณใช้เครื่องหมายอัฒภาคเพื่อยุติคำสั่งเท่านั้น แบบสอบถามย่อยไม่ใช่คำสั่ง งบเป็นสิ่งที่ดำเนินการตามลำดับ ในตัวอย่างของคุณมีสามประโยคคือ: 1. DECLARE @ Test varchar (35) 2. SELECT @ Test = (SELECT (SELECT (SELECT (SELECT 'เครื่องหมายอัฒภาคไม่ทำงานได้ดีเสมอ'))) 3. SELECT @ Test Test
Stewart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.