gpt4 book ai didi

具有空主体的 SQL Server 存储过程

转载 作者:行者123 更新时间:2023-12-02 23:56:05 25 4
gpt4 key购买 nike

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 ] }

[ ] (brackets) Optional syntax items. Do not type the brackets.

{ } (braces) Required syntax items. Do not type the braces.

以及人类可读的形式:

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 block :

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

LiveDemo2

为什么第一个例子有效?如果 sql_statement 不允许任何内容,那么第二个示例也应该有效,否则文档不准确。

编辑

well, that's because in the first example it isn't an empty body, your sp will be: 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

最佳答案

语法错误与存储过程的正确语法无关。这是“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,但实际上不需要。

关于具有空主体的 SQL Server 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37620099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com