博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于SQL SERVER中获取表的主键名
阅读量:6122 次
发布时间:2019-06-21

本文共 1322 字,大约阅读时间需要 4 分钟。

最近又拿起以前做的那个三层结构代码生成器,应该算是给它完善一下吧。主要做了一些修改:

以前的数据表设计习惯是每张表的第一个字段设置为主键,并且名字为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('表名'))"。
得到主键后就可以将代码生成器完善一下了。以前生成“更新数据”以及“插入数据”的代码并不完整,现在终于可以解决了。哈哈!!

本文来自风情波涌的博客,

转载于:https://www.cnblogs.com/hahqb/archive/2011/11/28/2266668.html

你可能感兴趣的文章
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
代码描述10313 - Pay the Price
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>