2010-04-28 257 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