【问题标题】:SQL Server stored procedure with empty body带有空主体的 SQL Server 存储过程
【发布时间】: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

是完美的有效语法。

LiveDemo

所以看起来sql_statement 可能是空的。

现在让我们用BEGIN/END 块尝试相同的方法:

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

LiveDemo2

为什么第一个例子有效?如果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

LiveDemo3

【问题讨论】:

  • 好吧,那是因为在第一个示例中它不是一个空主体,您的 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


【解决方案1】:

语法错误与存储过程的正确语法无关。这是“BEGIN/END”的正确语法。 BEGIN/END 需要其中的一些 SQL 才有效。 BEGIN/END 的文档显示了这一点:

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

BEGIN  
     {   
    sql_statement | statement_block   
     }   
END  

CREATE PROC 文档中的语法确实不完全正确,因为它说“CREATE PROC”需要 sql_statement,而实际上并不需要它。

【讨论】:

  • 好的,那么 CREATE SP 的文档不准确。请看铁路图。
  • 但这和OP中的语法是一样的。它在那里接受sql_statement 的空字符串,所以这并不能真正回答问题。您只是断言这是一个非空字符串。 sql_statementCREATE PROC 语法中有或没有 BEGIN.. END 时不是可选的。
  • @lad2025 - 我会说文档并不是真的不准确,只是没有递归详细。也就是说,它定义了您可以选择使用“BEGIN”,但它没有定义“BEGIN”的有效语法是什么。同样,它说您可以包含“sql_statement”,但没有定义哪些“sql_statements”是有效的。
  • @GendoIkari 是的,它有效。因此问题。您似乎错过了问题的重点。
  • 语法是问题中提供的书面 Backus Naur。问题是为什么实践中的行为与此不同。所以争论“它执行所以语法必须这么说”不是答案。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2015-07-03
  • 2020-12-19
  • 2016-05-30
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多