【发布时间】:2011-11-26 17:59:39
【问题描述】:
如果表包含特定列,我想检查我的存储过程。如果存在这样的列,我想提出一个错误,因为它们是不允许的。首先我想出了下面的想法,这显然有一个我能理解的缺陷。
BEGIN TRY
SET @sql = N'SELECT TOP 0 forbidden_column_name1 INTO #t1 FROM ' + @input_table ;
EXEC @err = sp_executesql @sql ;
IF @err = 0 -- i.e. if succeeds
RAISERROR('Input table cannot contain ''forbidden_column_name1''. This name is reserved!', 16, 99) ;
SET @sql = N'SELECT TOP 0 forbidden_column_name2 INTO #t1 FROM ' + @input_table ;
EXEC @err = sp_executesql @sql ;
IF @err = 0 -- i.e. if succeeds
RAISERROR('Input table cannot contain ''forbidden_column_name2''. This name is reserved!', 16, 99) ;
SET @sql = N'SELECT TOP 0 forbidden_column_name3 INTO #t1 FROM ' + @input_table ;
EXEC @err = sp_executesql @sql ;
IF @err = 0 -- i.e. if succeeds
RAISERROR('Input table cannot contain ''forbidden_column_name3''. This name is reserved!', 16, 99) ;
END TRY
BEGIN CATCH
IF ERROR_STATE() = 99
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
RETURN ;
END
-- Do nothing and continue execution, if column doesn't exist
END CATCH
此代码将仅检查forbidden_column_name1 的存在。不检查其他的,因为在检查forbidden_column_name1 期间必须引发异常:如果列不存在,则来自sp_executesql,或者如果列确实RAISERROR /em> 存在。无论哪种方式,执行都会传递到 catch 块并且永远不会回来。
我的问题是,如果错误实际上不是错误,但实际上是需要的东西,有没有办法强制执行回到 TRY 块。否则我必须将所有检查放在单独的 TRY/CATCH 块中,这使得代码看起来有点多余。
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql exception