SQL SERVER和SET ANSI_NULLS ON,SET QUOTED_IDENTIFIER ON

时间:2019-02-19 11:20:51

标签: sql sql-server ddl sql-scripts

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

我真的没有时间去关心自己这种琐碎的废话:-)但是我想这个问题必须要问。

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

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

3 个答案:

答案 0 :(得分:0)

两者都设置在连接级别,而不是数据库。如果您没有在脚本中指定它们,它们将使用默认的连接设置。您可以通过右键单击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;

可在此处找到按位值的完整列表:Configure the user options Server Configuration Option

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

EXEC sys.sp_configure N'user options', N'1024';
GO
RECONFIGURE;

答案 1 :(得分:0)

现代SQL Server客户端API默认情况下同时设置ANSI_NULLS ONQUOTED_IDENTIFIER ON。因此,这些选项默认情况下处于启用状态,并且优先于数据库SET选项设置,因此您无需在DDL脚本中包含SET语句。

但是,一旦掌握了SQLCMD实用程序,就会出于向后兼容的原因而设置QUOTED_IDENTIFIER OFF。需要使用带有SQLCMD参数的-I来设置QUOTED_IDENTIFIER ON

答案 2 :(得分:0)

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

Stored-Procedure-Template-SSMS2015 1。设置ANSI_NULLS ON:

当ANSI_NULLS设置为ON时,即使column_name中包含空值,使用WHERE column_name = NULL的SELECT语句也将返回零行。根据 ANSI(美国国家标准学会)进行的任何比较或计算NULL为NULL。 NULL 既不是字符串,也不是数字,也不是零。它只是未定义。因此,当我执行SET ANSI_NULLS ON时;我只是在告诉SQL SERVER遵循ANSI的标准。

当ANSI_NULLS设置为ON时。 “ =”运算符无法识别NULL。这是ANSI的标准,任何与NULL的比较总是NULL。因此,您永远不会获得任何结果。要在列中查找NULL,我们使用关键字“ IS NULL”

2。设置QUOTED_IDENTIFIER为ON:

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

考虑一种情况,您希望列名称为“ Identity”。但是身份是SQL Server的关键字。如何区分用户引用的Identitiy或T-SQL引用的Identity。这是加引号的标识符很方便的地方。

QUOTED_IDENTIFIER

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

有关参考,请参考: