You can simulate this with dynamic SQL - it's messy, but it works.
with Desired_Columns as (
select s.name as SchemaName
, t.name as TableName
, c.name as ColumnName
, ROW_NUMBER() OVER (ORDER BY s.name, t.name, c.name) as Row_Num
from sys.columns c
inner join sys.tables t
on c.object_id = t.object_id
inner join sys.schemas s
on s.schema_id = t.schema_id
inner join sys.types ty
on c.system_type_id = ty.system_type_id
-- Put in desired datatypes here
where ty.name in ('bit','int')
),
InnerQuery as (
select 'select ''' + ColumnName + ''' as ColName '
+ ', ''' + SchemaName + '.' + TableName + ''' as TableName '
+ ', case when exists (select 1 from ' + SchemaName + '.'
+ TableName + ' where ' + ColumnName + ' = 1) then '
+ '''True'' '
+ 'else NULL end as Has_1 '
+ case when exists (
select 1
from Desired_Columns b
where a.Row_Num < b.Row_Num )
then 'UNION ALL'
else ''
end as Query
, Row_Number() OVER (ORDER BY SchemaName, TableName, ColumnName) as Row_Num
from Desired_Columns a
),
OuterQuery as (
select 'select ColName, TableName from (' as Query
, 0 as Row_Num
union all
select ') t0 where t0.Has_1 is not null ' as Query
, (select max(Row_Num) from InnerQuery) + 1 as Row_Num
),
WholeQuery as (
select *
from OuterQuery
union all
select *
from InnerQuery
)
select Query
from WholeQuery
order by Row_Num
The output of THAT should be something you can copy and paste to get a list of columns. You could potentially use exec() to run the output automatically - my solution is usually good enough for me.