【问题标题】:Is there a way to check NOEXEC state?有没有办法检查 NOEXEC 状态?
【发布时间】:2019-05-07 15:47:55
【问题描述】:

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

我有一堆以 IF 开头的脚本,如果该 IF 为 True,则 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 上有两条“完成打印”消息,但除非我执行 SET NOEXEC OFF,否则我只会从第一条消息中得到打印

【问题讨论】:

  • when I execute any script after NOEXEC has been set to ON it wont run - 这有点像 noexec。如果您不想要这种行为,为什么要首先使用它?
  • 脚本在哪里,您如何运行它,您期望的行为是什么以及实际行为是什么? ADO.NET 中没有 ConnectionContext 表明您正在使用 SQLCLR。为什么?
  • 好吧,我表达得很糟糕!我将编辑问题
  • a) 为每个脚本使用单独的连接。 b) 在您打开它的每个脚本的末尾关闭 noexec。
  • noexec 的问题在于,当它打开时,如果您发出一个假定获取其当前状态的 sql 命令,它不会执行,因为 noexec 已打开。因此,虽然有一种方法可以query the current SET flags,但没有一种方法可以用于 noexec。

标签: sql-server vb.net sql-server-2008-r2


【解决方案1】:

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

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

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

你可以:

  • 为每个脚本使用一个新的连接对象
  • 在您打开它的每个脚本的末尾打开noexec off
  • 执行一个假人select 1。如果您返回 1,则 noexec 已关闭。

【讨论】:

    【解决方案2】:

    奇怪的是,您需要使用矛盾来找出答案。

    当 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”消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 2015-03-27
      • 1970-01-01
      • 2020-01-09
      • 2011-12-21
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多