2016-06-03 3 views
3

CREATE PROCEDURE Синтаксис:SQL Server хранимые процедуры с пустым телом

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
     [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY] 
    ] [ ,...n ] 
[ WITH <procedure_option> [ ,...n ] ] 
[ FOR REPLICATION ] 
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } 
[;] 


<sql_statement> ::= 
{ [ BEGIN ] statements [ END ] } 

[] (скобки) Необязательные элементы синтаксиса. Не печатайте скобки.

{} (фигурные скобки) Обязательные элементы синтаксиса. Не печатайте фигурные скобки.

И человек машиночитаемой форме:

enter image description here

Давайте попробуем написать хранимую процедуру с пустым телом:

CREATE PROC my_proc AS 

-- please treat it as separate call, for example with different session 
EXEC my_proc 

совершенен действительный синтаксис.

LiveDemo

Так что, похоже, что sql_statement может быть пустым.

Теперь давайте попробуем то же самое с, но на этот раз с BEGIN/END блока:

CREATE PROC my_proc AS 
BEGIN 
END 
-- Incorrect syntax near 'END'. 

LiveDemo2

Почему первый пример действителен? Если sql_statement ничего не дает, то второй пример должен работать, или документ неточен.

EDIT

хорошо, это потому, что в первом примере это не пустое тело, ваш зр будет: EXEC my_proc

Дело в том, чтобы показать, что я мог бы вызов SP. Но вы можете добавить GO или использовать EXEC:

CREATE PROC my_proc AS 
GO 

EXEC my_proc 

или

EXEC('CREATE PROC my_proc AS') 

EXEC my_proc 

LiveDemo3

+1

ну, это потому, что в первом примере это не пустое тело, ваш sp будет: 'EXEC my_proc'. Это то же самое, что вы пишете: 'CREATE PROC my_proc AS BEGIN EXEC my_proc END' – Lamak

+2

Это не просто SPROC. Выполнение 'BEGIN END' в окне запроса также вызывает ошибку, но выполнение пустой строки работает успешно. – Malk

+1

@ Lamak Nope, попробуйте без него или с блоком 'EXEC' – lad2025

ответ

5

Ошибка синтаксиса не связана с правильным синтаксисом для хранимых проки. Это правильный синтаксис для «BEGIN/END». BEGIN/END требует наличия некоторого SQL внутри него.Документация BEGIN/END показывает это:

https://msdn.microsoft.com/en-us/library/ms190487.aspx

BEGIN 
    { 
    sql_statement | statement_block 
    } 
END 

грамматика в документации CREATE PROC действительно не совсем верно, так как он говорит, что sql_statement требуется для «CREATE PROC», когда на самом деле не требуется.

+0

Хорошо, тогда документ для CREATE SP является неточным. Посмотрите на железнодорожную схему. – lad2025

+1

Но это то же самое, что и грамматика в OP. И там он принимает пустую строку для 'sql_statement', поэтому на самом деле это не отвечает на вопрос. Вы просто утверждаете, что это непустая строка. 'sql_statement' не является обязательным в грамматике' CREATE PROC' с или без 'BEGIN .. END'. –

+0

@ lad2025 - Я бы сказал, что документ не совсем неточен, просто не рекурсивно детализирован. То есть он определяет, что вы можете использовать опцию «BEGIN», но он не определяет, какой действительный синтаксис для «BEGIN». Аналогично, в нем говорится, что вы можете включить «sql_statement», но не определяет, какие «sql_statements» действительны. – GendoIkari

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