sql-server - 'TRY - CATCH' 语句在存储过程中未按预期工作
问题描述
此代码工作正常,没有任何错误。但是我想查看 try-catch 语句的输出,并用 try-catch 语句包装了过程的主体,故意犯了一个错误。但是,该错误不会显示为网格结果集中的输出。尽管如此,它还是以默认方式出现。我需要知道我对这句话的使用是否正确。如果没有,有人可以向我解释一下 try-catch 语句的用法。
ALTER PROCEDURE UpdateStudent
(@UpdateStudentDetails [UDTT_Stud] READONLY)
AS
BEGIN TRY
BEGIN
UPDATE dbo.StudentDetails --Deleted 'A' of UPDATE to give an error
SET FirstName = upStud.FirstName,
LastName = upStud.Lastname,
HomeAddress = upStud.HomeAddress,
EmailAddress = upStud.EmailAddress
FROM
StudentDetails stud
INNER JOIN
@UpdateStudentDetails upStud ON stud.IndexNumber = upStud.IndexNumber
END
END TRY
BEGIN CATCH
SELECT
ERROR_MESSAGE() AS 'Error Message',
ERROR_STATE() AS 'Error State',
ERROR_SEVERITY() AS 'Error Severity'
END CATCH
这是我得到的输出
消息 102,级别 15,状态 1,过程 UpdateStudent,第 5 行 [BatchStart 第 0 行]
'UPDATE' 附近的语法不正确
解决方案
正如评论所说,你有一个语法错误,而不是一个运行时错误,可以被 try...catch 捕获。
您已经为 StudentDetails 表设置了一个别名,因此您应该使用它而不是 UPDATE StudentDetails。我还删除了 BEGIN TRY 块内不必要的 BEGIN END 块,并为整个存储过程添加了外部 BEGIN END。
ALTER PROCEDURE UpdateStudent
(@UpdateStudentDetails [UDTT_Stud] READONLY)
AS
BEGIN -- The entire stored procedure should be inside a BEGIN END block
BEGIN TRY
UPDATE stud -- We use the alias
SET FirstName = upStud.FirstName,
LastName = upStud.Lastname,
HomeAddress = upStud.HomeAddress,
EmailAddress = upStud.EmailAddress
FROM
StudentDetails stud
INNER JOIN
@UpdateStudentDetails upStud ON stud.IndexNumber = upStud.IndexNumber
END TRY
BEGIN CATCH
SELECT
ERROR_MESSAGE() AS 'Error Message',
ERROR_STATE() AS 'Error State',
ERROR_SEVERITY() AS 'Error Severity'
END CATCH
END
推荐阅读
- modelica - 变量相互依赖终止 Dymola 模拟并产生非线性方程组
- javascript - 条件泛型类型
- python - 使用循环函数将数据帧过滤到数据帧列表中
- database - 无法识别的管道阶段名称:'$planCacheStats'
- python - 尝试从烧瓶应用程序加载页面时浏览器挂起
- java - 无法从 registerForActivityResult() 的 URI 加载图像
- javascript - Vee 验证自定义 required_if 规则不需要计算
- laravel - 使用中间件 Laravel 还是使用 If 会话?
- json - 用于解析 json 并将其合并到 xml 文件中的 powershell
- typo3 - 如何在 TYPO3 的 YouTube iframe 标签中用 data-src 替换 src?