最近做项目的时候有一个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一列的Country不同,所以会显示多条数据,现打算把具有相同ID的不同Country合并成一条数据,并显示该ID对应的所有的Country。
实现之前的效果是:
欲实现的效果是(此处的分隔符 ‘/’ 可以替换成想要的字符):
现列举数据库的三个表关系如下:
接下来介绍一下实现的存储过程:
1 USE [LenovoChecklist] 2 GO 3 /****** Object: StoredProcedure [dbo].[PROC_yangzehuatest] Script Date: 03/12/2014 11:18:33 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 9 ALTER PROCEDURE [dbo].[PROC_yangzehuatest] 10 11 @projectid int 12 --@AllNames nvarchar(500) = ‘‘ output --此注释部分可以供其他sql语句调用,在项目中暂时没用到 13 AS 14 BEGIN 15 16 --声明变量 17 declare @countrynames nvarchar(500) ; 18 set @countrynames=‘‘; 19 declare @tempname nvarchar(50); 20 21 --声明临时表 22 declare @temptable TABLE 23 ( 24 tempid int identity(1,1), 25 pro_id int , 26 ProjectName nvarchar (50), 27 CountryName nvarchar(50) 28 ) ; 29 30 --插入临时表 31 Insert into @temptable (pro_id, ProjectName,CountryName) 32 SELECT CL_Project.ProjectID, CL_Project.ProjectName,CL_Country.CountryName 33 FROM CL_Country INNER JOIN 34 CL_ProjectCountry ON CL_Country.CountryID = CL_ProjectCountry.CountryID INNER JOIN 35 CL_Project ON CL_ProjectCountry.ProjectID = CL_Project.ProjectID 36 where CL_Project.ProjectID =@projectid 37 38 --遍历临时表 39 while exists(select CountryName from @temptable where pro_id=@projectid) 40 begin 41 --获取CountryName并拼接到@countrynames 42 set @tempname = (select top(1) CountryName from @temptable where pro_id=@projectid); 43 set @countrynames=@countrynames+‘/‘+@tempname; 44 --遍历过一条之后删除该条数据,继续遍历 45 delete @temptable where tempid=(Select top (1) tempid from @temptable); 46 end 47 48 --删除第一个‘/‘ 49 if (LEN(@countrynames)>1) 50 set @countrynames=SUBSTRING(@countrynames,2,LEN(@countrynames)-1); 51 else 52 set @countrynames=‘no country‘; 53 54 select @projectid as ProjectID, @countrynames as CountryName ; 55 -- set @AllNames=@countrynames; --此注释部分可以供其他sql语句调用,在项目中暂时没用到 56 57 58 END
至此,希望有所帮助。