Class.new()
Создают новый класс во время выполнения. Аргументом может быть класс для получения из, и блок является телом класса. Вы могли бы также хотеть посмотреть const_set/const_get/const_defined?
для получения нового класса, правильно зарегистрированного, так, чтобы inspect
распечатал имя вместо числа.
Не что-то, в чем Вы нуждаетесь каждый день, но довольно удобный, когда Вы делаете.
Вы можете использовать RETURN
, чтобы немедленно остановить выполнение хранимой процедуры. Цитата из электронной документации :
Безоговорочный выход из запроса или процедура. ВОЗВРАТ немедленный и полный и может быть использован в любой момент для выхода из процедуры, пакета или блок операторов. Заявления, что Follow RETURN не выполняются.
Из-за паранойи я попробовал ваш пример, он выводит PRINT и немедленно останавливает выполнение.
This works over here.
ALTER PROCEDURE dbo.Archive_Session
@SessionGUID int
AS
BEGIN
SET NOCOUNT ON
PRINT 'before raiserror'
RAISERROR('this is a raised error', 18, 1)
IF @@Error != 0
RETURN
PRINT 'before return'
RETURN -1
PRINT 'after return'
END
go
EXECUTE dbo.Archive_Session @SessionGUID = 1
Returns
before raiserror
Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 7
this is a raised error
Поместите его в TRY / CATCH
.
Когда RAISERROR выполняется с серьезностью 11 или выше в блоке TRY, это передает управление ассоциированному CATCH block
Ссылка: MSDN .
РЕДАКТИРОВАТЬ: Это работает для MSSQL 2005+, но я вижу, что теперь вы пояснили, что работаете над MSSQL 2000. Я оставлю это здесь для справки.
Если вы не укажете уровень серьезности 20 или выше, ошибка raiserror
не остановит выполнение. См. Документацию MSDN .
Обычное решение - включить возврат
после каждой ошибки, повышающей
:
if @whoops = 1
begin
raiserror('Whoops!', 18, 1)
return -1
end
i figured out why RETURN
is not unconditionally returning from the stored procedure. The error i'm seeing is while the stored procedure is being compiled - not when it's being executed.
Consider an imaginary stored procedure:
CREATE PROCEDURE dbo.foo AS
INSERT INTO ExistingTable
EXECUTE LinkedServer.Database.dbo.SomeProcedure
Even though this stord proedure contains an error (maybe it's because the objects have a differnet number of columns, maybe there is a timestamp column in the table, maybe the stored procedure doesn't exist), you can still save it. You can save it because you're referencing a linked server.
But when you actually execute the stored procedure, SQL Server then compiles it, and generates a query plan.
My error is not happening on line 114, it is on line 114. SQL Server cannot compile the stored procedure, that's why it's failing.
And that's why RETURN
does not return, because it hasn't even started yet.
Это потому, что у вас нет операторов BEGIN
и END
. Вы не должны видеть распечатки или ошибки при выполнении этого оператора, только Заявление завершено
(или что-то в этом роде).