“NOEXEC ON”中的有趣行为

时间:2012-05-10 14:58:25

标签: sql-server tsql

当我用NOEXEC ON编写一些T-SQL查询时,我遇到了SQL Server的有趣行为,我很好奇为什么会发生这种情况。有时我只有

  

命令成功。

消息正如我所料,但有时我得到一个或多个

  

(0行(s)受影响)

消息。

我知道SET NOEXEC ON命令编译查询但不执行它,所以我想我不应该得到任何

  

(0行(s)受影响)

消息。

在第一个例子中,一切看起来都很正常。

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

结果:

  

命令成功。

但是在第二个例子中,我认为出了问题......

SET NOEXEC ON
DELETE FROM Test

结果:

  

(0行(s)受影响)

在第三个例子中,我使用了临时表:

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行(s)受影响)

2 个答案:

答案 0 :(得分:2)

虽然这可能不是您问题的答案:

但是当你删除

SET NOEXEC ON 
DELETE FROM Test 

如果您在DELETE

DELETE FROM Test WHERE COLUMN1='etc'语句中添加where条件

您将获得所需的结果......此行为可能是因为我们执行了DDL和DML语句。

我还分析了第三种情况,如果你在临时表中插入它会给你(0行受影响),但如果在某个数据库或永久表上完成相同的插入,它会给出(命令已成功完成)。 )

这可能是因为临时表和永久表。

对于第4个,您添加了GO

GO将执行相关的sql命令n次。

因此,如果单独执行insert语句,delete语句都有一些返回值,GO正在批量计划中添加它们。

答案 1 :(得分:1)

我重现了SQl Server 2005和2008上的行为,因此它并不是唯一的R2,并且与插入相同的事情发生在更新语句中,因此删除似乎是例外。甚至Truncate(这几乎都是删除标准消息)

我还认为它可能是一个SQL Server Management Studio的东西但是没有,我在另一个工具上测试过,甚至在SQLCMD上运行它并且可以看到相同的行为:

enter image description here

除了“命令成功”。消息未出现(这必须完全是SSMS)

无论如何,我无法解释,但我可以猜到。 我想这是因为delete语句执行了Insert和Update不执行的其他操作(或更少)。编译过程分为四个部分:解析,规范化,编译和优化。我假设这些步骤中的某些内容由delete语句以不同方式完成,这就是我们得到不同结果的原因