2017-10-12 52 views
-1

我有下表。显示动态查询中每列的别名SQL Server

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

insert into demo 
    select 1, 'val' 
    union 
    select 2, 'val1' 
    union 
    select 3, 'val3' 

我尝试使用下面的查询

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()包围dataval列的值的列表。

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] 

可能有人在帮助呢?

+1

有什么想'MAX([VAL])为[VAL1],最大背后的逻辑([VAL1] )为[val2]'?它不符合你所要求的“我需要将别名显示为列值”。为什么你不能使用相同的动态技术来处理你用于列的别名? –

+0

我试图让别名值为动态。但我得到错误.. – bmsqldev

+1

发布你的尝试,使他们动态和你得到的错误。 –

回答

3

您可以使用ROW_NUMBER如下:如下

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] | 
+---------------------------------------------------------------+
+2

+1回答了被问到的问题,但我99%确定这不会解决OP的实际问题。 –

+0

谢谢。但是我把val1,val2作为示范目的。实际的表是有大约100 + varchar值在dataval列 – bmsqldev

+0

@bmsqldev无法理解您的问题...您可以使用Concat,它会自动转换为所需的varchar数据类型 –