[原創]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編寫,格式效果可能不太好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM