Sql-Server

確定 ANSI_DEFAULTS 設置為 ON 還是 OFF?

  • June 16, 2016

如何確定我的伺服器上是否啟用了 ANSI_DEFAULTS。我的伺服器正在使用 IMPLICIT 事務和一種可以根據 ANSI_DEFAULTS 設置影響它的方式。

如何確定 ANSI_DEFAULTS 的狀態?

ANSI_DEFAULTS並不是一個真正獨特的選項,而是其他幾個基於會話的選項的邏輯分組:

  1. IMPLICIT_TRANSACTIONS
  2. CURSOR_CLOSE_ON_COMMIT
  3. ANSI_WARNINGS
  4. ANSI_PADDING
  5. ANSI_NULLS
  6. QUOTED_IDENTIFIER
  7. ANSI_NULL_DFLT_ON

您可以使用@@OPTIONS配置函式來獲取目前會話設置的位遮罩值,其值在配置使用者選項伺服器配置選項MSDN 頁面上進行了說明。

將這些元素放在一起可以獲得以下查詢,該查詢確定“ansi_defaults”選項組的目前會話設置:

SELECT @@OPTIONS AS [user_options],
      CASE WHEN @@OPTIONS & 2 = 2 THEN 'ON' ELSE 'OFF' END AS [implicit_transactions],
      CASE WHEN @@OPTIONS & 4 = 4 THEN 'ON' ELSE 'OFF' END AS [cursor_close_on_commit],
      CASE WHEN @@OPTIONS & 8 = 8 THEN 'ON' ELSE 'OFF' END AS [ansi_warnings],
      CASE WHEN @@OPTIONS & 16 = 16 THEN 'ON' ELSE 'OFF' END AS [ansi_padding],
      CASE WHEN @@OPTIONS & 32 = 32 THEN 'ON' ELSE 'OFF' END AS [ansi_nulls],
      CASE WHEN @@OPTIONS & 256 = 256 THEN 'ON' ELSE 'OFF' END AS [quoted_identifier],
      CASE WHEN @@OPTIONS & 1024 = 1024 THEN 'ON' ELSE 'OFF' END AS [ansi_null_dflt_on],
      -- all above options combined
      CASE WHEN @@OPTIONS & 1342 = 1342 THEN 'ON' ELSE 'OFF' END AS [ansi_defaults]

所有基本選項都設置為 時ONANSI_DEFAULTS將顯示為ON。如果這些選項中的任何OFF一個是,那麼ANSI_DEFAULTS也將是OFF。您可以通過以下測試看到此行為:

SET ANSI_DEFAULTS ON;

DBCC USEROPTIONS; -- ansi_defaults is SET

SET ANSI_NULLS OFF;

DBCC USEROPTIONS; -- ansi_nulls AND ansi_defaults are missing

SET ANSI_NULLS ON;

DBCC USEROPTIONS; -- ansi_nulls AND ansi_defaults are back

設置ANSI_DEFAULTSON會將所有這些選項設置為ON。同樣,設置ANSI_DEFAULTSOFF會將所有這些選項設置為OFF

您將需要使用DBCC USER Options來查找..DBCC userOptions 僅顯示設置的值。如果您在此處找不到任何設置,則表示未設置

SET ANSI_DEFAULTS ON;  
GO  
-- Display the current settings.  
DBCC USEROPTIONS;  
GO  
-- SET ANSI_DEFAULTS OFF.  
SET ANSI_DEFAULTS OFF;  
GO  
  • -輸出:
textsize    2147483647
language    us_english
dateformat  mdy
datefirst   7
lock_timeout    -1
quoted_identifier   SET
arithabort  SET
ansi_null_dflt_on   SET
ansi_defaults   SET
ansi_warnings   SET
ansi_padding    SET
ansi_nulls  SET
concat_null_yields_null SET
cursor_close_on_commit  SET
implicit_transactions   SET
isolation level read committed

引用自:https://dba.stackexchange.com/questions/141374