Sql server 为什么需要EXEC来执行过程?

Sql server 为什么需要EXEC来执行过程?,sql-server,oracle,tsql,plsql,Sql Server,Oracle,Tsql,Plsql,调用存储过程时为什么需要EXEC或EXECUTE?Oracle和SQL Server都有需要EXEC和不需要EXEC的情况。需要它有什么意义?这无疑是一个解析器问题/挑战。如果对存储过程的调用可以在文本体中的任何位置,那么试图编写一个能够理解所有内容的通用程序将使您丧命。相反,设计者发布了该语言的语言,而您,即用户,负责理解如何使用该语言 或者,在SQL Server世界中,始终使用EXEC/EXECUTE,并且永远不必担心何时需要它。正如@alex所指出的,这对Oracle来说并不成立。这使得

调用存储过程时为什么需要EXEC或EXECUTE?Oracle和SQL Server都有需要EXEC和不需要EXEC的情况。需要它有什么意义?

这无疑是一个解析器问题/挑战。如果对存储过程的调用可以在文本体中的任何位置,那么试图编写一个能够理解所有内容的通用程序将使您丧命。相反,设计者发布了该语言的语言,而您,即用户,负责理解如何使用该语言


或者,在SQL Server世界中,始终使用EXEC/EXECUTE,并且永远不必担心何时需要它。正如@alex所指出的,这对Oracle来说并不成立。

这使得语法更加清晰明确。由于语句分隔符分号在T-SQL中不是必需的,因此可以更清楚地找到语句的起始位置


另一方面,我建议在每条语句后严格使用分号,因为在使用WITH关键字时会遇到歧义问题,它可以在DML语句之前开始公共表表达式的定义,也可以在DML语句末尾用于定义提示;如果没有分号,解析器就无法知道到底要选择哪个分号。

在Oracle中,EXECUTE或EXEC在SQL*Plus中用作匿名PL/SQL块的快捷方式。EXECUTE在PL/SQL中不起作用。您可以选择:

SQL> execute my_proc;
或者,作为完全指定的匿名块:

SQL> DECLARE
BEGIN
  my_proc;
END;
/

这完全是Oracle中的客户端语法。

SQL Server中的说明:要执行存储过程,请使用Transact-SQL execute语句。或者,如果存储过程是批处理中的第一条语句,则可以不使用execute关键字来执行该存储过程。这是必需的,因为如果不提供它,SQL解释器将无法理解您要执行的操作。例如,如何将其与选择或更新区分开来?如果存储过程是批处理中的第一条语句,SQL Server会出现异常。它会检查存储过程是否存在。换句话说,您的问题与查询表时为什么需要选择基本相同?为什么数据库不认为我在做选择呢?毕竟,SELECT可能是对SQL数据库执行的最常见的操作,所以为什么不将其作为默认操作呢?批处理开始时,解析器的状态不同。例如,您还可以执行INSERT tbl EXEC storedproc@a、@b操作,将SP的结果集放入表中。让我告诉你,旧的T-SQL仍然是不够明确的,因为他们的立场。一种语言越严格,就越容易为它创建一个高效的解析器。T-SQL语句中可以作为第一项出现的许多关键字(尽管不是所有关键字)总是指示新语句的开始,除非它们嵌套在子查询中,这很容易处理。解析器以这种方式进行的猜测更少。ctd。与编译语言相比,重要的是要记住,T-SQL ist通常是动态执行的动态SQL,由ORMs生成,因此解析器性能比C、Java或VB等语言更重要,因为C、Java或VB等语言的解析器性能不太重要。请注意,即使缓存并重新使用查询计划,仍必须执行解析。为什么Oracle不能尝试查找具有匹配名称的存储过程,而不是在缺少EXEC时在SQL提示符上失败?我不知道。答案很简单,因为这就是他们构建SQL*Plus的方式。不,答案是因为PL/SQL就像两种交织在一起的语言,可以交替使用。这也是为什么嵌入在PL/SQL中的SQL语句与PL代码部分不同的原因;变量、运算符和其他方面存在差异。所以在SQL*Plus中,不需要PL,而需要SQL,通过创建PL/SQL块,基本上可以切换语言。另请参见。SQL和PL/SQL是两种语言。虽然SQL DML子集在PL/SQL中是本机支持的,但它不支持DDL,例如CREATE TABLE等,要在PL/SQL中执行类似的操作,必须还原为使用EXECUTE IMMEDIATE命令执行的动态SQL。它不像SQLServer上的T-SQL那样,只有一种语言处理服务器所做的一切;Oracle上有多种语言,除PL/SQL外,您还可以在Windows系统上使用Java甚至.NET进行SPs等操作。始终使用EXEC进行T-SQL可能会起作用,但PL/SQL不起作用,如果EXEC在场,您会遇到错误谢谢您的教育@Alex,更新了答案,以反映axiom仅适用于SQL Server。我会将此标记为答案,尽管这是您在这个问题的评论中所做的全部贡献,并描绘了一个更完整的答案picture@Alex,谢谢你的反馈。快乐编码!