2014-02-22 71 views
0

我最近在我的一個查詢中使用了IDENTITY_INSERT。在閱讀SQL服務器文檔IDENTITY_INSERThttp://technet.microsoft.com/en-us/library/aa259221%28v=sql.80%29.aspx,有這樣一行說,爲什麼IDENTITY_INSERT被設置爲執行或運行時而不是解析時?

SET IDENTITY_INSERT的設置被設定在執行或運行時,而不是在分析時。

想知道,爲什麼IDENTITY_INSERT在運行時設置不在解析時間?如果以其他方式完成,會有什麼影響?

回答

2

如果在解析時完成,則無法在單個批次中爲多個表打開它。由於它在運行時處理,您可以在單個批處理中打開和關閉多個表。由於您一次只能爲一個表啓用該設置,這非常重要。

+0

這不回答'爲什麼IDENTITY_INSERT設置在運行時不在解析時間'的問題。他實質上是問爲什麼優化器在解析命令時不放棄,而不是在運行時炸掉 – gh9

+0

當你真的想到它時,確實如此。解析器和優化器不知道可能被插入到表中的值,所以它不會在優化時爆炸,當它必須強制執行PK或檢查約束定義時,它會在實際執行時炸掉。執行會失敗,但解析語句應該通過,因爲這不需要實際執行數據有效性的約束。優化器/解析器不必將IDENTITY_INSERT設置爲ON/OFF,以驗證INSERT語句以任何方式正確形成。 –

+0

你的評論回答了這個問題,但答案是「打開多個批次插入的能力」並不能真正回答這個問題。 – gh9

-2

原因是當你解析sql查詢時,你正在驗證sql是正確的。

有幾個階段來執行一個SQL查詢

1)解析器(其中你的問題) - 這一階段是在SQL驗證。把它看作看一句話,並說結構是正確的。在這一點上你真的不關心它的邏輯。

2)代數器 - 這是sql綁定到基礎sql服務器對象的地方。再一次,優化器不關心邏輯,它只關心所有對象綁定在一起。這也是二進制樹形成的位置,它是爲sql 3)探索 - 這是收集查詢和優化器尋找足夠好的計劃(再次邏輯未被關注)

4)執行。這裏是你的邏輯錯誤的地方。因此,爲什麼你在運行時看到它,而不是解析時間。因爲這裏的邏輯實際上是測試

相關問題