Операторы после END в хранимая процедура

Сегодня я столкнулся с интересной проблемой. Я изменял хранимую процедуру и помещал оператор выбора в самый конец. Это должно было быть временным и просто для работы с данными. Позже я был удивлен, узнав, что этот оператор был сохранен и выполнялся при каждом запуске SP.

SET ANSI_NULLS ON
GO

-- Comments usually go here and are saved as part of the SP
ALTER PROCEDURE [dbo].[MySP]
    @param INT
AS
BEGIN
    --Your normal SQL statements here
END

--You can also add SQL statements here
select * from LargeTable

--You have access to the params
select @param

Имеет смысл, что все сохраняется, а не только то, что находится внутри BEGIN / END, в противном случае комментарии и SET ANSI_NULLS и др. исчезнет. Я немного запутался в том, что где начинается, поэтому у меня есть несколько вопросов:

  1. SET ANSI_NULLS сохраняется как часть SP. Я подтвердил, что каждый SP имеет свою ценность. Откуда SQL Server знает, что нужно сохранить это как часть SP, если на него раньше не ссылались? Выполняется ли полное сканирование текущего состояния среды, а затем, когда ALTER PROCEDURE выполняется, он сохраняет состояние (возможно, только значения, отличные от значений по умолчанию)?
  2. Очевидно, BEGIN / END являются необязательными и не имеют внутренних смысл. Почему они тогда вообще включены? Они дают ложное представление о масштабах, которых не существует. Мне кажется, что никакие BEGIN / END и GO в конце не имеют смысла.
7
задан Nelson Rothermel 15 November 2010 в 20:34
поделиться