我有一个包含100列的表,包含布尔值。我想添加一个包含所有先前列的OR结果的列。
现有表格:
web.config
我想获得的内容:
ID, COL1, COL2, COL3, ... , COL100
1, TRUE, FALSE, FALSE, ..., FALSE
2, FALSE, FALSE, TRUE, ..., FALSE
3, FALSE, FALSE, FALSE, ..., FALSE
感谢this post,我知道可以对所有其他列的名称进行硬编码。是否有非硬编码方式?
答案 0 :(得分:3)
您可以使用动态SQL查询。但我不知道这会有多高效。
我假设列col1
,col2
,....位于varchar
数据类型
<强>查询强>
declare @sql as varchar(max);
select @sql = stuff((select '+ case ' + column_name
+ ' when ' + char(39) + 'true' + char(39)
+ ' then 1 else 0 end '
from information_schema.columns
where table_name = 'your_table_name'
and column_name <> 'Id'
for xml path('')
), 1, 1, '');
select @sql = 'select *, case when('
+ @sql +
') > 0 then ' + char(39) + 'True' + char(39)
+ ' else ' + char(39) + 'False' + char(39) + ' end Result
from your_table_name;';
exec(@sql);
答案 1 :(得分:2)
动态SQL可以通过访问sys.columns来做到这一点,但是...... SQL不是为整体这种操作而设计的。
DECLARE @sConcat varchar(max) = ''
select @sConcat = @sConcat + + c.name + ' = ''TRUE'' OR '
from sys.tables t
inner join sys.columns c
on c.object_id = t.object_id
where t.name = 'MyTable'
and c.name like 'COL%';
EXEC (' SELECT ID, CASE WHEN ' + LEFT(@sConcat, LEN(@sConcat)-3) + ' THEN ''TRUE'' ELSE ''FALSE'' END RESULT FROM MyTable ')
使用此结果做您需要的任何事情。我建议你创建你的RESULT列并将它放到INSERT / UPDATE的触发器中。