You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL Server允许CREATE DATABASE指定compatibility_level却不生效?

为什么CREATE DATABASE ... WITH compatibility_level不报错但不生效?

这背后是SQL Server解析器对CREATE DATABASE语句WITH子句的特殊处理逻辑,咱们拆解来看:

  • 第一个语句不报错但不生效的原因:
    compatibility_level是一个合法的数据库属性(你已经知道它可以通过ALTER DATABASE设置),但它并不属于CREATE DATABASE ... WITH子句支持的选项列表。SQL Server的解析器在处理WITH子句时,遇到格式正确(标识符=值)且属于已知数据库属性的选项时,会选择直接忽略它,而不是抛出错误——它知道这个属性是有效的,只是当前语句不支持设置,所以跳过该选项,继续执行数据库创建的核心逻辑,最终数据库成功创建,但兼容性级别还是默认值。

  • 第二个语句报错的原因:
    nonsense_notexisting是一个完全不存在的标识符,SQL Server解析器既不把它识别为CREATE DATABASE WITH的有效选项,也不认为它是任何已知的数据库属性。这种情况下,解析器会判定这是语法错误,直接抛出Incorrect syntax near 'nonsense_notexisting'的报错,终止语句执行。

简单来说,SQL Server对CREATE DATABASE WITH子句的错误处理是“分级”的:

  • 格式正确且属于已知数据库属性的未知选项:宽容忽略
  • 完全未知、格式虽对但无任何匹配属性/选项的内容:严格报错

内容的提问来源于stack exchange,提问作者Jeppe Stig Nielsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:36:06