当我编写一些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)受影响)
尽管这可能不是您问题的答案:
但是当你删除的时候
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它们添加到批处理计划中。
| 归档时间: |
|
| 查看次数: |
1673 次 |
| 最近记录: |