日期:2014-05-17  浏览次数:20542 次

问个奇怪的问题:master数据库中sysobjects的内容中也存储着它自己的结构吗?
本帖最后由 blue_morning 于 2013-03-08 18:40:30 编辑
通常情况下,我们通过查询SQL Server的Meta表:sysobjects,sys.columns 等来了解我们自己的数据库结构或解决一些特殊的问题。

但sysobject本身也存储着它的结构吗?如果不是它存储在哪呢?(第一个问题)

例如在SQLServer2005中进行如下查询:
select * from sysobjects where name = 'sysobjects' 
select * from sys.columns where object_id = -105

第一个查询可以返回结果,-105是我电脑上的sysobjects id值,但第二个查询不会返回任何数据(通常情况下,经应该返回表的字段结构)。

----------------------------------

我为什么会这么问?

因为我写的程序中想使用Meta来做一些事,比如我建立一个与sys.columns类似的表(SysColumnsMapping),把sys.columns的内容同步过来,再加上一些其它的字段:ChinaName,DispalyFormatStr等等。

ChinaName字段名可以用在用户Post数据前,根据它的is_nullable判断用户是否填写,并调用ChinaName中的内容自动化提示用户哪个数据没有填写。

DisplayFormatStr可以让这个字段在不同控件显示时自动的定义它会如何显示,而不需要我在每一个具体的控件上去设置。这些工作在WinForm程序中合理使用Meta可以实现自动化,省去很多硬编码。

事实上,我要做的事远不止加上ChinaName,DispalyFormatStr这两个字段那么简单,比如:我可以用SysColumnsMapping中扩展出来的定义,通过选择字段直接生成一个ASP.NET的GridView控件的HTML代码或是某个Form文件中控件的文本代码。

但是:我在编写时发现二个很困惑我的东西,因SysColumnsMapping这个表也存储着SysColumnsMapping的字段结构,在实际编写中,一是SysColumnsMapping表结构因需求修改,改动就是底朝天。二、这种结构方式是合理的吗?因为它看起来更像先有鸡还是蛋的问题,或是一只鸡和蛋在这个世界上同时出现了。

SysColumnsMapping 这种自身包容的结构,我的设计对吗?(第二个问题)这也是我要去搞清为什么sysobject本身也存储着它的结构。

感谢你看完我这个太长的问题。




------解决方案--------------------
系统视图、目录视图、兼容性视图这些一开始的设计原因主要是给SQLServer或者DBA用于管理使用,而不是开发程序的时候用的,微软建议如果有开发需要,可以使用information视图。但是不知道能不能满足你的要求。
------解决方案--------------------
sys.sysobjects肯定是自包含的,基表也是自包含的,尽管基表一般情况下不可见。

sys.columns不返回系统级的信息,sysobjects不是用户定义的,所以不可见:
select * from sys.system_columns where object_id = -105
select * from sys.all_columns where object_id = -105

我不明白是为什么要SysColumnsMapping,而且是同步syscolumns的数据,看你的描述是开发类似代码生成器的东西,在系统视图的基础上定义自己的视图就是了。