joh*_* Gu 6 sql-server t-sql sql-server-2008-r2 sql-standard
我为我的 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
Run Code Online (Sandbox Code Playgroud)
现在我对我为什么要这句话感到困惑:-
ALTER DATABASE [****] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [****] SET ANSI_NULLS OFF
Run Code Online (Sandbox Code Playgroud)
但是当创建任何 sql 表时,我会得到:-
SET ANSI_NULLS ON
Run Code Online (Sandbox Code Playgroud)
那么最终的结果是什么;ANSI_NULLS 是等于 off 还是 on ?根据我的理解,“SET ANSI_NULLS”将在数据库级别关闭,除非我在表级别将其设置为 ON?这样对吗 ?为什么我在数据库级别将 ANSI_NULLs 设置为关闭?
当您不指定ANSI_NULL_DEFAULTinCREATE TABLE或ALTER TABLEstatements 时,此数据库选项将确定默认值,NULL或NOT NULL为列或 CLR 用户定义类型。
当 SET 为 时ON,默认值为NULL。当 SET 为 时OFF,默认值为NOT NULL。
使用 SET 语句设置的连接级别设置会覆盖 ANSI_NULL_DEFAULT 的默认数据库级别设置。默认情况下,ODBC 和 OLE DB 客户端在连接到 SQL Server 实例时发出连接级 SET 语句,将会话的 ANSI_NULL_DEFAULT 设置为 ON。
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 语句也会返回零行。
当ANSI_NULLS被设置为OFF再一个的比较NULL=NULL或NULL<>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_ON和SET ANSI_NULLS