【发布时间】:2016-06-03 17:14:39
【问题描述】:
CREATE PROCEDURE 语法:
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 不允许,那么第二个示例也应该可以工作,否则文档不准确。
编辑
好吧,那是因为在第一个示例中它不是一个空主体,您的 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
【问题讨论】:
-
好吧,那是因为在第一个示例中它不是一个空主体,您的 sp 将是:
EXEC my_proc。就像你写一样:CREATE PROC my_proc AS BEGIN EXEC my_proc END -
不仅仅是 SPROC。在查询窗口中执行
BEGIN END也会引发错误,但执行空字符串会成功。 -
@Lamak 不,尝试不使用它或使用
EXEC块 -
可能它允许完全为空的主体以实现向后兼容性并且不值得修复。与
create table中的最后一列之后允许使用尾随逗号相同。
标签: sql sql-server tsql stored-procedures sql-server-2012