SQL将多行连接显示
时间:2010-10-18 来源:zhuibobo
select * from view_1
select distinct Id,Name, rolekey=
(
select roleName as [data()] from view_1 where view_1.id =view_1.id for xml path ('')
)
from view_1
原始表
0000-0000-0000-0001 其他类型? NULL null 1 权限6
0000-0000-0000-0001 其他类型? NULL null 1 权限3
0000-0000-0000-0001 其他类型? NULL null 1 权限5
0000-0000-0000-0001 其他类型? NULL null 1 权限1
0000-0000-0000-0001 其他类型? NULL null 1 权限7
0000-0000-0000-0001 其他类型? NULL null 1 权限2
0000-0000-0000-0001 其他类型? NULL null 1 权限4
结果表
0000-0000-0000-0001 其他类型? 权限6 权限3 权限5 权限1 权限7 权限2 权限4
函数方式
创建函数
USE [Portal]
GO
/****** Object: UserDefinedFunction [dbo].[ConvertVertToHorz] Script Date: 10/18/2010 14:34:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ConvertVertToHorz](@Col1Val varchar(50))
RETURNS VARCHAR(8000)
AS
BEGIN
-- 实际项目中,应该考虑 @RetVal 是否会超过 8000 个字符
DECLARE @RetVal varchar(8000)
SET @RetVal = ''
-- 通过递归 SELECT 连接指定列存储到临时变量中
SELECT @RetVal = RoleName + ',' + @RetVal FROM view_1 WHERE id = @Col1Val
-- 连接多列
-- SELECT @RetVal = Column2 + ',' + Column3 + ',' + Column4 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
-- 去掉尾巴的 , (逗号)
IF LEN(@RetVal) > 0
SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
--PRINT @RetVal
RETURN @RetVal
END
查询
SELECT distinct Id, dbo.ConvertVertToHorz(Id) rolekey
FROM view_1
原始表
0000-0000-0000-0001 其他类型? NULL null 1 权限6
0000-0000-0000-0001 其他类型? NULL null 1 权限3
0000-0000-0000-0001 其他类型? NULL null 1 权限5
0000-0000-0000-0001 其他类型? NULL null 1 权限1
0000-0000-0000-0001 其他类型? NULL null 1 权限7
0000-0000-0000-0001 其他类型? NULL null 1 权限2
0000-0000-0000-0001 其他类型? NULL null 1 权限4
结果表
0000-0000-0000-0001 权限4,权限2,权限7,权限1,权限5,权限3,权限6