zoukankan      html  css  js  c++  java
  • 在SQLSERVER中,决定当前会话的SET配置(翻译)

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

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

  • 相关阅读:
    [UWP]实现Picker控件
    [UWP]合体姿势不对的HeaderedContentControl
    [UWP]新控件ColorPicker
    [UWP]使用Acrylic(亚克力)
    [UWP]使用Reveal
    [工具]我怎么使用思维导图
    python数据分析师面试题选
    R %operator% 含义
    R中将list类型数据转换成data.frame型
    用R在字符串中提取匹配的部分
  • 原文地址:https://www.cnblogs.com/fly_zj/p/1772818.html
Copyright © 2011-2022 走看看