在动态查询SQL Server中显示每列的别名

在动态查询SQL Server中显示每列的别名,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一张桌子 create table demo(id int, dataval varchar(50)) insert into demo select 1, 'val' union select 2, 'val1' union select 3, 'val3' 我正在尝试使用下面的查询获取变量中由max包围的dataval列的值列表 DECLARE @maxcols AS NVARCHAR(MAX) SELECT @maxcols = STUF

我有一张桌子

create table demo(id int, dataval varchar(50))

insert into demo 
    select 1, 'val'
    union
    select 2, 'val1'
    union
    select 3, 'val3'
我正在尝试使用下面的查询获取变量中由max包围的dataval列的值列表

DECLARE @maxcols AS NVARCHAR(MAX)

SELECT @maxcols = STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME([dataval] ) + ') AS [val]' 
                         FROM demo
                         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SELECT @maxcols AS val
我的价值越来越低

max([val])as [val],max([val1])as [val],max([val3])as [val]
此处别名为静态值[val]。我需要别名显示为列值

预期产出:

max([val])as [val1],max([val1])as [val2],max([val3])as [val3]

有人能帮上忙吗?

您可以使用以下行号:

DECLARE 
     @maxcols AS NVARCHAR(MAX)
select @maxcols = STUFF((SELECT distinct ',' + 'max('+QUOTENAME([dataval] )+')as [val'+ convert(varchar(10), Row_Number() over (order by (SELECT NULL))) + ']' 
                    from  demo
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @maxcols as val
+---------------------------------------------------------------+
|                              val                              |
+---------------------------------------------------------------+
| max([val])as [val1],max([val1])as [val2],max([val3])as [val3] |
+---------------------------------------------------------------+
输出如下:

DECLARE 
     @maxcols AS NVARCHAR(MAX)
select @maxcols = STUFF((SELECT distinct ',' + 'max('+QUOTENAME([dataval] )+')as [val'+ convert(varchar(10), Row_Number() over (order by (SELECT NULL))) + ']' 
                    from  demo
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @maxcols as val
+---------------------------------------------------------------+
|                              val                              |
+---------------------------------------------------------------+
| max([val])as [val1],max([val1])as [val2],max([val3])as [val3] |
+---------------------------------------------------------------+

想要max[val]作为[val1],max[val1]作为[val2]的逻辑是什么?它不符合您的要求,我需要别名显示为列值。为什么不能对别名使用与列相同的动态技术?我尝试将别名值设置为动态。但是我得到了错误。发布你的尝试,使他们动态和你得到的错误。回答被问到的问题+1,但我99%肯定这不会解决OP的实际问题。谢谢。但是我把val1,val2放在这里是为了演示。实际的表大约有100多个变量,其中dataval中有varchar值column@bmsqldev无法理解您的问题。。。您可以使用Concat,它将自动转换为实际表中所需的varchar DATATYPE。列不是后缀数字。对不起,我认为您的答案将按顺序为每列指定数字。但预期产出是不同的。例如,dataval列中有一些值,如美国、印度、英国等。如何处理这些值?