2014-09-29 64 views
1

我有一个存储过程spMyProc。该过程传递一个表名作为参数@TableName。在继续执行过程之前,验证表格是否存在非常重要。如何在SQL Server中引发自定义异常

如何在表名无效的情况下创建自定义异常来引发错误?

我知道TRYCATCH但我不确定如何将它们与自定义例外放在一起。

问候。

+0

哪SQL Server的**版本**?在2012年,我们得到了一个新的'THROW'关键字.... – 2014-09-29 15:56:44

+1

不幸的是2008!我无法等待升级到2014. – 2014-09-29 15:57:40

+1

您应该能够使用['RAISERROR'](http://msdn.microsoft.com/zh-cn/library/ms178592.aspx)实现您的目标。声明 – 2014-09-29 15:58:44

回答

1

我认为这里提供的例子之一RAISERROR应该符合你的问题。新版本的SQL Server将使用THROW而不是RAISERROR。

2

调查RAISERROR()的故事。

TRY .. CATCH工作得同样的,因为它会在其他任何编程语言

BEGIN TRY 

    -- do your checks 
     IF NOT EXISTS(SELECT 1 FROM sys.tables WHERE NAME = @TableName) 
     BEGIN 
      RAISERROR('Table does not exist', 16,1) 
     END 

    -- rest of the code if checks are passed 
    -- if above checks are not passed and you riase an error 
    -- control will skip any code in TRY Block after the error has been 
    -- Raised and staright jump to Catch block. 

END TRY 

BEGIN CATCH 
    -- Do your error logging 
    -- Other stuff 
    -- you have access to ERROR_ functions here to get detailed info about errors 
END CATCH 
1

您可以使用尝试捕捉和RAISEERROR用于处理自定义异常工作,例如:

begin try 
    --sql statements 
end try 
begin catch 
    RAISERROR 
    (
    ERROR_MESSAGE(), -- or add your custom message 
    ERROR_SEVERITY(), 
    1,    
    ERROR_NUMBER(), -- parameter: original error number. 
    ERROR_SEVERITY(), -- parameter: original error severity. 
    ERROR_STATE(),  -- parameter: original error state. 
    ISNULL(ERROR_PROCEDURE(), '-'), -- parameter: original error procedure name. 
    ERROR_LINE()  -- parameter: original error line number. 
end catch