在SQLSERVER中,决定当前会话的SET配置

系统 1658 0

出处: http://www.cnblogs.com/fly_zj/archive/2010/07/07/1772818.html

原文为 Determining SET Options for a Current Session in SQL Server

 

问题?

对于每个连接到SQLSERVER上的会话(Session),用户能够设置SET选项来影响查询的结果和SQLSERVER潜在的行为,有些选项能通过GUI来设置,有些需要

通过SET 命令来设置,使用GUI非常方便知道某个设置开启与否,但是怎样获取当前会话的所有选项设置呢?

 

解决方案

SQLSERVER 提供许多内建的元数据函数,其中一个是@@OPTIONS,能获取当前会话(session)的当前值。每个成功的连接都会有一个默认的值,其值也能

被其它线程覆写。

下面这张表列出每个配置选项对应的值,及其详细的描述(摘录自SQLSERVER 2005帮助文档)

 

配置

说明

1

DISABLE_DEF_CNST_CHK

控制临时或延迟约束检查。

2

IMPLICIT_TRANSACTIONS

对于 DBLIB 网络库连接,控制执行语句时是否隐式启动事务。

IMPLICIT_TRANSACTIONS 设置对 ODBC 或 OLEDB 连接没有影响。

4

CURSOR_CLOSE_ON_COMMIT

控制执行提交操作后游标的行为。

8

ANSI_WARNINGS

控制聚合警告中的截断和 NULL。

16

ANSI_PADDING

控制固定长度变量的填充。

32

ANSI_NULLS

使用相等运算符时控制 NULL 处理。

64

ARITHABORT

在查询执行过程中出现溢出或被零除错误时终止查询。

128

ARITHIGNORE

在查询过程中出现溢出或被零除错误时返回 NULL。

256

QUOTED_IDENTIFIER

对表达式进行求值时区别单引号和双引号。

512

NOCOUNT

关闭执行每个语句后返回的报告受影响的行数的消息。

1024

ANSI_NULL_DFLT_ON

将会话的行为更改为使用 ANSI 兼容的空性。未显式定义为空性的新列允许使用空值。

2048

ANSI_NULL_DFLT_OFF

将会话的行为更改为不使用 ANSI 兼容的空性。未显式定义为空性的新列不允许使用空值。

4096

CONCAT_NULL_YIELDS_NULL

将 NULL 值与字符串串联时返回 NULL。

8192

NUMERIC_ROUNDABORT

表达式中出现精度降低时生成错误。

16384

XACT_ABORT

如果 Transact-SQL 语句产生运行时错误,则回滚事务。

 

 

在前一章 Reproducing Query Execution Plan Performance Problems 中谈到了SET 选择是如何影响到查询结果和性能的,所以SET 命令对于当前会话的设置非常

有用,为了得到当前会话的配置值,可以运行如下的SELECT语句

        
          SELECT
        
         @@OPTIONS
      
    
      该语句会返回一整形值代表上表格中所有选项值的
      
      。为了更好的理解这整形值的含义,可运行接下来的按位与操作,看看哪个SET选项被开启:
    
  
        
          DECLARE
        
         @options 
        
          INT
        
        
          SELECT
        
         @options = @@OPTIONS




        
          PRINT
        
         @options


        
          IF
        
         ( (1 & @options) = 1 ) 
        
          PRINT
        
         '
        
          DISABLE_DEF_CNST_CHK
        
        '


        
          IF
        
         ( (2 & @options) = 2 ) 
        
          PRINT
        
         '
        
          IMPLICIT_TRANSACTIONS
        
        '


        
          IF
        
         ( (4 & @options) = 4 ) 
        
          PRINT
        
         '
        
          CURSOR_CLOSE_ON_COMMIT
        
        '


        
          IF
        
         ( (8 & @options) = 8 ) 
        
          PRINT
        
         '
        
          ANSI_WARNINGS
        
        '


        
          IF
        
         ( (16 & @options) = 16 ) 
        
          PRINT
        
         '
        
          ANSI_PADDING
        
        '


        
          IF
        
         ( (32 & @options) = 32 ) 
        
          PRINT
        
         '
        
          ANSI_NULLS
        
        '


        
          IF
        
         ( (64 & @options) = 64 ) 
        
          PRINT
        
         '
        
          ARITHABORT
        
        '


        
          IF
        
         ( (128 & @options) = 128 ) 
        
          PRINT
        
         '
        
          ARITHIGNORE
        
        '


        
          IF
        
         ( (256 & @options) = 256 ) 
        
          PRINT
        
         '
        
          QUOTED_IDENTIFIER
        
        '


        
          IF
        
         ( (512 & @options) = 512 ) 
        
          PRINT
        
         '
        
          NOCOUNT
        
        '


        
          IF
        
         ( (1024 & @options) = 1024 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_ON
        
        '


        
          IF
        
         ( (2048 & @options) = 2048 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_OFF
        
        '


        
          IF
        
         ( (4096 & @options) = 4096 ) 
        
          PRINT
        
         '
        
          CONCAT_NULL_YIELDS_NULL
        
        '


        
          IF
        
         ( (8192 & @options) = 8192 ) 
        
          PRINT
        
         '
        
          NUMERIC_ROUNDABORT
        
        '


        
          IF
        
         ( (16384 & @options) = 16384 ) 
        
          PRINT
        
         '
        
          XACT_ABORT
        
        ' 
      

 

上面代码执行的结果为:

 

QQ截图未命名

 

说明:@@OPTIONS返回5496,接下来每行的是当前会话(Session)开启的配置选项。

当我们设置SET NOCOUNT ON,其比特值(bit value)是512,来看看@@OPTIONS值的变化,现在的值为5496+512=6008.运行如下的代码:

 

        
          SET
        
         NOCOUNT 
        
          ON
        
        
          DECLARE
        
         @options 
        
          INT
        
        
          SELECT
        
         @options = @@OPTIONS




        
          PRINT
        
         @options


        
          IF
        
         ( (1 & @options) = 1 ) 
        
          PRINT
        
         '
        
          DISABLE_DEF_CNST_CHK
        
        '


        
          IF
        
         ( (2 & @options) = 2 ) 
        
          PRINT
        
         '
        
          IMPLICIT_TRANSACTIONS
        
        '


        
          IF
        
         ( (4 & @options) = 4 ) 
        
          PRINT
        
         '
        
          CURSOR_CLOSE_ON_COMMIT
        
        '


        
          IF
        
         ( (8 & @options) = 8 ) 
        
          PRINT
        
         '
        
          ANSI_WARNINGS
        
        '


        
          IF
        
         ( (16 & @options) = 16 ) 
        
          PRINT
        
         '
        
          ANSI_PADDING
        
        '


        
          IF
        
         ( (32 & @options) = 32 ) 
        
          PRINT
        
         '
        
          ANSI_NULLS
        
        '


        
          IF
        
         ( (64 & @options) = 64 ) 
        
          PRINT
        
         '
        
          ARITHABORT
        
        '


        
          IF
        
         ( (128 & @options) = 128 ) 
        
          PRINT
        
         '
        
          ARITHIGNORE
        
        '


        
          IF
        
         ( (256 & @options) = 256 ) 
        
          PRINT
        
         '
        
          QUOTED_IDENTIFIER
        
        '


        
          IF
        
         ( (512 & @options) = 512 ) 
        
          PRINT
        
         '
        
          NOCOUNT
        
        '


        
          IF
        
         ( (1024 & @options) = 1024 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_ON
        
        '


        
          IF
        
         ( (2048 & @options) = 2048 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_OFF
        
        '


        
          IF
        
         ( (4096 & @options) = 4096 ) 
        
          PRINT
        
         '
        
          CONCAT_NULL_YIELDS_NULL
        
        '


        
          IF
        
         ( (8192 & @options) = 8192 ) 
        
          PRINT
        
         '
        
          NUMERIC_ROUNDABORT
        
        '


        
          IF
        
         ( (16384 & @options) = 16384 ) 
        
          PRINT
        
         '
        
          XACT_ABORT
        
        ' 
      


上面代码执行的结果为:

QQ截图未命名

 

看看当SET NOCOUNT ON ,SET QUOTED_IDENTIFIFER OFF的结果

        
          SET
        
         NOCOUNT 
        
          ON
        
        
          SET
        
         QUOTED_IDENTIFIER 
        
          OFF
        
        
          DECLARE
        
         @options 
        
          INT
        
        
          SELECT
        
         @options = @@OPTIONS




        
          PRINT
        
         @options


        
          IF
        
         ( (1 & @options) = 1 ) 
        
          PRINT
        
         '
        
          DISABLE_DEF_CNST_CHK
        
        '


        
          IF
        
         ( (2 & @options) = 2 ) 
        
          PRINT
        
         '
        
          IMPLICIT_TRANSACTIONS
        
        '


        
          IF
        
         ( (4 & @options) = 4 ) 
        
          PRINT
        
         '
        
          CURSOR_CLOSE_ON_COMMIT
        
        '


        
          IF
        
         ( (8 & @options) = 8 ) 
        
          PRINT
        
         '
        
          ANSI_WARNINGS
        
        '


        
          IF
        
         ( (16 & @options) = 16 ) 
        
          PRINT
        
         '
        
          ANSI_PADDING
        
        '


        
          IF
        
         ( (32 & @options) = 32 ) 
        
          PRINT
        
         '
        
          ANSI_NULLS
        
        '


        
          IF
        
         ( (64 & @options) = 64 ) 
        
          PRINT
        
         '
        
          ARITHABORT
        
        '


        
          IF
        
         ( (128 & @options) = 128 ) 
        
          PRINT
        
         '
        
          ARITHIGNORE
        
        '


        
          IF
        
         ( (256 & @options) = 256 ) 
        
          PRINT
        
         '
        
          QUOTED_IDENTIFIER
        
        '


        
          IF
        
         ( (512 & @options) = 512 ) 
        
          PRINT
        
         '
        
          NOCOUNT
        
        '


        
          IF
        
         ( (1024 & @options) = 1024 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_ON
        
        '


        
          IF
        
         ( (2048 & @options) = 2048 ) 
        
          PRINT
        
         '
        
          ANSI_NULL_DFLT_OFF
        
        '


        
          IF
        
         ( (4096 & @options) = 4096 ) 
        
          PRINT
        
         '
        
          CONCAT_NULL_YIELDS_NULL
        
        '


        
          IF
        
         ( (8192 & @options) = 8192 ) 
        
          PRINT
        
         '
        
          NUMERIC_ROUNDABORT
        
        '


        
          IF
        
         ( (16384 & @options) = 16384 ) 
        
          PRINT
        
         '
        
          XACT_ABORT
        
        ' 
      


上面代码运行的结果为:

QQ截图未命名

已经排除QUOTED_IDENTIFIER选项了。

 

总结

这个简单的元数据函数(@@OPTIONS)能够给你非常多的有关当前会话(Session)配置信息,通过该元数据函数,你能知晓用户会话的配置设置,

也可以确保代码运行符合设想而开启或关闭某个选项。

在SQLSERVER中,决定当前会话的SET配置


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论