有没有办法检查 NOEXEC 状态?

Is there a way to check NOEXEC state?

我已经搜索了一段时间,但找不到任何可以入手的内容。如果这是重复的,我深表歉意,但也许我在谷歌搜索时使用的关键字不是最好的。

我有一堆以 IF 开头的脚本,如果 IF 为真,则 NOEXEC 标志设置为 ON

像这样

if TRUE
BEGIN
    SET NOEXEC ON;  
END

问题是当我在 NOEXEC 设置为 ON 后执行任何脚本时它不会 运行。我已经测试过,如果我 SET NOEXEC OFF 其余脚本 运行 没有问题。

server.ConnectionContext.ExecuteNonQuery(script)

我是否必须检查 NOEXEC 的状态,还是应该将它附加到我所有脚本的开头?

谢谢大家

编辑:更好地解释问题的脚本示例

1º 剧本

select * from List
print'Done printing'

2º 剧本

SET NOEXEC ON;
select * from List
print'Won't print'

3º 剧本

select * from List
print'Done printing'

我的预期结果是在我的 FileInfoMessage 上有两条 'Done printing' 消息,但除非我执行 SET NOEXEC OFF,否则我只会从第一条消息中获取打印信息

set noexec on 停止执行 SQL 命令,直到遇到 set noexec off

如果有一个命令获取 noexec 的当前状态,它也不会执行,因为 noexec 会打开。如果它确实执行了,那就意味着 noexec 已关闭。

可以说,设计团队可以想出另一个 "special" 命令绕过 noexec on 状态并无论如何执行(就像 set noexec off 那样),为您提供当前状态noexec 个。据我所知,这样的命令不存在,所以虽然有 query the current SET flags 的方法,但没有用于 noexec 的方法。

您可以:

  • 为每个脚本使用一个新的连接对象
  • 在每个脚本末尾打开 noexec off
  • 执行虚拟 select 1。如果你 1 回来了,noexec 就关闭了。

奇怪的是,你需要使用矛盾才能找出来。

当 NOEXEC 开启时,不执行 IF 语句的参数,而是始终计算为 TRUE。所以“IF 1=0”是一个足够好的矛盾来检测这一点。


-- Try one or the other of these statements
SET NOEXEC ON;
-- SET NOEXEC OFF;

IF 1=0
BEGIN
    SET NOEXEC OFF
    PRINT 'noexec was on'
    SET NOEXEC ON
END
ELSE
BEGIN
    PRINT 'noexec was off'
END

请注意,我们必须暂时关闭 NOEXEC,这样我们才能打印“noexec was on”消息。