Sql 基于其他表中的列名从列表中动态选择值(反射)

Sql 基于其他表中的列名从列表中动态选择值(反射),sql,sql-server,Sql,Sql Server,假设我有两个表FOO和BAR,如下所示,如果您知道列名是基于BAR表联接的字符串,那么是否可以对FOO使用某种反射 SELECT DB, FOO.Name, FOO.Type, BAR.Field, I.DATA_TYPE AS FType, FOO.**<BAR.FIELD>** AS Value FROM INFORMATION_SCHEMA.COLUMNS AS I inner JOIN BAR ON I.COLUMN_NAME = BAR.Field inner JOIN

假设我有两个表FOO和BAR,如下所示,如果您知道列名是基于BAR表联接的字符串,那么是否可以对FOO使用某种反射

SELECT DB, FOO.Name, FOO.Type, BAR.Field, I.DATA_TYPE AS FType, FOO.**<BAR.FIELD>** AS Value
FROM INFORMATION_SCHEMA.COLUMNS AS I  
inner JOIN BAR ON I.COLUMN_NAME = BAR.Field
inner JOIN FOO ON FOO.TYPE = BAR.TYPE
WHERE DB = 4 AND FLAG = 1
酒吧:

结果:

+--------+--------+---------+---------+--------+--------+
|   DB   | Name   | Type    | Field   |  FTYPE |  VALUE |
+--------+--------+---------+---------+--------+--------+
|   4    | AC1    | LO      | Col1    |  float |  1     |
|   4    | AC1    | HI      | Col1    |  float |  2     |
|   4    | AC1    | LO      | Col2    |  float |  10    |
|   4    | AC1    | HI      | Col2    |  float |  20    |
|   4    | AC1    | LO      | Col3    |  float |  2     |
|   4    | AC1    | HI      | Col3    |  float |  4     |
+--------+--------+---------+---------+--------+--------+

“如果您知道列名是基于条形表联接的字符串,那么是否可以对FOO使用某种反射?”
是,但它需要使用
,因此您建议在DAL端构建SQL,在每个列名中插入一个select块,然后将所有选择与UNION all缝合在一起?这正是我试图避免的,因为它仍然需要2次调用,以便我获得所有可能的列名的列表。在服务器上,除了动态sql之外,没有其他方法可以实现这一点。你可以用这些动态的东西创建sp,然后从客户端使用它。不,我不是建议使用union all或任何类似的东西。可以编写一个存储过程,动态创建SQL(单击第一条注释中的动态SQL以获取解释),然后执行SQL并返回所需的结果集。这种方法的缺点是动态SQL不能从预编译中获得好处。然而,这将是一次减少代码路径的旅行。您试图进行的“某种反射”称为动态SQL。现在我仔细看了一下,我真的认为您所需要的只是了解系统表和pivot语句。information_schema.columns要根据表名获取Ftype和列名,请使用表本身获取每个字段的值。它可能是动态SQL和系统表以及pivot的组合来完成这一切。。。
+--------+--------+---------+---------+--------+
|   DB   | Name   | Type    | Field   |  Flag  |
+--------+--------+---------+---------+--------+
|   4    | AC1    | LO      | Col1    |  1     |
|   4    | AC1    | HI      | Col1    |  1     |
|   1    | DC2    | HI-HI   | Col1    |  1     |
|   1    | DC2    | HI      | Col1    |  1     |
|   1    | DC2    | LO      | Col1    |  1     |
|   4    | AC1    | LO      | Col2    |  0     |
|   4    | AC1    | HI      | Col2    |  0     |
|   1    | DC2    | LO      | Col2    |  0     |
|   1    | DC2    | HI-HI   | Col2    |  0     |
|   1    | DC2    | HI      | Col2    |  0     |
|   4    | AC1    | LO      | Col3    |  0     |
|   4    | AC1    | HI      | Col3    |  0     |
|   1    | DC2    | LO      | Col3    |  0     |
|   1    | DC2    | HI-HI   | Col3    |  0     |
|   1    | DC2    | HI      | Col3    |  0     |
+--------+--------+---------+---------+--------+
+--------+--------+---------+---------+--------+--------+
|   DB   | Name   | Type    | Field   |  FTYPE |  VALUE |
+--------+--------+---------+---------+--------+--------+
|   4    | AC1    | LO      | Col1    |  float |  1     |
|   4    | AC1    | HI      | Col1    |  float |  2     |
|   4    | AC1    | LO      | Col2    |  float |  10    |
|   4    | AC1    | HI      | Col2    |  float |  20    |
|   4    | AC1    | LO      | Col3    |  float |  2     |
|   4    | AC1    | HI      | Col3    |  float |  4     |
+--------+--------+---------+---------+--------+--------+