2010-04-28 274 views
6

一个)批处理VS SQL语句

SQL语句是一个SQL命令(例如,SELECT * FROM表1或SET NOCOUNT ON)。另一方面,批量是发送到服务器以执行整个单元的多个SQL语句。批处理中的语句被编译为单个执行计划。批次由GO命令分离

所以SQL语句和一个批次之间的唯一区别是,每个SQL语句被发送到服务器作为一个单独的单元,从而从其他SQL语句单独编译,而在SQL语句中批处理是一起编译的吗?

b)我认为存储过程和批处理之间的一个主要区别是存储过程是预编译的,而批处理不是?

thanx

回答

5

a。只有在每个SQL语句单独运行时(比如在SSMS或客户端上运行)。

即使没有涉及GO,两条语句也总是“一批”。 GO只是告诉像SSMS这样的工具来分解对引擎的提交。

b。不完全正确。一个存储的proc被预解析,但不会被编译到执行计划中,直到被调用,而不是已经存在于计划缓存中。批处理一次解析并编译,并可能生成可重用计划。

编辑,注释后:

  • 术语“声明”和“批量”是两个不同的概念
  • 发送到数据库引擎的任何文本是一个批处理
  • 文字字面上说:没有处理是由客户端工具来完成:只有文本发送到数据库引擎
  • 文本由SQL语句

所以

  • 一批由文/一个语句的至少一个字符的(但可能是2,20或20,000语句)
  • GO告诉SQL工具在哪里分手“块文本” /”收集陈述“分成数据库引擎调用(=批次)
+0

”a。仅当每个SQL语句单独运行时(比如在SSMS或客户端上运行)“假设我单击Microsoft SQL Server Management Studio - > New Query选项卡(它打开一个新的查询窗口),然后进入该查询窗口单个SQL语句,那么该语句将被视为常规SQL语句,但是如果我输入两个语句,那么我们将会有一批? – AspOnMyNet 2010-04-28 19:39:55

+0

只是为了100%你说的是:单个SQL语句通过Microsoft发送到数据库引擎SQL Server Management Studio的查询窗口 也在批处理内发送(因此这批仅包含一条语句)? – AspOnMyNet 2010-04-29 13:51:59

+0

废话,我试图给你另一点,但我倒是赞成你。我很抱歉 – AspOnMyNet 2010-04-29 13:53:05