zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    attr与prop
    Django框架学习
    库的操作
    javascript 基础知识
    进程
    正则表达式
    模块( collections , time , random , os , sys)
    内置函数
    生成器
    迭代器
  • 原文地址:https://www.cnblogs.com/hahqb/p/2266668.html
Copyright © 2011-2022 走看看