当我用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)受影响)
答案 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上运行它并且可以看到相同的行为:
除了“命令成功”。消息未出现(这必须完全是SSMS)
无论如何,我无法解释,但我可以猜到。 我想这是因为delete语句执行了Insert和Update不执行的其他操作(或更少)。编译过程分为四个部分:解析,规范化,编译和优化。我假设这些步骤中的某些内容由delete语句以不同方式完成,这就是我们得到不同结果的原因