2010-06-10 122 views
-1

這裏是我的配置:SQL Server Management Studio(或SQL Server)是否評估* all *表達式?

  • 我有,我用它來更新我的數據庫重新運行的批處理腳本。
  • 內部的批處理腳本,我有一些代碼說以下內容:
    • 如果表「A」不存在,然後創建表「A」和插入行到它。
  • 稍後在該批處理腳本中,我在該表上創建了一個架構綁定的索引視圖
  • 有時,當我重新運行該腳本,這是表創建後,SQL Server Management Studio中評估「插入行」的代碼,這是由「如果此表沒有按保護'T存在' 代碼,併產生以下錯誤:

    消息1934年,級別16,狀態1,行15 INSERT失敗,因爲下列SET選項的設置不正確: 'CONCAT_NULL_YIELDS_NULL,ANSI_WARNINGS,ANSI_PADDING,ARITHABORT'。驗證SET選項是否適用於計算列和/或過濾索引和/或查詢通知和/或XML數據類型方法和/或空間索引操作的索引視圖和/或索引。

  • 請注意:如果有人在真空中試用此INSERT語句,我會完全期望 SSMS產生此錯誤。
    • 但是不是當它受到條件塊的保護時。

我的問題:

Does the SSMS compiler evaluate all expressions, regardless of whether they will actually be executed?

+0

如果使用SQL'請Server'來看看我的回答對[失敗,因爲不正確ARITHABORT設置](http://stackoverflow.com/questions/35140159/failed-because-incorrect-arithabort-setting/35750269# 35750269)頁面。希望這可以幫助... – 2016-03-02 14:43:00

回答

0

是的,它評估所有的人,看看這個

declare @i int 
select @i =1 

if @i = 1 
begin 
    declare @i2 int 
    set @i2 = 5 
end 
else 
begin 
    declare @i2 int 
    set @i2 = 5 
end 

消息134,級別15,狀態1,行12 變量名'@ i2'已被聲明。變量名稱在查詢批處理或存儲過程中必須是唯一的。

與臨時表的另一個例子是在這裏:What is deferred name resolution and why do you need to care?

你唯一的出路是把它包起來的動態SQL內

-1

注意,大多數你提到的設置是連接級別,即如果你設置/更改它們將保持有效,除非您關閉連接或明確更改其值。

回到你的問題。您提到的錯誤看起來像運行時錯誤,即INSERT實際上正在執行。如果你能顯示你的腳本(省略細節,但保留批次)會更好。

編輯:它不是評估您嘗試執行的SQL的SSMS編譯器 - 它是SQL Server。 「評估」是什麼意思?它是'執行'?當你運行一個批處理時(這實際上是由服務器執行的),SQL Server首先進行句法分析,並在發現任何錯誤時拋出錯誤,因爲它在這個時間點沒有執行任何操作。在語法正常的情況下,服務器開始執行批處理。

同樣,您顯示錯誤似乎是運行 - 所以我想你仔細觀察的條件和跟蹤發生了什麼(或向我們提供關於「有時」有詳細介紹)。

相關問題