Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 尝试SQL中的Catch过程_Sql Server 2008 - Fatal编程技术网

Sql server 2008 尝试SQL中的Catch过程

Sql server 2008 尝试SQL中的Catch过程,sql-server-2008,Sql Server 2008,我正在创建一个存储过程。它创建fine,如果我给出错误的值,它应该将错误消息保存在DBErrors表中。就像在本例中,我没有在employeeid中给出int类型值 它没有在DBerrors表中保存错误值。请告诉我这里怎么了 我已经创建了employee和DBErrors表 CREATE PROCEDURE [SP_updateEmployee] (@EMPLOYEEID int, @NAME varchar(50), @ADDRESS varchar(50)) ---add try

我正在创建一个存储过程。它创建fine,如果我给出错误的值,它应该将错误消息保存在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

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

Soln:DECLARE@EMPLOYEEID VARCHAR(10)

只要用户将字符串值传递为

EXEC [SP_updateEmployee] t,'y','q' 
在参数声明部分不会生成异常,并且在插入值时,系统将注意引发适当的异常,例如

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

由于这在您的TRY块中,因此当生成异常时,它将跳转到CATCH块,您将能够在表中捕获此数据。

执行存储过程时是否收到错误?这将在调用您的过程的
EXEC
中失败,而不是在过程本身中失败。简而言之,它永远不会到达
TRY
语句。
Conversion failed when converting the varchar value 't' to data type int.