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
是完美有效的语法。
的 LiveDemo
所以看起来sql_statement
可能是空的。
现在让我们尝试相同但这次使用BEGIN/END
阻止:
CREATE PROC my_proc AS
BEGIN
END
-- Incorrect syntax near 'END'.
为什么第一个例子有效?如果sql_statement
不允许,则第二个示例也应该起作用,或者文档不准确。
修改
嗯,那是因为在第一个例子中它不是一个空体,你的sp将是:EXEC my_proc
案件是为了表明我可以打电话给SP。但您可以添加GO
或使用EXEC
:
CREATE PROC my_proc AS
GO
EXEC my_proc
或
EXEC('CREATE PROC my_proc AS')
EXEC my_proc
答案 0 :(得分:5)
语法错误与存储过程的正确语法无关。这是&#34; BEGIN / END&#34;的正确语法。 BEGIN / END要求其中的一些SQL有效。 BEGIN / END的文档显示了这一点:
https://msdn.microsoft.com/en-us/library/ms190487.aspx
BEGIN
{
sql_statement | statement_block
}
END
CREATE PROC文档中的语法确实不完全正确,因为它说&#34; CREATE PROC&#34;需要sql_statement,而实际上并不需要它。