尝试在SQL的过程中捕获

时间:2014-06-26 21:55:13

标签: sql-server-2008

我正在创建一个存储过程。它创建很好,如果我给出错误的值,它应该在DBErrors表中保存错误消息。就像在这种情况下我没有在employeeid中给出int类型值。

表DBerrors中没有保存错误值。请指导我这里有什么问题?

我已经创建了employee和DBErrors表。

CREATE PROCEDURE [SP_updateEmployee]
   (@EMPLOYEEID int, @NAME varchar(50), @ADDRESS varchar(50)) 

---add try catch in update statement
AS
BEGIN TRY
   update Employee
   SET employeeid=@EmployeeID,NAME=@Name,[ADDRESS]= @ADDRESS
where employeeid=@employeeID

END TRY

---stores error in error table
BEGIN CATCH


INSERT INTO DBErrors (USERNAME,ERRORNUMBER,ERRORMESSAGE)
VALUES (SUSER_SNAME(),ERROR_NUMBER(),ERROR_MESSAGE())



END CATCH


--drop PROCEDURE SP_updateEmployee

EXEC [SP_updateEmployee] t,'y','q' 

----select * from DBErrors

1 个答案:

答案 0 :(得分:0)

仅当TRY块中发生错误/异常时,才会在 DBErrors 表中捕获错误。在您的情况下,用户可能会传递字符串而不是INT,因此生成的异常将位于TRY块之外的参数声明部分。

Soln:DECLARE @EMPLOYEEID VARCHAR(10)

CREATE PROCEDURE [SP_updateEmployee]
   (@EMPLOYEEID VARCHAR(10), @NAME varchar(50), @ADDRESS varchar(50)) 

每当用户将字符串值传递为

EXEC [SP_updateEmployee] t,'y','q' 

参数声明部分不会产生异常,插入值系统时会抛出适当的异常,例如

Conversion failed when converting the varchar value 't' to data type int. 

由于这是在你的TRY块内,它会在生成异常时跳转到CATCH块,你将能够在你的表中捕获这些数据。