1

我有一张默认有 20 列的表

这 20 列命名为 D1 D2 D3...D20 ,现在使用选择查询我想动态添加其他列.. 对于前 D21 D22...D31,那么我如何编写查询来动态添加这些列并递增value..max 限制为 31,请帮忙

默认表列
D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20

现在我想将列连续添加到 D20 即 D21 等到 D31 ,同时选择此列另一列即来回D21 到 D31 也被添加和选择

查询是

select * ,'  ' as D21 from tbl1

这将给我所有 20 列到 D20 和一个额外的 D21 我希望它到 D31 而无需硬编码其他列名

4

3 回答 3

2

试试下面的代码

declare @a int =21
Declare @sql varchar(max)='select *,'
while @a <32
begin
set @sql = @sql + cast(@a as varchar) + ' as D' + cast(@a as varchar) + ' ,'

set @a = @a+1

end
set @sql = substring(@sql,0,len(@sql)-1) + ' from tbl1'

 exec( @sql)
于 2013-12-11T10:41:23.370 回答
0

使用动态 SQL,您可以执行以下操作:

DECLARE @SQL AS NVARCHAR(MAX) = 'select *';

WITH Numbers (N) AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY object_id) N FROM sys.all_objects
)
SELECT @SQL = @SQL + ', ''  '' as D' + CAST(N AS NVARCHAR) 
FROM Numbers WHERE N BETWEEN 21 AND 31;

SET @SQL = @SQL + ' from tbl1';

EXEC sp_executesql @SQL
于 2013-12-11T10:41:26.770 回答
0

如果您只想使用 SQL 查询编写

希望它可能对你有用。

 with sample as 
       (SELECT 1 + LEVEL-1 idx  
        FROM dual CONNECT BY LEVEL <= 31) 
   select  listagg('D'||idx, ',') 
   within group (order by idx) as list 
   from sample 
   where idx >= 21

请让我们知道它是否适合您。

谢谢和问候, Chiranjeevi。

于 2013-12-11T10:57:48.493 回答