出處: 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)配置信息,通過該元數據函數,你能知曉用戶會話的配置設置,
也可以確保代碼運行符合設想而開啟或關閉某個選項。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
