背景:
在项目中,数据库中的一条记录往往在某一字段中包含了更多信息。
比如,在一个涉及基站项目的专业情况时,往往一个基站会做多个专业的工程。专业对照着一张码表。所以,(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+',' )>0
- open 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了,完毕了
转载于:https://blog.51cto.com/gavin4all/1078518