当前位置: 代码迷 >> SQL >> [原创]SQL 把表中某一个列依照逗号拼接成一行
  详细解决方案

[原创]SQL 把表中某一个列依照逗号拼接成一行

热度:22   发布时间:2016-05-05 10:54:17.0
[原创]SQL 把表中某一个列按照逗号拼接成一行

在我们开发的过程中,难免遇到一种场景,把某个表中的的某个列的值拼接成用逗号隔开的一行数据

如图:我们把UserId列拼接成一行数据

image-------》image

为此我写了一个存储过程来解决此类问题。

-- Author:        LHM
-- Create date: 2015-01-15

-- Description:    把表中某一个列按照逗号拼接成一行
--示例: EXEC [Sp_TableToString] 'cast([UserId] as varchar)','[X_RoleUser]','RoleId=1'

-- =============================================
CREATE PROCEDURE [dbo].[Sp_TableToString]
    @ColumnName varchar(100),
    @TableName nvarchar(100),
    @Filter varchar(1000)=''
AS
BEGIN
   DECLARE @sql  varchar(500)
   IF(@Filter<>'')
   BEGIN
    SET   @Sql= '   SELECT Result= STUFF(  (  SELECT  '','' + [email protected]+' FROM   [email protected]+  ' WHERE ' [email protected]+ ' FOR XML PATH('''')  ), 1, 1, '''')  '
    END
    ELSE
    BEGIN
    SET   @Sql= '   SELECT Result= STUFF(  (  SELECT  '','' + [email protected]+' FROM   [email protected]+   ' FOR XML PATH('''')  ), 1, 1, '''')  '
    END   
    EXEC   (@Sql)
END

如果有兴趣的朋友可以建立测试表,一下提供建表语句

CREATE TABLE [dbo].[X_RoleUser](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RoleId] [int] NOT NULL,
    [UserId] [int] NOT NULL,
    [Company_Id] [int] NULL,
CONSTRAINT [PK_X_RoleUser] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

添加一些测试数据之后,然后执行存储过程 EXEC [Sp_TableToString] 'cast([UserId] as varchar)','[X_RoleUser]','RoleId=1' 就可以看到测试效果了。

在这有一个问题就是如果表中的要转换的字段不是字符串型的话,此时应该利用Cast函数把它转换成字符串型

希望给遇到此类需求的朋友带来帮助,谨此记录。

如果朋友们觉得以后可能会用到的话,欢迎转载,当然也可以推荐一下,谢谢。

PS:此博文是利用Windows Live Writer 2012编写,格式效果可能不太好。

 

4楼二进制小男人
亲你这个好碉堡,,declare @a nvarchar(max),set @a=#39;#39;,SELECT @[email protected]+#39;,#39;+[证件号], FROM [Stu_4],print @a这一句话不就可以了嘛
Re: Mr.Ming
@二进制小男人 谢谢,思路很多。我把你的思路通用了。,CREATE PROCEDURE [dbo].[Sp_TableToString_Extend], @ColumnName VARCHAR(MAX) ,, @TableName NVARCHAR(100),AS --EXEC [Sp_TableToString_Extend] #39;Name#39;,#39;X_User#39; , BEGIN, DECLARE @sql VARCHAR(500),, SET @sql=#39;,,declare @Result nvarchar(max),set @Result=#39;#39;#39;#39;,SELECT @[email protected]+#39;#39;,#39;#39;+ #39;[email protected]+#39;,FROM #39;[email protected]+#39; SELECT [email protected] #39;,, EXEC (@Sql), END
3楼叼着猫跑的鱼
我在前几天也遇到这个问题,我是这样解决的。SELECT REPLACE(REPLACE((SELECT UserId FROM User FOR XML PATH(#39;#39;)), #39;lt;UserIdgt;#39;, #39;#39;), #39;lt;/UserIdgt;#39;, #39;,#39;) AS IDList
Re: Mr.Ming
@叼着猫跑的鱼,嗯嗯,挺好的,思路很多。我比较喜欢封装成通用的。
2楼Shocker
MySQL函数group_concat()就能实现字段连接,http://www.cnblogs.com/shockerli/p/mysql-group_concat.html
Re: Mr.Ming
@Shocker,谢谢指教,SQL Server好像在2012之前不支持这个函数。MySQL是支持的。
Re: Mr.Ming
@zjeagle,哈哈,适合发首页的定义是?
  相关解决方案