Я хочу проверить в своей хранимой процедуре, содержит ли таблица определенные столбцы.Я хочу поднять ошибку, если такие столбцы существуют, потому что они не разрешены.Сначала я пришел к следующей идее, которая, очевидно, имеет дефект, который я могу понять.
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
, если столбец делает существует.В любом случае, выполнение переходит к блоку catch и никогда не возвращается.
Мой вопрос заключается в том, есть ли способ заставить выполнение вернуться к блоку TRY, если ошибка на самом деле не является ошибкой , а фактически является чем-то желаемым.В противном случае я должен поместить все проверки в отдельные блоки TRY / CATCH, что делает код немного избыточным.