ฉันเชื่อว่ามีข้อยกเว้นบางประการ แต่จากความผิดพลาดของ Engine Database (MSDN) :
ข้อความแสดงข้อผิดพลาดที่มีระดับความรุนแรงตั้งแต่ 19 ขึ้นไปจะหยุดการทำงานของแบตช์ปัจจุบัน
ข้อผิดพลาดที่ยุติการเชื่อมต่อฐานข้อมูลซึ่งมักจะมีระดับความรุนแรงตั้งแต่ 20 ถึง 25 จะไม่ถูกจัดการโดยบล็อก CATCH เนื่องจากการดำเนินการจะถูกยกเลิกเมื่อการเชื่อมต่อสิ้นสุดลง
ดังนั้นดูเหมือนว่าคุณจะได้รับรายการที่ชัดเจนจากแบบสอบถามต่อไปนี้ (แน่นอนว่าสิ่งนี้จะไม่อนุญาตให้คุณกรองสิ่งที่ผู้ใช้อาจเกิดจาก T-SQL):
SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033
AND severity >= 19
ORDER BY severity, message_id;
ใน SQL Server 2012 จะสร้าง 210 แถว
ใน SQL Server 2016 จะสร้าง 256 แถว
โดยวิธีการที่ฉันไม่เชื่อว่าสองสถานการณ์ที่คุณอธิบายในคำถามของคุณทำงานอย่างที่คุณคิดว่าอย่างน้อยไม่ได้อยู่ในรุ่นที่ทันสมัยของ SQL Server ฉันลองสิ่งนี้ทั้งในปี 2555 และ 2559 (ฉันเชื่อว่าบทความของ Erland อธิบายพฤติกรรมของ SQL Server 2000 ซึ่งฉันจำไม่ได้ว่ามันแตกต่างกันหรือไม่
USE tempdb;
GO
CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO
SET XACT_ABORT OFF;
GO
EXEC dbo.pA @foo = 1;
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO
EXEC dbo.pB;
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO
EXEC dbo.pB @x = 1;
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO
EXEC dbo.pB @x = 1, @y = 2, @z = 3;
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO
สิ่งเหล่านี้สร้างข้อผิดพลาดของระดับความรุนแรง 16 และทั้งหมดดำเนินการกับแบทช์ดังที่เห็นได้จากผลลัพธ์การพิมพ์:
เกี่ยวกับข่าวสาร 8146 ระดับ 16 สถานะ 2 โพรซีเดอร์ pA โพรซีเดอร์บรรทัด 11
pA ไม่มีพารามิเตอร์และอาร์กิวเมนต์ถูกระบุ
### ขั้นตอนการโทรที่ไม่รับพารามิเตอร์ด้วยพารามิเตอร์
ข่าวสารเกี่ยวกับ 201 ระดับ 16 สถานะ 4 ขั้นตอน pB กระบวนงานบรรทัดที่ 14
หรือฟังก์ชัน 'pB' คาดว่าพารามิเตอร์ '@x' ซึ่งไม่ได้ระบุไว้
### ขั้นตอนการโทรที่ใช้ 2 พารามิเตอร์โดยไม่มีพารามิเตอร์
ข่าวสารเกี่ยวกับ 201, ระดับ 16, สถานะ 4, โพรซีเดอร์ pB, โพรซีเดอร์บรรทัด 18
หรือฟังก์ชัน 'pB' คาดว่าพารามิเตอร์ '@y' ซึ่งไม่ได้ระบุไว้
### ขั้นตอนการโทรที่ใช้ 2 พารามิเตอร์ที่มีพารามิเตอร์ไม่เพียงพอ
ข่าวสารเกี่ยวกับ 8144, ระดับ 16, สถานะ 2, โพรซีเดอร์ pB, โพรซีเดอร์บรรทัดที่ 22,
หรือฟังก์ชัน pB มีการระบุอาร์กิวเมนต์มากเกินไป
### ขั้นตอนการโทรที่ใช้ 2 พารามิเตอร์ที่มีพารามิเตอร์มากเกินไป
อย่างที่ฉันสงสัยว่ามีข้อยกเว้นแน่นอนตามที่ระบุไว้ในความคิดเห็น ความล้มเหลวในการแปลงคือความรุนแรง 16 แต่ยกเลิกแบทช์:
SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens
ผลลัพธ์ไม่รวมเอาท์พุทการพิมพ์ในครั้งนี้:
ข่าวสารเกี่ยวกับ 245, ระดับ 16, สถานะ 1
การแปลงล้มเหลวเมื่อแปลงค่า varchar 'foo' เป็นชนิดข้อมูล int