为何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
相关产品推荐
相关产品推荐

