SqlServer DB(2008 兼容性)将 OPTIMIZE_FOR_SEQUENTIAL_KEY 添加到脚本

Posted

技术标签:

【中文标题】SqlServer DB(2008 兼容性)将 OPTIMIZE_FOR_SEQUENTIAL_KEY 添加到脚本【英文标题】:SqlServer DB (2008 compatibility) adds OPTIMIZE_FOR_SEQUENTIAL_KEY to scripts 【发布时间】:2021-12-24 08:27:43 【问题描述】:

上下文:

我有一个在现代 SqlServer 上运行的数据库,但该数据库设置为兼容模式 2008 (100)。当我从该数据库生成主键时,生成的脚本包含 OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF,这是一个比 2008 年更晚引入的功能。由于 2008 兼容模式,我希望不包含 OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF

我可以删除生成的脚本的那部分,但这是一个频繁的操作,而且这是一个耗时且容易出错的解决方法。

我使用的是右键菜单->脚本索引为->创建到->新窗口。

问题:

是否有服务器、数据库或 ssms 配置可以防止在编写主键脚本时出现 OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF? 我认为 2008 兼容模式会在生成的脚本中抑制该功能是错误的吗?

【问题讨论】:

你有没有实际上尝试过运行上面的?无论数据库的兼容性设置如何,在支持它的实例中使用OPTIMIZE_FOR_SEQUENTIAL_KEY 都可以正常工作。 然而,理想情况下,我建议更改该兼容性设置; 2008 已超过 2 年不支持,未来版本的 SQL Server 将不具备兼容级别。 您还在使用 2008 实例吗?我只能假设您必须是,否则这个问题将不存在。您是否考虑过升级到受支持的 sql server 版本? 期待 2008 兼容模式是不是我错了 是的。而且你也错误地认为你在新版本上开发的任何代码都可以在旧版本上正常工作,就像在新版本上一样。如果没有此选项,您可以使用 SSDT 为旧版本生成脚本。请注意,您一般不应该使用此选项。 【参考方案1】:

这完全是意料之中的。无论兼容性级别如何,您的代码都针对您的 SQL Server 版本运行,并且 SSMS 没有理由生成任何不同的内容。

您的问题是基于这样一个错误的前提,即较新的 T-SQL 语法受到保护或门控,不会在新的兼容级别下使用。

您似乎假设兼容性级别的目的是确保较新 T-SQL 代码向后 与旧版本的 SQL Server 兼容。 事实并非如此。

兼容性级别确保最初用于早期版本的代码的向前兼容性,以便它在较新版本的 SQL Server 下继续按预期工作。这主要围绕保留优化器行为,尽管也保留了一些语法差异(例如,递归 CTE 中的 EXCEPTPIVOT 用法)。

This is fully documented:

新的 Transact-SQL 语法不受数据库兼容性级别的限制,除非它们可以通过与用户 Transact-SQL 代码产生冲突来破坏现有应用程序。这些例外情况将在本文的下一部分中记录,其中概述了特定兼容性级别之间的差异。

【讨论】:

以上是关于SqlServer DB(2008 兼容性)将 OPTIMIZE_FOR_SEQUENTIAL_KEY 添加到脚本的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008安装问题

sqlserver2016兼容2008吗

死磕:SQL行转列汇总(全网最全最详细)

SQL Server 2008 SP2

SqlServer2008R2中创建dblink连接db2

Windows Server2012如何安装SqlServer2008r2,我点击“setup”总是提示兼容性有问题;如图: