Это всего лишь предположение, но вот один из подходов, который будет использовать небольшой XML для решения этой проблемы
* ** 1003 тысяча два * Пример
Declare @YourTable Table (ID int,Col1 varchar(50),Col2 varchar(50),Col3 varchar(50))
Insert Into @YourTable Values
(1,'HasValue',null,null)
,(2,'HasValue',null,'ValueHere')
Select A.*
,C.*
From @YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Columns = Stuff((Select ',' +Item
From (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From XMLData.nodes('//@*') xNode(xAttr)
Where xAttr.value('local-name(.)','varchar(100)') not in ('ID','OtherColumns','ToExclude')
)C1
For XML Path ('')),1,1,'')
) C
Returns
ID Col1 Col2 Col3 Columns
1 HasValue NULL NULL Col1
2 HasValue NULL ValueHere Col1,Col3