每行动态添加列的摘要

时间:2017-02-21 10:31:04

标签: sql-server tsql

我有一个包含许多列的表(动态生成的列)和一个USER_KEY行(类型为INT)。

动态添加列的类型为DECIMAL(15,2)

我的表格如下:

enter image description here

我想要做的是获取该行中所有列的每个用户的摘要。由于动态生成了这么多,我不能硬打字。怎么做?

我还有变量@COLDEPARTMENTS,其中所有动态列都用逗号分隔,如下所示:

[120000003],[120000002],[140000001],[120000005],[120000021],[120000025]

3 个答案:

答案 0 :(得分:1)

我假设您正在使用临时表

select * 
from tempdb.INFORMATION_SCHEMA.COLUMNS
where table_name like '#MyTempTable%'

请参阅How to retrieve field names from temporary table (SQL Server 2008)

答案 1 :(得分:1)

您可以使用以下脚本将所有自动生成的列作为单行以逗号分隔。

Declare @tmp varchar(250)
SET @tmp = ''
select @tmp = @tmp + Column_Name + ', ' from [AdventureWorksDW2014].INFORMATION_SCHEMA.COLUMNS
where table_name like '%FactInternetSales%'

select SUBSTRING(@tmp, 0, LEN(@tmp)) as Columns

您还可以将结果存储在变量中,并将其与原始表一起使用。

答案 2 :(得分:1)

如果您要确定哪些列具有值,并且您不想输入列名称。然后以下应该做你想要的。

SELECT 'SELECT user_key, '+ 
       + cols.ColumnList + CHAR(10) +
       + ' FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + CHAR(10)
FROM   sys.tables t
       CROSS APPLY (SELECT DISTINCT STUFF(
                    ( SELECT CHAR(10) + CHAR(9) + ', ' 
                             + QUOTENAME(c.name) + ' = CASE WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN 1 ELSE 0 END'
                      FROM   sys.columns c 
                      WHERE  c.object_id = t.object_id
                      AND    c.name != 'user_id'
                      FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,3,'') AS ColumnList
            )cols 
WHERE  t.name = '{TABLE NAME}'