zoukankan      html  css  js  c++  java
  • [原创]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  '','' + '+@ColumnName+' FROM   '+@TableName+  ' WHERE ' +@Filter+ ' FOR XML PATH('''')  ), 1, 1, '''')  '
        END
        ELSE
        BEGIN
        SET   @Sql= '   SELECT Result= STUFF(  (  SELECT  '','' + '+@ColumnName+' FROM   '+@TableName+   ' 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编写,格式效果可能不太好。

  • 相关阅读:
    519,伪类和伪元素的区别
    518,自定义字体的使用场景
    517,sytlus/sass/less的区别
    516,base64的原理及优缺点
    515,前端性能优化--减少http请求(待补充)
    514 ,css不同选择器的权重(css层叠的规则)
    513,如果需要手写动画,你认为最小时间间隔是多久,为什么?
    512,a标签的target属性
    511,display:inline-block什么时候不会显示间隙?
    510,position的值,relative和absolute定位原点是
  • 原文地址:https://www.cnblogs.com/lhmlyx2723356/p/4216109.html
Copyright © 2011-2022 走看看