出处: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'
上面代码执行的结果为:
说明:@@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'
上面代码执行的结果为:
看看当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'
上面代码运行的结果为:
已经排除QUOTED_IDENTIFIER选项了。
总结
这个简单的元数据函数(@@OPTIONS)能够给你非常多的有关当前会话(Session)配置信息,通过该元数据函数,你能知晓用户会话的配置设置,
也可以确保代码运行符合设想而开启或关闭某个选项。