Sql 在子查询中将列值用作列名

Sql 在子查询中将列值用作列名,sql,sql-server,sql-server-2008,tsql,unpivot,Sql,Sql Server,Sql Server 2008,Tsql,Unpivot,我正在使用一个遗留数据库,它有一个表,其中包含来自其他表的字段名 所以我有这个结构: Field_ID | Field_Name ********************* 1 | Col1 2 | Col2 3 | Col3 4 | Col4 我需要为给定的用户提取一个字段元数据列表以及该字段的值。因此,我需要: Field_ID | Field_Name | Value 1 | Col1 | ValueOfCol1onADiffTable 2 | Col2 | Va

我正在使用一个遗留数据库,它有一个表,其中包含来自其他表的字段名

所以我有这个结构:

Field_ID | Field_Name
*********************
1 | Col1  
2 | Col2  
3 | Col3  
4 | Col4  
我需要为给定的用户提取一个字段元数据列表以及该字段的值。因此,我需要:

Field_ID | Field_Name | Value  
1 | Col1 | ValueOfCol1onADiffTable  
2 | Col2 | ValueOfCol2onADiffTable  
3 | Col3 | ValueOfCol3onADiffTable  
4 | Col4 | ValueOfCol4onADiffTable  
我想在子查询中使用字段\ u Name来提取该值,但不知道如何让SQL将字段\ u Name作为子查询中的一列进行计算

比如说:

select
        Field_ID
      ,Field_Name
      ,(SELECT f.Field_Name from tblUsers u 
    where u.User_ID = @userId) as value
from 
  dbo.tblFields f 
但这只是返回值列中的字段名称,而不是它的值


我是否需要将子查询放在单独的函数中并对其求值?或者某种动态SQL?

在SQL server中,这需要动态SQL和UNPIVOT表示法。


表有列,而不是字段。根据您的需要立即执行或执行类似操作RDBMS@jarlh-明白。我没有编写原始模式,也没有更改它的选项。在本例中,列的名称是字段\ u Name,etc@Randy-MSSQL,sql server 2016我相信什么味道和版本的sql?演示程序按预期工作,但有一个缺点。。。我简化了我的例子。现实世界的版本需要在两个不同的表中查找“值”tblUsers和tblUsers_程序_历史_细节。我可以加入它们,但sql会抱怨,因为它上面有两个用户id实例我正在使用的动态sql语句:select Field\u id,case当DB\u Field\u Name为null时,则Field\u Name else DB\u Field\u Name结束为FieldName,Field\u Name,DB\u Field\u Name,正确的\u标签,FieldCategory,dbo.tblbographic_字段f join SELECT*from SELECT*from tblUsers u internal join tblUsers_program_history_详细信息h on u.User_ID=h.User_ID,其中h.User_ID=1 src unpivot字段值在t.field=DB_字段上“+@cols+”up t中_Name@SamR. 您还可以查看相关列的tblUsers和tblUsers的并集\u程序\u历史\u详细信息您应该在此处显式地放置列列表,而不是*:select*from tblUsers u inner join tblUsers\u程序\u历史\u详细信息表格不必具有相同的并集列吗?
create table tblFields (Field_ID int ,Field_Name varchar(10));
insert into tblFields values
(1,'Col1')
,(2,'Col2')
,(3,'Col3')
,(4,'Col4');
declare @userId int
set @userId=1

create table tblUsers (User_ID int, col1 varchar(10),col2 varchar(10));
insert into tblUsers values
(1, 10,100),
(2,20,200);

declare @collist varchar(max)
declare @sqlquery varchar(max)

select @collist= COALESCE(@collist + ', ', '') + Field_Name
from dbo.tblFields
where exists (
       select * from sys.columns c join sys.tables t 
       on c.object_id=t.object_id and t.name='tblUsers'
       and c.name =Field_Name)
select @sqlquery=
' select Field_ID ,Field_Name, value '+
' from dbo.tblFields f  Join '+
' ( select  * from '+
'( select * '+
' from tblUsers u '+
' where u.User_ID = '+ cast(@userId as varchar(max)) +
' ) src '+
'unpivot ( Value for field in ('+ @collist+')) up )t'+
' on t.field =Field_Name'
exec(@sqlquery)