【问题标题】:Is it necessary to run SET ANSI_NULLS ON and SET QUOTED_IDENTIFIERS ON every time I do a CREATE/ALTER?每次执行 CREATE/ALTER 时是否需要运行 SET ANSI_NULLS ON 和 SET QUOTED_IDENTIFIERS ON?
【发布时间】:2017-09-21 19:20:26
【问题描述】:

我了解这些设置的作用以及它们为何重要。不过,我有几个问题:

如果我在 CREATE/ALTER 之前运行一次:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

下次我做另一个 CREATE/ALTER 时是否需要再次运行它?

基本上,这些 SET 命令所做的更改是否会在批次/连接之间持续存在?

【问题讨论】:

    标签: sql sql-server database sql-server-2008 sql-server-2012


    【解决方案1】:

    在创建对象(表或其他方式)时指定的任何SET 选项都永久绑定到该对象,并且这些设置很重要。例如,要将过滤索引添加到表中,必须使用一整套正确指定的SET 选项来创建它。您可以通过查看sys.sql_modules 查看所有这些选项。

    但是,一旦创建了对象,这些选项就无法更改(或者至少不能以我所知道的任何方式更改),因此将 SET 选项添加到 ALTER TABLE 脚本将适用于您要执行的任何 SQL运行(像往常一样),但不会更新与该表关联的 SET 选项。

    【讨论】:

    • 这听起来是正确的答案。您可以指出任何参考来验证这是否正确?
    • 我主要是在我的机器上运行测试(在工作中;现在没有脚本)。我创建了一个表,其中包含我知道不适用于过滤索引的设置,然后尝试构建一个。惊喜,它失败了。然后我得到了正确的设置,并重新创建了表格。惊喜,它奏效了。然后我运行了一个设置错误的alter语句,它对过滤后的索引没有影响。我会看看我是否能找到一些实际的帖子以及我也没有使用过的东西。
    • 是的,找不到任何关于该主题的开创性文章,但我阅读的大多数帖子都说,一旦创建表,就无法更改表上的 SET 选项。我能够通过查看sys.modules 进行测试以确保它们不会在更改期间被重置,并且我能够看到alter table 上的文档没有提供修改它们的方法。也就是说,不,您不必每次都设置它们。但是请记住,如果您开始一个新脚本并且您希望或不希望引用标识符可用,那么您仍然必须设置它。
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 2012-04-03
    • 2010-09-18
    • 1970-01-01
    • 2010-12-06
    • 2015-06-23
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多