我有一个包含许多列的表(动态生成的列)和一个USER_KEY
行(类型为INT
)。
动态添加列的类型为DECIMAL(15,2)
。
我的表格如下:
我想要做的是获取该行中所有列的每个用户的摘要。由于动态生成了这么多,我不能硬打字。怎么做?
我还有变量@COLDEPARTMENTS
,其中所有动态列都用逗号分隔,如下所示:
[120000003],[120000002],[140000001],[120000005],[120000021],[120000025]
答案 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}'