Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用select查询动态添加列_Sql_Sql Server_Sql Server 2008_Dynamic Queries - Fatal编程技术网

Sql 使用select查询动态添加列

Sql 使用select查询动态添加列,sql,sql-server,sql-server-2008,dynamic-queries,Sql,Sql Server,Sql Server 2008,Dynamic Queries,我有一个表,默认有20列 这20列被命名为D1 D2 D3…D20, 现在使用select查询,我想动态添加其他列。。对于ex D21 D22…D31, 那么,我如何编写一个查询,以使用递增的值动态添加这些列..最大限制为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

我有一个表,默认有20列

这20列被命名为D1 D2 D3…D20, 现在使用select查询,我想动态添加其他列。。对于ex D21 D22…D31, 那么,我如何编写一个查询,以使用递增的值动态添加这些列..最大限制为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

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)

使用动态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

如果只想使用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
请让我们知道它是否适合您

感谢和问候, 奇兰杰维