在咱們開發的過程當中,不免遇到一種場景,把某個表中的的某個列的值拼接成用逗號隔開的一行數據sql
如圖:咱們把UserId列拼接成一行數據函數
爲此我寫了一個存儲過程來解決此類問題。spa
-- Author: LHM
-- Create date: 2015-01-15blog-- Description: 把表中某一個列按照逗號拼接成一行
--示例: EXEC [Sp_TableToString] 'cast([UserId] as varchar)','[X_RoleUser]','RoleId=1'ip-- =============================================
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]getGO
it添加一些測試數據以後,而後執行存儲過程 EXEC [Sp_TableToString] 'cast([UserId] as varchar)','[X_RoleUser]','RoleId=1' 就能夠看到測試效果了。
在這有一個問題就是若是表中的要轉換的字段不是字符串型的話,此時應該利用Cast函數把它轉換成字符串型
但願給遇到此類需求的朋友帶來幫助,謹此記錄。
若是朋友們以爲之後可能會用到的話,歡迎轉載,固然也能夠推薦一下,謝謝。
PS:此博文是利用Windows Live Writer 2012編寫,格式效果可能不太好。