SET NOEXEC ON 和 SET PARSEONLY ON 有什么区别?

cos*_*sta 3 sql-server

目前,SQL Server 支持以下语句:SET NOEXECSET PARSEONLY

从文档中:

将 NOEXEC 设置为开:

当 SET NOEXEC 为 ON 时,SQL Server 编译每批 Transact-SQL 语句,但不执行它们。

将 PARSEONLY 设置为:

当 SET PARSEONLY 为 ON 时,SQL Server 仅解析语句。

我想这是“编译”与“解析”。“编译”应该包括“解析”。

如果我想验证 SQL 脚本的正确性,我应该使用哪一个?我倾向于回答:SET NOEXEC ON

但是编译还有什么作用呢?“编译”是否意味着创建/修改执行计划?是否检查对象的存在?

如果您有以下情况会发生什么:

SET NOEXEC ON
SET PARSEONLY OFF
Run Code Online (Sandbox Code Playgroud)

我发现这两种选择都令人困惑。

谢谢

Dav*_*oft 8

运行批处理分为三个步骤:

  1. 解析
  2. 编译
  3. 执行

PARSEONLY 在步骤 1) 后停止。NOEXEC 在步骤 2) 后停止,但 NOEXEC 支持延迟名称解析,并且如果目标表不存在也不会失败。

当 SET NOEXEC 为 ON 时,SQL Server 编译每批 Transact-SQL 语句,但不执行它们。

诺执行

当 SET PARSEONLY 为 ON 时,SQL Server 仅解析语句。当 SET PARSEONLY 为 OFF 时,SQL Server 编译并执行该语句。

帕森利