欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据表列值转换为逗号分隔字符串

程序员文章站 2022-05-03 10:43:02
在开发SQL Server语序中,可能需要这样一个要求,把表中某一列的所有值转换为使用逗号分隔的字符串去呈现出来。 举个例子: IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL BEGIN DROP TABLE #tempTable END CREATE ......

在开发sql server语序中,可能需要这样一个要求,把表中某一列的所有值转换为使用逗号分隔的字符串去呈现出来。

举个例子:

 

if object_id('tempdb..#temptable') is not null
begin
 drop table #temptable
end

create table #temptable ([id] int not null,[category] nvarchar(40) null)

insert into #temptable ([id],[category]) values (1,'table'),
                                                (2,'view'),
                                                (3,'store procedure'),
                                                (4,'table-valued function'),
                                                (5,'scalar-valued function'),
                                                (6,'user-defined table type')

select [id],[category] from #temptable

go

 

要求结果,[id]或[category]任意一列,呈现如下:

 

日后,我们不清楚是哪一张表,哪一个字段。

因此,可以写成一个动态的sql 存储过程来处理:

 

set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author:      insus.net
-- create date: 2019-05-11
-- update date: 2019-05-11
-- description: 列值转换为逗号分隔字符串
-- =============================================
create procedure [dbo].[usp_tablecolumnvaluetocommadelimitedstring] (
    @tablename sysname, 
    @columnname    sysname,
    @returnvalue nvarchar(max) output
)    
as
begin        
    declare @sql nvarchar(max) = n'
    declare @temporary_table as table([multirow_comma-delimited_string] nvarchar(max))
    insert into @temporary_table ([multirow_comma-delimited_string])
    select top(1) stuff(
                        replace(
                        rtrim(
                                (select ''|'' + cast('+ @columnname +' as nvarchar(max)) from '+ @tablename +' for xml path('''') )
                            ),
                    ''|'','', ''),
                        1,1,'''') from '+ @tablename +'
    select @returnvalue = [multirow_comma-delimited_string] from @temporary_table'

execute sp_executesql @sql,
                      n'@returnvalue nvarchar(max) output',
                      @returnvalue output

end

 

只要为上面存储过程传入表名,字段名等参数即可得到我们想要的结果: