关于sql 动态获取数据的效率问题

场景:有10万+用户 ;假设每个用户对表A的获取的字段都不一样;比如:

1)张三需要表A中的字段a、b、c...
2)李四需要表A中的字段a、b、d...
3)王五需要表A中的字段a、c、d...
4)王六需要表A中的字段b、c、f...
...

请问如果用动态sql语句根据需求去获取是否是最佳的方式?效率如何?
select a,b,c from A
....

建一张表,存储用户对A的需求字段(u_A)
uid A表字段名(ua)
u001 a,b,c,d
u002 a,c,d,f,g
........
建立存储过程
CREATE PROCEDURE [dbo].[TEST1]
@uid varchar(50)
as
begin
declare @s1 nvarchar(max)
set @s1='select '+(select ua from u_A where uid='''+@uid+''') from A'
exec(@s1 )
end

可以用用户表关联A表,然后动态的去不同的字段,不要用子查询去动态的查询不同的参数。

创建一个用户表,表中含有张三、李四、王五、王六...,将用户表关联A表,在A表中添加外键进行关联,用户表作为从表,通过A表的外键属性就可以提取需要的信息

需要有点不明确、分两种方式来回答:

数据结构应该是两张表:
1:用户自定义列表,三个字段如下:

ID、用户ID、对应的A表列名
1 user1 a
2 user1 b
3 user1 c
4 user2 a
5 user2 b
6 user2 d
7 user3 a
.......
建索引 用户ID
2:A表
a、b、c、d、e、f 。。。
建索引 用户ID
如果应用服务器和数据库服务器之间网络没有瓶颈,选择方式一:
把用户自定义列表放入缓存,直接执行select * from A , 在应用服务器,取得缓存中的对应用户的列,使用反射机制set对应的数据,或者不处理,把数据抛到前端处理。
这种方式的原因是sql语句固定,减少数据的预编译,数据库压力最小。大部分开发数据库IO是性能瓶颈,这种是最佳实现。
如果必须取固定列可以使用方案二
在缓存中取出用户需要的列,然后不同的用户执行不同的sql
user1登录,执行 select 对应的A表列名 from 用户自定义列表 where userid =user1 ,然后 for循环拼接成 "a、b、c";
然后把"a、b、c" 当做参数替换 select #para from A ,替换为 select a、b、c from A;
如果纯数据库开发:
同方案二类似,写成存储过程方式。