背景:

在项目中,数据库中的一条记录往往在某一字段中包含了更多信息。

比如,在一个涉及基站项目的专业情况时,往往一个基站会做多个专业的工程。专业对照着一张码表。所以,(1,2,5)这样的列数据会随处可见。

目的:

1.希望拿到除开列数据ID中剩下的所有码表数据。

2.希望拿到写入列数据对应的专业详细信息,比如(主体,机房,美化天线)

 

实现关键:

1.表变量

 
  
  1. DECLARE @TableVariable TABLE(SpecialtyIDs VARCHAR(30)) 

说明:表变量无需创建,使用declare声明即可。其声明语法与创建一张表很类似

2.CHARINDEX()函数

 
  
  1. SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+','','+@SpeIDs+',' )>0 

说明:若存在就返回其首字母的位置(>0的整数),若不存在返回0

3.游标

 
  
  1. declare @bb varchar(50)  
  2. declare @rv varchar(50)  
  3. set @rv='' 
  4. --声明游标,针对此次select的结果  
  5. declare mycursor cursor for 
  6. SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+','','+@SpeIDs+',' )>0  
  7. --打开游标  
  8. open mycursor  
  9. --最开始此游标没指向任何记录,fetch NEXT之后指向其第一条记录。并完成赋值  
  10. fetch NEXT from mycursor into @bb  
  11. --检测其状态量,为0时表示有数据  
  12. while(@@fetch_status=0)  
  13. begin 
  14. IF @rv='' 
  15. BEGIN 
  16. set @rv=@bb  
  17. END 
  18. ELSE   
  19. BEGIN 
  20. set @bb=','+@bb  
  21. set @rv=@rv+@bb  
  22. END 
  23. --在此域中循环取值,赋值。  
  24. fetch NEXT from mycursor into @bb  
  25. end 
  26. --关闭声明的游标,使其不具备指向功能  
  27. close mycursor  
  28. --释放该游标持有的资源。  
  29. deallocate mycursor   
  30. --可以发现,返回值@rv是一个由','分隔的字符串  
  31. RETURN @rv; 

 实现代码:

1.获得其已保存的ID,转换成用字符串(select查询完毕的数据并不是字符串类型)

 
  
  1. CREATE FUNCTION dbo.fn_getAcceptanceInfo(@SiteID INT)  
  2. RETURNS VARCHAR(30)  
  3. AS 
  4. BEGIN 
  5. DECLARE @AppcepIDs VARCHAR(30)  
  6. DECLARE @TableVariable TABLE(AcceptanceIDs VARCHAR(30))  
  7. INSERT INTO @TableVariable(AcceptanceIDs) SELECT AcceptanceIDs FROM JZ_ProjectSite WHERE JZ_ProjectSite.ID = 3@SiteID  
  8. SELECT @AppcepIDs=AcceptanceIDs FROM @TableVariable  
  9. RETURN @AppcepIDs;  
  10. END 
  11. --传入站点ID。得到该站点未被验收的码表  
  12. SELECT * FROM JZ_AcceptanceType WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+','','+dbo.fn_getAcceptanceInfo(3)+',' )=0  

 2.获得该项目涉及的相关专业,转换成字符串

 
  
  1. CREATE FUNCTION dbo.fn_getSpecialtyDetail(@SiteID INT)  
  2. RETURNS VARCHAR(50)  
  3. AS 
  4. BEGIN 
  5. DECLARE @SpeIDs VARCHAR(50)  
  6. DECLARE @TableVariable TABLE(SpecialtyIDs VARCHAR(30))  
  7. INSERT INTO @TableVariable(SpecialtyIDs) SELECT SpecialtyIDs FROM JZ_ProjectSite WHERE JZ_ProjectSite.ID = @SiteID  
  8. SELECT @SpeIDs=SpecialtyIDs FROM @TableVariable  
  9.  
  10. declare @bb varchar(50)  
  11. declare @rv varchar(50)  
  12. set @rv='' 
  13. declare mycursor cursor for 
  14. SELECT Specialty FROM JZ_Specialty WHERE CHARINDEX(','+CAST(ID AS VARCHAR(10))+','','+@SpeIDs+',' )>0  
  15. open mycursor  
  16. fetch NEXT from mycursor into @bb  
  17. while(@@fetch_status=0)  
  18. begin 
  19. IF @rv='' 
  20. BEGIN 
  21. set @rv=@bb  
  22. END 
  23. ELSE   
  24. BEGIN 
  25. set @bb=','+@bb  
  26. set @rv=@rv+@bb  
  27. END 
  28. fetch NEXT from mycursor into @bb  
  29. end 
  30. close mycursor  
  31. deallocate mycursor   
  32. RETURN @rv;  
  33. END 
  34. --传入站点ID,返回该站点设计的专业  
  35. SELECT dbo.fn_getSpecialtyDetail(2) AS SpecialtyDetail 

OK了,完毕了