关于SQL SERVER中获取表的主键名

image

最近又拿起以前做的那个三层结构代码生成器,应该算是给它完善一下吧。主要做了一些修改:
以前的数据表设计习惯是每张表的第一个字段设置为主键,并且名字为id。对此在生成“根据Id号获取记录”的操作代码时至于生成"select * from [tables] where id = @id"(其中[tables]为数据表名)。但后来觉得这么设计表似乎不是很好,而改用每张表,比如User表的主键为UserId,Role表的主键为RoleId;这样字若还是生成"select * from [tables] where id = @id"显然不合适。对此我需要做的是获取到表的主键字段。这里需要处理的一个问题是:主键不一定是表的第一个字段,因此不能使用诸如"SELECT top 1 name FROM SysColumns WHERE id=Object_Id('tableName')"这样的sql语句来获取主键名(其中tableName为要取得主键的表名)。
网上查了下相关语句,得到的结果是:SELECT name FROM SysColumns WHERE id=Object_Id('表名') and colid=(select top 1 keyno from sysindexkeys where id=Object_Id('表名'))。针对此sql语句我做了测试,发现其结果为获取表的第一个字段名称,也就是说不管我将主键设置为哪个字段,所得的的结果都是一致的。显然这不是预期的结果。对此我将这条语句进行拆解,分别查询;查询SELECT name FROM SysColumns WHERE id=Object_Id('表名')得到的结果为目标表的所有字段,因此and后面的语句将是用来作为条件过滤出主键。然后我有查询了select top 1 keyno from sysindexkeys where id=Object_Id('表名'),得到的结果是1,无论将主键设置在哪里都一样;接着将这条语句进行了修改,查询sysindexkeys表的所有字段,也就是执行select * from sysindexkeys where id=Object_Id('表名'),得到一条记录,包含有id、indid、colid、keyno四个字段。然后我分别设置不同字段为主键时执行这条语句,发现只有colid这个字段有变并且就是指向表的主键。终于找到问题了。
因此,要获取到表的主键字段的完整语句应该是 "SELECT name FROM SysColumns WHERE id=Object_Id('表名') and colid=(select top 1 colid from sysindexkeys where id=Object_Id('表名'))"。
得到主键后就可以将代码生成器完善一下了。以前生成“更新数据”以及“插入数据”的代码并不完整,现在终于可以解决了。哈哈!!

本文来自风情波涌的博客,http://www.cnblogs.com/hahqb

posted @ 2011-11-28 20:28  风情波涌  阅读(1926)  评论(0编辑  收藏  举报