【问题标题】:SQL SERVER and SET ANSI_NULLS ON, SET QUOTED_IDENTIFIER ONSQL SERVER 和 SET ANSI_NULLS ON,SET QUOTED_IDENTIFIER ON
【发布时间】:2019-07-12 21:21:19
【问题描述】:

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

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

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

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

【问题讨论】:

标签: sql sql-server ddl sql-scripts


【解决方案1】:

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

您也可以通过@@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;

【讨论】:

  • 我还是一头雾水。我只知道“ANSI NULLS”,但现在我发现了另外两个相似(但独立)的设置“ANSI NULL Default On”、“ANSI NULL Default Off”是否愿意更新您的答案以解释这 3 个 ANSI 设置之间的区别?
  • 不确定你在这里问什么,@joedotnot。 ANSI NULLS 是什么;如果它打开,则 NULL 被视为 NULL,如果不是,则不是(所以像 1 <> NULL 这样的东西评估为真)。这些是ANSI NULLS 仅有的两种状态,开或关。没有“第三个”选项。
  • 当我转到 SSMS 时,右键单击服务器,选择属性、连接窗格等。我看到所有带有复选框的“默认连接选项”。除了带有复选框的 ANSI NULLS 之外,还有带有复选框的 ANSI NULL Default Off,还有带有复选框的 ANSI NULL Default On(+ 其他 ... 引用标识符等)。那么为什么有这 3 个不同的“ANSI”相关选项独立呢?每个人都做什么?
  • 这在@joedotnot 上面的链接中有介绍
【解决方案2】:

现代 SQL Server 客户端 API 默认设置 ANSI_NULLS ONQUOTED_IDENTIFIER ON。因此,这些选项将默认开启并优先于数据库SET 选项设置,您无需在 DDL 脚本中包含 SET 语句。

但是,一旦遇到问题,SQLCMD 实用程序就会设置 QUOTED_IDENTIFIER OFF 以实现向后兼容性。需要使用-I 参数调用SQLCMD 来设置QUOTED_IDENTIFIER ON

【讨论】:

  • 您对“现代 SQL Server 客户端 API”的引用是否包括 SSMS(管理工作室)?如果是这样,从什么版本开始?
  • @joedotnot,是的,SSMS 使用 SqlClient。 SqlClient、ODBC、OLE DB、JDBC 等。人。连接上的设置。 DB-LIB(2000 年弃用)没有。
【解决方案3】:

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

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 的关键字。它将如何区分用户引用的身份或 T-SQL 引用的身份。这就是引用标识符派上用场的地方。

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

参考请参考:

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多