函数返回列分隔的列名列表

时间:2018-01-20 13:24:00

标签: sql sql-server

我想创建一个函数,为任何给定的表返回逗号分隔的字段名称列表。该函数应接受数据库,模式和表名作为输入,以返回逗号分隔列表。

我可以在存储过程中执行此操作,但我想在函数中执行此操作,以便将其加入数据集中。但是我在动作中不允许使用动态sql的问题 - 所以我该怎么办呢?

这是我想在函数中复制的proc

alter proc dbo.usp_generate_column_name_string
@database varchar(100),@schema varchar(100), @table varchar(100)

as

declare @str varchar(max) = '

select stuff((select '','' + name as [text()] from 
(
select c.name from ' + @database + '.sys.tables a
inner join ' + @database + '.sys.schemas b on a.schema_id = a.schema_id
inner join ' + @database + '.sys.columns c on  c.object_id= a.object_id
where b.name = '''+@schema+''' and a.name ='''+@table+''') x

for xml path ('''')),1,1,'''')


'
exec (@str)

go

exec dbo.usp_generate_column_name_string 'test' , 'dbo','jl1_tmp'

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,一种更简单的方法是将proc结果插入临时表并在连接中使用它

create table #coltemp(colList varchar(max))

insert into #coltemp
exec dbo.usp_generate_column_name_string 'test' , 'dbo','jl1_tmp'

select * from #coltemp

检查以下问题,了解将proc结果插入临时表Insert results of a stored procedure into a temporary table

的差异方法

答案 1 :(得分:0)

这是基本的想法:

+8.5 GMT

注意:

  • 这不会处理列名中的特殊字符。我不确定你想要逃避这些,但逻辑很容易调整。
  • 数据库被遗漏了。这在SQL Server中要困难得多,因为系统表是按数据库组织的。如果这是一项要求,你基本上不能这样做(很容易)。