切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
Sqlserver中进行异常捕获
作者:ych
### 存储过程 SQL Server 中异常处理 (TRY...CATCH) 的执行流程,以及什么情况下会进入 CATCH 块。 示例场景: 假设我们有一个存储过程,尝试将数据插入到一个表中。如果插入操作因为任何原因失败(例如,违反唯一约束、数据类型不匹配),我们希望捕获该错误并记录它。 #### 示例表 ``` CREATE TABLE MyTable ( ID INT IDENTITY(1,1) PRIMARY KEY, Column1 INT, Column2 VARCHAR(50) ); ``` #### 脚本 ``` CREATE PROCEDURE dbo.InsertData @Value1 INT, @Value2 VARCHAR(50) AS BEGIN SET NOCOUNT ON; BEGIN TRY -- 尝试插入数据 INSERT INTO MyTable (ID, Column2) VALUES (@Value1, @Value2); -- 如果插入成功,返回 0 PRINT '插入成功'; -- 用于测试,实际应用中应避免在存储过程中使用 PRINT RETURN 0; END TRY BEGIN CATCH -- 如果插入失败,执行以下操作 -- 1. 获取错误信息 DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); -- 2. 记录错误信息 (示例) PRINT '插入失败'; PRINT @ErrorMessage; -- 3. 返回错误代码 RETURN -1; END CATCH; END; GO ``` #### 什么时候会进入 CATCH 块? 只要在 TRY 块中发生任何错误,SQL Server 就会立即将执行流程转移到 CATCH 块。 这些错误可能包括: 语法错误: SQL 语句中存在语法错误。 运行时错误: 例如,除以零、类型转换错误、算术溢出。 违反约束: 违反了表上的约束(例如,唯一约束、主键约束、外键约束)。 权限错误: 存储过程没有执行某些操作所需的权限。 死锁: 存储过程与其他进程发生死锁。 显式引发的错误: 使用 RAISERROR 语句显式引发的错误。 #### 示例: 触发 CATCH 块 假设`MyTable`有一个唯一索引在`Column1`上。 首先,插入一行数据: ``` EXEC dbo.InsertData @Value1 = 1, @Value2 = 'Test'; ``` 这应该成功执行,并且你会看到 插入成功。 然后,尝试插入具有相同 Column1 值的另一行数据: ``` EXEC dbo.InsertData @Value1 = 1, @Value2 = 'Another Test'; ``` 这次,由于违反了唯一索引,INSERT 语句会失败,并且执行流程会进入 CATCH 块。 你会看到 插入失败,以及相应的错误消息,指出存在唯一约束冲突。 >EXEC dbo.InsertData @Value1 = 1, @Value2 = 'Another Test'; > 插入失败 > 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'MyTable' 中的标识列插入显式值。 > OK > 时间: 0.001s
相关推荐
Microsoft SQL Server 2016
sqlserver2016安装避坑指南
SQL Server 复制订阅及发布
SQL Server 2022 企业版中文简体版安装指南
Sqlserver单表一亿数据生成测试及优化方案
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1