"NOEXEC ON"中的有趣行为

ogu*_*gun 12 t-sql sql-server

当我编写一些T-SQL查询时NOEXEC ON,我遇到了SQL Server的有趣行为,我很好奇它为什么会发生.有时我只得到

命令成功.

我预期的消息,但有时我得到一个或多个

(0行(s)受影响)

消息.

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

(0行(s)受影响)

消息.

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

SET NOEXEC ON
INSERT INTO Test (column1) VALUES ('etc')
Run Code Online (Sandbox Code Playgroud)

结果:

命令成功.

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

SET NOEXEC ON
DELETE FROM Test
Run Code Online (Sandbox Code Playgroud)

结果:

(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
Run Code Online (Sandbox Code Playgroud)

结果:

(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
Run Code Online (Sandbox Code Playgroud)

结果:

(0行(s)受影响)

(0行(s)受影响)

Pra*_*tik 2

尽管这可能不是您问题的答案:

但是当你删除的时候

SET NOEXEC ON 
DELETE FROM Test 
Run Code Online (Sandbox Code Playgroud)

如果您向 STATENT 添加一个 where 条件,DELETE例如DELETE FROM Test WHERE COLUMN1='etc'

您将得到期望的结果...此行为可能是由于我们执行的 DDL 和 DML 语句造成的。

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

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

对于第四个,您添加了GO

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

因此,如果您单独执行插入语句和删除语句都有一些返回值并将GO它们添加到批处理计划中。