Sql-Server

在數據庫級別設置 ANSI_NULLS 與在表級別設置它

  • April 24, 2019

我為我的 sql server 2008 R2 生成了僅模式腳本,這是其中的一部分:-

USE [master]
GO
/****** Object:  Database [****]    Script Date: 03/25/2015 12:17:09 ******/
CREATE DATABASE [****] ON  PRIMARY 
( NAME = N'TMS', FILENAME = N'D:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\****.mdf' , SIZE = 11264KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON 
( NAME = N'TMS_log', FILENAME = N'L:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\****.ldf' , SIZE = 4672KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [****] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [****].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [****] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [****] SET ANSI_NULLS OFF
GO
ALTER DATABASE [****] SET ANSI_PADDING OFF
GO
ALTER DATABASE [****] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [****] SET ARITHABORT OFF
GO
ALTER DATABASE [****] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [****] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [****] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [****] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [****] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [****] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [****] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [****] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [****] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [****] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [****] SET  DISABLE_BROKER
GO
ALTER DATABASE [****] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [****] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [****] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [****] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [****] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [****] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [****] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [****] SET  READ_WRITE
GO
ALTER DATABASE [****] SET RECOVERY FULL
GO
ALTER DATABASE [****] SET  MULTI_USER
GO
ALTER DATABASE [****] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [****] SET DB_CHAINING OFF
GO
USE [****]
GO
/****** Object:  User [AD-ITSERVICES\TMSDB.user]    Script Date: 03/25/2015 12:17:09 ******/
CREATE USER [AD-ITSERVICES\test.user] FOR LOGIN [****\test.user] WITH DEFAULT_SCHEMA=[dbo]
GO
/****** Object:  Table [dbo].[TechnologyTypes]    Script Date: 03/25/2015 12:17:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TechnologyTypes](
   [AssetTypeID] [int] IDENTITY(1,1) NOT NULL,
   [Name] [nvarchar](50) NOT NULL,
   [IncludedInSearch] [bit] NULL,
CONSTRAINT [PK_AssetType] PRIMARY KEY CLUSTERED 
(
   [AssetTypeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
CONSTRAINT [IX_AssetType] UNIQUE NONCLUSTERED 
(
   [Name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TechnologyStatus]    Script Date: 03/25/2015 12:17:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON

現在我很困惑為什麼我要說這句話:-

ALTER DATABASE [****] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [****] SET ANSI_NULLS OFF

但是在創建任何 sql 表時,我會得到:-

SET ANSI_NULLS ON

那麼最終的結果是什麼;ANSI_NULLS 將等於 off 還是 on ?據我了解,“SET ANSI_NULLS”將在數據庫級別關閉,除非我在表級別將其設置為 ON?它是否正確 ?為什麼我在數據庫級別將 ANSI_NULLs 設置為關閉?

ANSI_NULL_DEFAULT { 開 | 關閉}

當你沒有ANSI_NULL_DEFAULTCREATE TABLEorALTER TABLE語句中指定時,這個數據庫選項將確定預設值,NULL或者NOT NULL為一個列或 CLR 使用者定義類型。

當設置為ON時,預設值為NULL。當設置為OFF時,預設值為NOT NULL

使用 SET 語句設置的連接級別設置會覆蓋 ANSI_NULL_DEFAULT 的預設數據庫級別設置。預設情況下,ODBC 和 OLE DB 客戶端在連接到 SQL Server 實例時為會話發出連接級 SET 語句,將 ANSI_NULL_DEFAULT 設置為 ON。


ANSI_NULLS { 開 | 關閉}

ANSI_NULL應該是ON。這將是 SQL Server 未來版本中的預設行為。

ANSI_NULLS設置為ONthen NULL 遵循等於 (=) 和不等於 (<>) 比較運算符的 ISO 兼容行為。

當 SET ANSI_NULLS 為 ON 時,即使 column_name 中有空值,使用 WHERE column_name = NULL 的 SELECT 語句也會返回零行。即使 column_name 中有非空值,使用 WHERE column_name <> NULL 的 SELECT 語句也會返回零行。

WhenANSI_NULLS設置為OFFthen 的比較NULL=NULLNULL&lt;&gt;NULL分別返回 TRUE 或 FALSE,而不是未知的答案NULL。它對待NULL自己的價值。

當 SET ANSI_NULLS 為 OFF 時,等於 (=) 和不等於 (<>) 比較運算符不遵循 ISO 標準。使用 WHERE column_name = NULL 的 SELECT 語句返回 column_name 中具有空值的行。使用 WHERE column_name <> NULL 的 SELECT 語句返回列中具有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 語句會返回所有非 XYZ_value 且非 NULL 的行。

永遠記住,會話級別設置將覆蓋上述 SET 選項的數據庫級別設置。

參考:SET ANSI_NULL_DFLT_ONSET ANSI_NULLS

來自評論:“而且您還沒有解決為什麼位(為什麼我在數據庫級別將 ANSI_NULLs 設置為關閉)”

在數據庫級別,當您生成數據庫腳本時,它將從數據庫上設置的任何設置中獲取設置(您可以通過右鍵點擊任何數據庫來查看它們的設置,選擇屬性,然後選擇選項)。

預設情況下,安裝 SQL Server 時,在模型數據庫中將這些設置設置為 OFF。由於所有新數據庫都是使用模型作為基礎創建的,因此新數據庫也會將此設置(以及其他設置,例如 ANSI PADDING)設置為 OFF/False,除非您在創建新數據庫時顯式編寫自己的 SET 語句來覆蓋模型預設值.

更多資訊在這裡

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