2017-01-23 2 views
1

MSDN дает следующий синтаксис и объяснение:Конец тела SQL хранится procecdure (где это?)

{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } 

один или несколько операторов Transact-SQL, содержащие тело процедура. Вы можете использовать необязательные ключевые слова BEGIN и END, чтобы заключить в них . Для получения информации см. Разделы «Лучшие практики», «Общие вопросы», «Замечания и ограничения и ограничения».

По существу это последовательность операторов SQL, которая не знает, где, если нет пары BEGIN/END. Блок BEGIN/END - это, по сути, инструкция. Может ли тело процедуры состоять из двух последовательных блоков BEGIN/END? (Скорее всего нет, но я не вижу его нигде.) Когда пара парсеров BEGIN/END не может решить, что процедура завершилась на любом SQL-заявлении верхнего уровня. Где поймать?

Замечания и ограничения раздел также не очень полезны.

ответ

3

Да, два BEGIN/END пары могут образовывать тело одной хранимой процедуры:

create procedure P 
as 
begin 
    select 1 as A 
end 
begin 
    select 2 as B 
end 

создает одну хранимую процедуру, которая производит два набора результатов.

Фактический конец хранимой процедуры - это конец партии. Это либо все тело запроса вы отосланы на сервер или, если вы используете определенные инструменты клиента (например, ВСС), он будет автоматически разделит свои материалы в пакетах, основанных на GO command:

Сообщает конец пакета операторов Transact-SQL утилитам SQL Server.

Ключом, что все партии на основе фактически первое предложение в разделе Limitations and Restrictions, что вы уже связаны с:

оператора процедуры CREATE не могут быть объединены с другими Transact-SQL заявления в одном партия.

Логически, это означает, что CREATE PROCEDURE оператор потребляет всех содержимого пакета.

+0

Хм, похоже, я не могу отправить несколько инструкций 'CREATE POC' в одной партии не из SSMS вообще? Ex, если я использую ODBC? – Buran

+0

@Buran - одна партия == одна хранимая процедура, как мы надеемся, ясно из ссылок/цитат, которые я редактировал. –

+0

Это не связано напрямую. Я думал, что я могу сценарий всех объектов базы данных (независимо) в большой файл SQL, а затем выполнить этот файл из моего приложения ODBC, чтобы воссоздать все, что говорят на другом сервере. Похоже, что это вообще невозможно. Правильно? – Buran

Смежные вопросы