您的位置:首页 > 数据库

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: