.net 在SQL Server中,SESSIONPROPERTY和@选项之间有什么区别?

.net 在SQL Server中,SESSIONPROPERTY和@选项之间有什么区别?,.net,sql-server,.net,Sql Server,在.Net应用程序中,如果执行以下操作,则值不匹配: SELECT SESSIONPROPERTY('ARITHABORT'), CASE WHEN (@@OPTIONS & 64) = 64 THEN 1 ELSE 0 END 我的印象是SESSIONPROPERTY和@OPTIONS将生成相同的结果。在我的例子中,SESSIONPROPERTY返回0,@@OPTIONS返回1 哪个更准确,为什么?我同意Jeroen的观点……它不是针对.Net的。@@选项反映了连

在.Net应用程序中,如果执行以下操作,则值不匹配:

SELECT 
    SESSIONPROPERTY('ARITHABORT'), 
    CASE WHEN (@@OPTIONS & 64) = 64 THEN 1 ELSE 0 END
我的印象是SESSIONPROPERTY和@OPTIONS将生成相同的结果。在我的例子中,SESSIONPROPERTY返回0,@@OPTIONS返回1


哪个更准确,为什么?

我同意Jeroen的观点……它不是针对.Net的。@@选项反映了连接中的内容,而SESSIONPROPERTY不反映。打开跟踪以查看连接上发生了什么,您将看到.Net默认连接的功能:

在运行命令之前,我已经完成了相同的设置:

alter database [thedatabase] set arithabort on with no_wait
…我的测试线束是:

using ( var conn = new SqlConnection( "Data Source=.;Initial Catalog=thedatabase;Integrated Security=True" ) )
{
  conn.Open( );
  using ( var cmd = conn.CreateCommand( ) )
  {
    cmd.CommandText = "SELECT SESSIONPROPERTY( 'ARITHABORT' ), CASE WHEN(@@OPTIONS &64) = 64 THEN 1 ELSE 0 END";
    cmd.CommandType = System.Data.CommandType.Text;
    using ( var reader = cmd.ExecuteReader( ) )
    {
      while ( reader.Read( ) )
      {
        Console.WriteLine( "{0},{1}", reader[ 0 ], reader[ 1 ] );
      }
    }
  }
}

有人怀疑这是一个bug……还是仅仅是一个松鼠文档。

根据文档,它们应该是相同的。我觉得我们在这里遗漏了一块拼图。什么版本的.NET和SQL Server?.NET 4.7.1和SQL Server 2014,而且非常清楚,我已经修改了ARITHABORT的数据库默认设置,使用:ALTER database[theDb]将ARITHABORT设置为ON,不需要等待,我启动了我的.Net应用程序,并观察到了我在问题中提到的困惑。一个更好的问题是你认为设置DB默认值将实现什么。对于任何现代客户来说,正确的答案都是毫无意义的。如果一切都是默认的,你甚至不会注意到这一点——尽管SESSIONPROPERTY的行为很奇怪;在选择之前,这些值将匹配。没有可以想象的理由,也没有很好的理由解释为什么登录握手中传递的选项位应该与显式设置的选项不同。也就是说,有一点可能它不是一个完整的bug,而是一个兼容性缺陷。如果它要改变,你可以想象20年前的一些古老的业务关键型应用程序会出现这种情况。关于兼容性缺陷的观点很好。无论哪种方式,SESSIONPROPERTY都是被阻塞的接口,这太糟糕了。它在形式上与OBJECTPROPERTY和COLUMNPROPERTY等API保持一致。对于像我这样的老极客来说,@@@OPTIONS界面似乎是合理的,但对我来说却是一个过时的界面。如果我关心集合的状态,我相信我会更喜欢SESSIONPROPERTY。我接受这个答案,因为它解释了@Options更准确,并说明了原因。我很想解释一下根本原因——但这远远超出了我问题的范围。我同意这可能是一些20年来没人碰过的旧代码。