2012-05-10 46 views
11

雖然我寫了一些T-SQL查詢與NOEXEC ON,我經歷過的SQL Server有趣的行爲,我很好奇爲什麼會發生。有時候,我只拿到有趣的行爲「NOEXEC ON」

命令已成功。

如我期望的消息,但有時我得到的一個或多個

(影響0行(S))

消息。

我知道SET NOEXEC ON命令編譯查詢,但不執行它,所以我覺得我不應該得到任何

(0受影響行(S))

消息。

在第一個例子,一切看起來都很正常。

SET NOEXEC ON 
INSERT INTO Test (column1) VALUES ('etc') 

結果:

命令已成功。

但在第二個例子中,我覺得不順心的事...

SET NOEXEC ON 
DELETE FROM Test 

結果:

(0行(或多個)受影響)

在我用臨時表中的第三示例:

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 

SET NOEXEC ON 
INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

結果:

(0行(S)的影響)

最後我只GO添加到我的查詢,我認爲結果很有趣

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 
SET NOEXEC ON 
GO 

INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

結果:

(0行( s)受影響)

(0 row(s)affected)

+0

嗯,我無法重載任何情況,我得到「(0 row(s)affected)」。無論是在Denali還是在SQL Server 2008中。您是否僅僅使用SSMS執行這些SQL文本而沒有任何特殊選項或操作? – usr

+0

是的,我在SQL Server 2008 R2上使用SSMS執行這些SQL文本,但沒有使用任何特殊選項。 – ogun

回答

2

雖然這可能不是回答你的問題:

但是,當你刪除

SET NOEXEC ON 
DELETE FROM Test 

如果WHERE條件添加到DELETE聲明像DELETE FROM Test WHERE COLUMN1='etc'

您將得到期望的結果......這種行爲可能是由於我們執行的DDL和DML語句。

我也分析了其中如果在臨時表中插入它給你(0行受影響),但如果同樣的刀片是在某些數據庫或永久表做它給(命令已成功完成了第三種情況。)

這可能是因爲臨時表和永久表。

對於您所添加的第四之一GO

GO將執行相關的SQL命令n次。

因此,如果您單獨執行INSERT語句和DELETE語句都具有一定的返回值和GO在批次計劃加入他們。

1

我複製SQL Server 2005和在2008年的行爲,因此心不是exclusivelly對R2和與插入發生,與該更新statment發生同樣的事情,所以刪除似乎是例外。即使截斷(這幾乎是刪除得到標準的消息)

我也認爲它可能是一個SQL Server管理工作室的事情,但沒有,我測試了另一個工具,甚至在SQLCMD上運行它,可以看到相同的行爲:

enter image description here

除了 「命令已成功。」消息不會出現(這必須是SSMS專有的)

無論如何,我無法解釋,但我可以猜測。 我想象會發生這種情況,因爲delete語句會執行其他操作(或更少),插入和更新不會。編譯過程分爲四個部分:解析,規範化,編譯和優化。我認爲這些步驟中的某些內容是通過刪除語句完成的,這就是爲什麼我們得到不同結果的原因

+0

感謝您的關注。我不認爲我們會找到答案,除非看到SQL Server代碼... – ogun

+0

是啊我認爲這是不可能的:)我不知道是否有人可以提交這個作爲一個「bug」?或者至少在某處進行解釋 – Diego