Sql 基于其他表中的列名从列表中动态选择值(反射)
假设我有两个表FOO和BAR,如下所示,如果您知道列名是基于BAR表联接的字符串,那么是否可以对FOO使用某种反射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
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 |
+--------+--------+---------+---------+--------+--------+