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 ] }
[] (скобки) Необязательные элементы синтаксиса. Не печатайте скобки.
{} (фигурные скобки) Обязательные элементы синтаксиса. Не печатайте фигурные скобки.
И человек машиночитаемой форме:
Давайте попробуем написать хранимую процедуру с пустым телом:
CREATE PROC my_proc AS
-- please treat it as separate call, for example with different session
EXEC my_proc
совершенен действительный синтаксис.
Так что, похоже, что sql_statement
может быть пустым.
Теперь давайте попробуем то же самое с, но на этот раз с BEGIN/END
блока:
CREATE PROC my_proc AS
BEGIN
END
-- Incorrect syntax near 'END'.
Почему первый пример действителен? Если 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
ну, это потому, что в первом примере это не пустое тело, ваш sp будет: 'EXEC my_proc'. Это то же самое, что вы пишете: 'CREATE PROC my_proc AS BEGIN EXEC my_proc END' – Lamak
Это не просто SPROC. Выполнение 'BEGIN END' в окне запроса также вызывает ошибку, но выполнение пустой строки работает успешно. – Malk
@ Lamak Nope, попробуйте без него или с блоком 'EXEC' – lad2025