在SQLSERVER中,决定当前会话的SET配置(翻译)[转]

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

出处: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)配置信息,通过该元数据函数,你能知晓用户会话的配置设置,

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



    本文转自 Fanr_Zh 博客园博客,原文链接:http://www.cnblogs.com/Amaranthus/archive/2012/10/27/2742786.html,如需转载请自行联系原作者





相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
9月前
|
SQL 数据库 Windows
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
116 0
QGS
|
11月前
|
SQL 编译器 数据库连接
Centos7配置ODBC连接SQL server数据库
yum install unixODBC unixODBC-devel 如有错误请指正,谢谢
QGS
389 0
|
数据可视化 jenkins 关系型数据库
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
497 0
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
|
SQL Java 数据库连接
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
256 0
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
|
SQL C# 数据库
C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大
原文:C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大 数据库自动备份服务,带配置,还算可以吧 周末抽时间,编写了一个这样的工具,可以让,对数据库不了解或不熟悉的人,直接学会使用备份,省时省力,同样,我也将一份,通过脚本进行备份的,也奉献上来, 通过sql脚本进行数据库备份...
1357 0
|
SQL 存储
sql server 2005 链接服务器:未将服务器 配置为用于 RPC
原文:sql server 2005 链接服务器:未将服务器 配置为用于 RPC  RPC: 远程过程调用(Remote Procedure Calls) --LinkedServer.Rpc 属性: --获取或设置 Boolean 属性值,该值指定链接服务器是否支持远程过程调用 (RPC)。
1777 0
|
SQL 数据库 数据安全/隐私保护
SQL SERVER 2008R2安装与配置
应用场景 当需要使用SQL Server数据库的时候,需要在服务器上安装SQL Server数据库,那么操作步骤如下所示。
1463 0
|
SQL 安全
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。
转自 http://www.cnblogs.com/wayne-ivan/archive/2008/01/07/1028759.html   SELECT * INTO XLImport3 FROM OPENDATASOURCE('Microsoft.
1012 0