Sql server 每行动态添加列的摘要
我有一个包含许多列(动态生成的列)的表和一个包含Sql server 每行动态添加列的摘要,sql-server,tsql,Sql Server,Tsql,我有一个包含许多列(动态生成的列)的表和一个包含USER\u KEY(类型为INT)的行 动态添加列的类型为十进制(15,2) 我的桌子看起来像这样: [120000003],[120000002],[140000001],[120000005],[120000021],[120000025] 我想做的是获取该行中所有列的每个用户的摘要。因为有这么多的动态生成的,我不能硬类型这个。如何做到这一点 我还有变量@COLDEPARTMENTS,其中所有动态列都用逗号分隔,如下所示: [120000
USER\u KEY
(类型为INT
)的行
动态添加列的类型为十进制(15,2)
我的桌子看起来像这样:
[120000003],[120000002],[140000001],[120000005],[120000021],[120000025]
我想做的是获取该行中所有列的每个用户的摘要。因为有这么多的动态生成的,我不能硬类型这个。如何做到这一点
我还有变量@COLDEPARTMENTS
,其中所有动态列都用逗号分隔,如下所示:
[120000003],[120000002],[140000001],[120000005],[120000021],[120000025]
我假设您使用的是临时表
select *
from tempdb.INFORMATION_SCHEMA.COLUMNS
where table_name like '#MyTempTable%'
请参考我假设您使用的是临时表
select *
from tempdb.INFORMATION_SCHEMA.COLUMNS
where table_name like '#MyTempTable%'
请参阅您可以使用下面的脚本将所有自动生成的列作为单行,并用逗号分隔
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
您还可以将结果存储在变量中,并将其与原始表一起使用。您可以使用下面的脚本将所有自动生成的列作为一行,以逗号分隔
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
您还可以将结果存储在变量中,并将其与原始表一起使用。如果您试图识别哪些列具有值,并且不想键入列名。那么下面的内容应该是你想要的
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}'
如果您试图识别哪些列具有值,并且不想键入列名。那么下面的内容应该是你想要的
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}'