MS SQL中关于拼接后数据列的信息提取
2012-12-04 17:45
295 查看
背景:
在项目中,数据库中的一条记录往往在某一字段中包含了更多信息。比如,在一个涉及基站项目的专业情况时,往往一个基站会做多个专业的工程。专业对照着一张码表。所以,(1,2,5)这样的列数据会随处可见。
目的:
1.希望拿到除开列数据ID中剩下的所有码表数据。2.希望拿到写入列数据对应的专业详细信息,比如(主体,机房,美化天线)
实现关键:
1.表变量DECLARE @TableVariable TABLE(SpecialtyIDs VARCHAR(30))
说明:表变量无需创建,使用declare声明即可。其声明语法与创建一张表很类似
2.CHARINDEX()函数
SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+',', ','+@SpeIDs+',' )>0
说明:若存在就返回其首字母的位置(>0的整数),若不存在返回0
3.游标
declare @bb varchar(50)
declare @rv varchar(50)
set @rv=''
--声明游标,针对此次select的结果
declare mycursor cursor for
SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+',', ','+@SpeIDs+',' )>0--打开游标
open mycursor
--最开始此游标没指向任何记录,fetch NEXT之后指向其第一条记录。并完成赋值
fetch NEXT from mycursor into @bb
--检测其状态量,为0时表示有数据
while(@@fetch_status=0)
begin
IF @rv=''
BEGIN
set @rv=@bb
END
ELSE
BEGIN
set @bb=','+@bb
set @rv=@rv+@bb
END
--在此域中循环取值,赋值。
fetch NEXT from mycursor into @bb
end
--关闭声明的游标,使其不具备指向功能
close mycursor
--释放该游标持有的资源。
deallocate mycursor
--可以发现,返回值@rv是一个由','分隔的字符串
RETURN @rv;
实现代码:
1.获得其已保存的ID,转换成用字符串(select查询完毕的数据并不是字符串类型)CREATE FUNCTION dbo.fn_getAcceptanceInfo(@SiteID INT) RETURNS VARCHAR(30) AS BEGIN DECLARE @AppcepIDs VARCHAR(30) DECLARE @TableVariable TABLE(AcceptanceIDs VARCHAR(30)) INSERT INTO @TableVariable(AcceptanceIDs) SELECT AcceptanceIDs FROM JZ_ProjectSite WHERE JZ_ProjectSite.ID = 3@SiteID SELECT @AppcepIDs=AcceptanceIDs FROM @TableVariable RETURN @AppcepIDs; END --传入站点ID。得到该站点未被验收的码表 SELECT * FROM JZ_AcceptanceType WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+',', ','+dbo.fn_getAcceptanceInfo(3)+',' )=0
2.获得该项目涉及的相关专业,转换成字符串
CREATE FUNCTION dbo.fn_getSpecialtyDetail(@SiteID INT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @SpeIDs VARCHAR(50)
DECLARE @TableVariable TABLE(SpecialtyIDs VARCHAR(30))INSERT INTO @TableVariable(SpecialtyIDs) SELECT SpecialtyIDs FROM JZ_ProjectSite WHERE JZ_ProjectSite.ID = @SiteID
SELECT @SpeIDs=SpecialtyIDs FROM @TableVariable
declare @bb varchar(50)
declare @rv varchar(50)
set @rv=''
declare mycursor cursor for
SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+',', ','+@SpeIDs+',' )>0open mycursor
fetch NEXT from mycursor into @bb
while(@@fetch_status=0)
begin
IF @rv=''
BEGIN
set @rv=@bb
END
ELSE
BEGIN
set @bb=','+@bb
set @rv=@rv+@bb
END
fetch NEXT from mycursor into @bb
end
close mycursor
deallocate mycursor
RETURN @rv;
END
--传入站点ID,返回该站点设计的专业
SELECT dbo.fn_getSpecialtyDetail(2) AS SpecialtyDetail
OK了,完毕了
本文出自 “gavin的博客” 博客,请务必保留此出处http://gavin4all.blog.51cto.com/6214841/1078518
相关文章推荐
- 如何使用ArcMap提取地图数据的坐标信息
- 关于连续登录用户数据提取的一点儿思路
- Python分布式爬虫前菜(2):关于提取网页源码中特定信息的技巧
- 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用web_custom_request()提交json数据
- 关于监控日志信息异常:ORA-01403: 未找到任何数据
- C#使用正则表达式提取网页中的信息数据
- 【第一回】对TopoDS_Shape结构数据进行剖分信息提取
- 从powerdesigner中提取数据表的相关信息【转】
- 关于Java字符串中提取自己想要的数据进行计算
- 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用web_custom_request()提交json数据
- ms sql到mysql的移植:关于数据类型移植的一些问题
- 关于h264的avc box中数据的提取。sps pps的获取。
- ABAP--关于存储全局abap类的信息数据表
- 关于将Queue中的数据拼接成xml的经验
- 【任务1】结构体数据组_读取txt文档,提取信息并依次赋给变量
- 关于跨平台信息传输数据-软件开发人员必备知识-软件发展的一大热门趋势
- 关于数据提取一例
- 关于MFC的一些数据之间的转换与提取
- 关于Android 4.0以下版本解析带有bom头信息的json数据
- 关于使用request.querystring提取中文数据的问题