论文部分内容阅读
【摘要】:在SQLSERVER数据库中,当需要对某一单位体检人员结果集中的记录逐一地读取并完成更新检查检验数据时,使用select语句完成十分困难,而游标则提供了完成对一个结果集进行逐行处理的能力。
【关键词】SELECT;CURSOR游标 ;结果集;体检;检查检验
一、问题提出
我院的体检系统由于上线时间较早,体检人员的体检结果导出功能方面功能不足,因此当有些查体单位需要我们提供该单位所有人员的检查、检验等数据时,导致这些数据往往无法直接提供或提供这些数据十分麻烦。
二、解决思路
由于我院体检人员的检查、检验数据在数据库中是一个项目名称对应一个结果并以一条记录形式存储的,而体检单位要求在一张电子表格中要包含所有体检人员的所有的检查、检验项目结果,于是在编写存储过程中,当检索、更新的数据是一条记录时,使用select 、update语句可以实现,但是现在需要从体检人员结果集中逐一地读取一条记录并更新,那么使用select语句完成十分困难。通过分析研究,发现利用游标可以方便实现。
什么游标(CURSOR)?其作用是什么?
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。我们知道关系数据库管理系统实质是面向集合的,在SQLSERVER中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中,因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力。
每一个游标必须有四个组成部分,这四个部分必须符合下面的顺序:①DECLARE 游标②OPEN 游标③FETCH 信息④CLOSE 或DEALLOCATE 游标。
三、具体实现步骤:
1、生成一个包含体检人员的基本信息字段和所有检查、检验项目字段的空数据表。
体检人员的基本信息字段包括如体检编号、姓名、性别,体检时间等;检查项目字段分别包括检查部位和检查结果,如放射、超声、心电图等;检验项目字段包括总胆红素、直接胆红素、间接胆红素等57个项目。
由于每个检查、检验项目在数据库是以一个项目名称对应一个结果并以一条记录的形式保存,因此为生成所有项目字段,首先通过select语句检索出所有项目名称记录并保存到excel中,利用excel的转置功能生成包含所有字段空表,再将该表导入到数据库中,最后生成空的、完整的数据表。
2、将体检人员基本信息插入到dyjj_jcjy中。
insert into dyjj_jcjy(tjbh,ryxh,hzxm,sex,kstjsj)
select a.tjbh,a.xh ’ryxh’,b.hzxm,b.sex,substring(a.kstjsj,1,8)
from TJ_TJRYK a,SF_BRXXK b
WHERE a.tdxh=’2623’and a.tjbh=b.blhand a.jlzt=3
order by tjbh
3、通过jc_up_cursor游标将检查结果插入(通过逐条取’ryxh’结果集来更新对应数据)
DECLARE @ryxh ut_xh12
DECLARE jc_up_cursor CURSOR FOR
SELECT ryxh FROM dyjj_jcjy
ORDER BY tjbh
OPEN jc_up_cursor
FETCH NEXT FROM jc_up_cursor into @ryxh
WHILE @@FETCH_STATUS = 0
BEGIN
---心电图
update dyjj_jcjy set xdtjcbw=-----部位
(select top 1 xmjg from SF_JCJGK where bgdh=(select bgdh FROM TJ_TJSFMXK where ryxh=@ryxh and bglx=’XDT’)
and xmdm=’bw’order by xh desc)
where ryxh=@ryxh
update dyjj_jcjy set xdtjcsj= -----结果
(select top 1 xmjg from SF_JCJGK where bgdh=(select bgdh FROM TJ_TJSFMXK where ryxh=@ryxh and bglx=’XDT’)
and xmdm=’jcjl’order by xh desc)
where ryxh=@ryxh
。。。。。。
FETCH NEXT FROM jc_up_cursor into @ryxh
END
CLOSE jc_up_cursor
DEALLOCATE jc_up_cursor
GO
4、通过jy_up_cursor游标将检验结果插入(通过逐条取’ryxh’结果集来更新对应数据)
DECLARE @ryxh ut_xh12
DECLARE jy_up_cursor CURSOR FOR
SELECT ryxh FROM dyjj_jcjy
ORDER BY tjbh
OPEN jy_up_cursor
FETCH NEXT FROM jy_up_cursor into @ryxh
WHILE @@FETCH_STATUS = 0
BEGIN
update dyjj_jcjy set 总胆红素=(select a.xmjg from SF_YJJGK a (nolock),TJ_TJSFMXK b (nolock) ,TJ_TJRYK c(nolock) , TJ_TJTDK d(nolock),YY_SFXXMK e (nolock)wherea.cflb = 3 and a.cfxh = b.xhand b.ryxh = c.xh and c.tdxh = d.xh and b.sf_id = e.idand c.xh = @ryxhand xmmc=’总胆红素’)
where ryxh=@ryxh
。。。。。。
FETCH NEXT FROM jy_up_cursor into @ryxh
END
CLOSE jy_up_cursor
DEALLOCATE jy_up_cursor
GO
四、总结
通过以上解决思路和解决步骤,轻松完成了所有体检人员的检查、检验等数据结果的更新,并顺利导出了整个数据表。当利用简单的select语句等无法处理针对整个结果集较为复杂的业务时,可以考虑使用游标的优势来处理。
参考文献
1. 朱 倩,浅析SQL Server2000中游标的使用,福建电脑,2009.3
2. 姜广坤等,SQL Server 2000 实用教程[M],大连理工大学出版社,2004.8
[email protected]
山东省东营市东营区胜利医院信息中心 13561039065
【关键词】SELECT;CURSOR游标 ;结果集;体检;检查检验
一、问题提出
我院的体检系统由于上线时间较早,体检人员的体检结果导出功能方面功能不足,因此当有些查体单位需要我们提供该单位所有人员的检查、检验等数据时,导致这些数据往往无法直接提供或提供这些数据十分麻烦。
二、解决思路
由于我院体检人员的检查、检验数据在数据库中是一个项目名称对应一个结果并以一条记录形式存储的,而体检单位要求在一张电子表格中要包含所有体检人员的所有的检查、检验项目结果,于是在编写存储过程中,当检索、更新的数据是一条记录时,使用select 、update语句可以实现,但是现在需要从体检人员结果集中逐一地读取一条记录并更新,那么使用select语句完成十分困难。通过分析研究,发现利用游标可以方便实现。
什么游标(CURSOR)?其作用是什么?
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。我们知道关系数据库管理系统实质是面向集合的,在SQLSERVER中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中,因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力。
每一个游标必须有四个组成部分,这四个部分必须符合下面的顺序:①DECLARE 游标②OPEN 游标③FETCH 信息④CLOSE 或DEALLOCATE 游标。
三、具体实现步骤:
1、生成一个包含体检人员的基本信息字段和所有检查、检验项目字段的空数据表。
体检人员的基本信息字段包括如体检编号、姓名、性别,体检时间等;检查项目字段分别包括检查部位和检查结果,如放射、超声、心电图等;检验项目字段包括总胆红素、直接胆红素、间接胆红素等57个项目。
由于每个检查、检验项目在数据库是以一个项目名称对应一个结果并以一条记录的形式保存,因此为生成所有项目字段,首先通过select语句检索出所有项目名称记录并保存到excel中,利用excel的转置功能生成包含所有字段空表,再将该表导入到数据库中,最后生成空的、完整的数据表。
2、将体检人员基本信息插入到dyjj_jcjy中。
insert into dyjj_jcjy(tjbh,ryxh,hzxm,sex,kstjsj)
select a.tjbh,a.xh ’ryxh’,b.hzxm,b.sex,substring(a.kstjsj,1,8)
from TJ_TJRYK a,SF_BRXXK b
WHERE a.tdxh=’2623’and a.tjbh=b.blhand a.jlzt=3
order by tjbh
3、通过jc_up_cursor游标将检查结果插入(通过逐条取’ryxh’结果集来更新对应数据)
DECLARE @ryxh ut_xh12
DECLARE jc_up_cursor CURSOR FOR
SELECT ryxh FROM dyjj_jcjy
ORDER BY tjbh
OPEN jc_up_cursor
FETCH NEXT FROM jc_up_cursor into @ryxh
WHILE @@FETCH_STATUS = 0
BEGIN
---心电图
update dyjj_jcjy set xdtjcbw=-----部位
(select top 1 xmjg from SF_JCJGK where bgdh=(select bgdh FROM TJ_TJSFMXK where ryxh=@ryxh and bglx=’XDT’)
and xmdm=’bw’order by xh desc)
where ryxh=@ryxh
update dyjj_jcjy set xdtjcsj= -----结果
(select top 1 xmjg from SF_JCJGK where bgdh=(select bgdh FROM TJ_TJSFMXK where ryxh=@ryxh and bglx=’XDT’)
and xmdm=’jcjl’order by xh desc)
where ryxh=@ryxh
。。。。。。
FETCH NEXT FROM jc_up_cursor into @ryxh
END
CLOSE jc_up_cursor
DEALLOCATE jc_up_cursor
GO
4、通过jy_up_cursor游标将检验结果插入(通过逐条取’ryxh’结果集来更新对应数据)
DECLARE @ryxh ut_xh12
DECLARE jy_up_cursor CURSOR FOR
SELECT ryxh FROM dyjj_jcjy
ORDER BY tjbh
OPEN jy_up_cursor
FETCH NEXT FROM jy_up_cursor into @ryxh
WHILE @@FETCH_STATUS = 0
BEGIN
update dyjj_jcjy set 总胆红素=(select a.xmjg from SF_YJJGK a (nolock),TJ_TJSFMXK b (nolock) ,TJ_TJRYK c(nolock) , TJ_TJTDK d(nolock),YY_SFXXMK e (nolock)wherea.cflb = 3 and a.cfxh = b.xhand b.ryxh = c.xh and c.tdxh = d.xh and b.sf_id = e.idand c.xh = @ryxhand xmmc=’总胆红素’)
where ryxh=@ryxh
。。。。。。
FETCH NEXT FROM jy_up_cursor into @ryxh
END
CLOSE jy_up_cursor
DEALLOCATE jy_up_cursor
GO
四、总结
通过以上解决思路和解决步骤,轻松完成了所有体检人员的检查、检验等数据结果的更新,并顺利导出了整个数据表。当利用简单的select语句等无法处理针对整个结果集较为复杂的业务时,可以考虑使用游标的优势来处理。
参考文献
1. 朱 倩,浅析SQL Server2000中游标的使用,福建电脑,2009.3
2. 姜广坤等,SQL Server 2000 实用教程[M],大连理工大学出版社,2004.8
[email protected]
山东省东营市东营区胜利医院信息中心 13561039065