Вы можете использовать apply
:
select t.name, t.sex, v.type, v.value
from t cross apply
(values ('A', t.A), ('B', t.B), ('C', t.C)) v(type, value)
where v.value is not null;
Если вам нужно сделать это «автоматически», создайте представление:
create view v_t as
select t.name, t.sex, v.type, v.value
from t cross apply
(values ('A', t.A), ('B', t.B), ('C', t.C)) v(type, value)
where v.value is not null;
Хранимая процедура не требуется.