任何人都可以详细说明information_schema.tables报告的架构如何以及何时可能不正确?
解决方法
>文档中的措辞不准确,正在纠正中(见Connect #686118).我不确定他们是否会同时更正2005,2008和2008 R2文档,或者旧版本是否会更新.关键是我无法想象任何一个视图中的模式不正确的情况,但更重要的是,当sys.objects正确时,info_schema不正确.后者是不可能的 – info_schema视图完全基于sys.objects视图(只看SELECT OBJECT_DEFINITION(OBJECT_ID(‘INFORMATION_SCHEMA.TABLES’));),所以如果一个不正确,它们都是不正确的.可能有些模糊的情况,它们都可能不正确,但在当前版本中不是(例如,在sql Server 2000中,配置选项允许更新启用,从sysusers中删除拥有对象的用户 – 今天不太相关或可能,而不是我愿意尝试的东西,但它是我能想象的唯一一个可以在任何时间点激发当前措辞的东西.
>通常,应避免使用INFORMATION_SCHEMA视图,以支持sql Server 2005中引入的目录视图(并从那时起进行了扩充).为什么?因为在将新功能添加到sql Server时继续开发目录视图,而info_schema视图则没有.正如我在评论中提到的,尝试在info_schema中查找有关筛选索引的信息.包含的列,XML索引,标识/计算列,针对唯一索引的外键也是如此 – 这些都在info_schema视图中完全缺失或表示不同.在Denali中,他们为Sequences添加了一个info_schema视图,但这又符合标准的最低要求,并且不包含有关特定于sql Server的实现细节的任何信息(例如,它是否已用尽,以及它们是否添加了任何新功能未来你可以确定info_schema视图不会保留在循环中).您坚持使用info_schema视图的唯一情况是:(a)您是否正在编写需要在兼容info_schema的平台上工作的元数据例程;(b)您没有使用任何特定于平台的功能.除了多平台供应商工具之外,这可能是一种非常罕见的情况(即使在这种情况下,也可能导致使用这些功能的客户不满意而且该工具没有提取它们).
>我提交了一份单独的Connect建议(Connect #686121),他们在联机丛书中的所有INFORMATION_SCHEMA视图主题上涂抹了关于此不完整性的警告.我不认为它们不是从sql Server中获取元数据的首选方式,并且可以责怪人们没有看到这一点 – 毕竟,我们总是被告知使用符合标准的方法是“最佳实践”和使用专有方法是相反的.与许多数据库事物一样,“它取决于” – 但我怀疑,通常情况下,您最好使用sys目录视图,除非您处于极少数情况下,您只使用sql中的功能标准通用的服务器.在这种情况下,我认为我没有遇到任何容量的单一实例,但如果它们确实存在,我很乐意了解它们.
编辑我也在这里写了关于INFORMATION_SCHEMA不可靠性的博客: