SQL SERVER 和 SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

joe*_*not 5 sql sql-server ddl sql-scripts

所以我在创建脚本时一直盲目地使用ansi_nulls on、quoted_identifier on,因为sqlserver在编写对象脚本时会自动生成它们。

我真的没有时间关心这些琐碎的废话:-)但我想必须提出这些问题。

鉴于这些是推荐的设置,是否有一个选项可以设置(a)每个数据库和(b)每个服务器,以便它们默认情况下始终处于打开状态,而不是通过单独的脚本?

如果是这样,如何/在哪里可以查看当前的默认设置?

Tah*_*667 7

当您希望使用 SQL Server Management Studio(SSMS) 2015 Express 创建新 SP 时,它会默认生成一个类似于以下片段的模板\'SET ANSI_NULLS ON\',其中包含语句\'SET QUOTED_IDENTIFIER ON\', :\'SET NOCOUNT ON\'

\n\n

存储过程模板-SSMS2015\n 1. 将 ANSI_NULLS 设置为开:

\n\n

当 ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句也会返回零行。根据ANSI(美国国家标准协会),使用NULL 执行的任何比较或计算都是 NULL。NULL既不是字符串,也不是数字,也不是零。它只是未定义。所以,当我这样做时SET ANSI_NULLS ON;我只是告诉SQL SERVER遵循ANSI标准。

\n\n

当 ANSI_NULLS 设置为 ON 时。\xe2\x80\x98=\xe2\x80\x99 运算符无法识别 NULL。这是 ANSI 的标准,任何与 NULL 的比较都始终为 NULL。所以你永远不会得到这个结果。要在列中查找 NULL,我们使用关键字\xe2\x80\x98IS NULL\xe2\x80\x99

\n\n

2. 将 QUOTED_IDENTIFIER 设置为 ON:

\n\n

简而言之,当您这样做时,SET QUOTED_IDENTIFIER ON您可以使用 SQL 标识符或 SQL 中的保留关键字作为用户定义的对象。它必须在双引号内定义,因此名称为QUOTED_IDENTIFIER

\n\n

考虑这样一种情况,您希望列名称为 \xe2\x80\x98Identity\xe2\x80\x99。但 Identity 是 SQL Server 的关键字。它将如何区分用户引用的 Identitiy 或 T-SQL 引用的 Identity。这就是引用标识符派上用场的地方。

\n\n

QUOTED_IDENTIFIER

\n\n

当 SET QUOTED_IDENTIFIER 为 ON(默认)时,所有用双引号分隔的字符串都被解释为对象标识符。因此,带引号的标识符不必遵循 Transact-SQL 标识符规则。它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。

\n\n

如需参考,请参阅:

\n\n\n


use*_*983 5

两者都是在连接级别设置的,而不是在数据库级别设置的。如果您未在脚本中指定它们,它们将使用默认连接设置。您可以通过右键单击 SSMS 中的服务器并选择“属性”来查看这些内容。转到连接窗格,有一个 ANSI NULL 默认开/关复选框。如果两者均未选择,则“默认默认值”为“开”。

您还可以使用以下方式获取设置@@OPTIONS

SELECT CASE @@OPTIONS & 1024 WHEN 0 THEN 'OFF' ELSE 'ON' END AS SET_ANSI_NULLS_ON,
       CASE @@OPTIONS & 2048 WHEN 0 THEN 'OFF' ELSE 'ON' END AS SET_ANSI_NULLS_OFF;
Run Code Online (Sandbox Code Playgroud)

可以在此处找到按位值的完整列表:配置用户选项服务器配置选项

您可以使用以下命令默认打开连接的 ANSI NULL:

EXEC sys.sp_configure N'user options', N'1024';
GO
RECONFIGURE;
Run Code Online (Sandbox Code Playgroud)