2012-10-02 159 views
1

對於list1,選擇'ok'將會運行,即使select 1/0生成一個錯誤。對於列表2,選擇'ok'將不會運行,因爲更新失敗。這兩個列表都會生成級別爲16的錯誤,但爲什麼會有這種差異?批處理sql服務器錯誤

--1 
select 1/0 
select 'ok' 

--2 
create table #t (a int) 
insert into #t values(1) 

update #t set b = 99 
select 'ok' 

回答

3

update #t set b = 99是編譯時錯誤。

該批處理被編譯並且#t不存在,該語句受到延遲編譯的影響。甚至不可能爲此語句生成計劃來更新不存在的列,因此該語句中存在編譯錯誤。

運行時編譯錯誤中止範圍。

運行時錯誤會產生什麼影響並不總是直觀的(放棄語句,範圍,批處理或連接)。有關示例,請參見What Happens when an Error Occurs?。對於list2,

+0

也沒有編譯錯誤。這兩個列表在運行代碼時都會產生錯誤。但答覆中的鏈接似乎很好。我在讀它。乾杯。 – thotwielder

+0

@thotwielder - 錯誤**是**編譯時錯誤。通過創建臨時表,然後嘗試爲語句更新'#t set b = 99'生成一個估計執行計劃,可以知道這一點。我想你錯過了我寫的關於**延期**編譯的內容。 –

+0

是的,我想知道爲什麼SQL Server將在列表1中的錯誤後繼續。現在看起來有道理。謝謝。 – thotwielder