我正在创建一个存储过程。它创建很好,如果我给出错误的值,它应该在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
答案 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块,你将能够在你的表中捕获这些数据。