使用另一个表中的字段创建视图作为列标题

时间:2014-01-14 15:44:54

标签: tsql

我有两张桌子,我想把它们组合成一个视图。第一个表包含结构:

模板表

componentID | title
======================
1000        | blue
1001        | red
1002        | orange

第二个表包含将要存储的实际数据,列引用第一个表的ID:

数据表

id | field1000 | field1001 | field1002
======================================
1  | navy      | ruby      | vermilion
2  | midnight  | crimson   | amber

我希望在视图中得到什么:

合并表/视图?

id | blue     | red     | orange
=================================
1  | navy     | ruby    | vermilion
2  | midnight | crimson | amber

这可能吗?我一直试图让它与数据透视表一起工作,但我对如何使用标题作为数据列感到兴奋。

2 个答案:

答案 0 :(得分:1)

好吧,我对这个有点过分,但这会做你想要的。此过程将所有字段与正确的数据表列组合在一起,并且不需要知道也不关心数据表中有多少列。

它不使用游标,但由于可能有许多模板表,它确实使用动态SQL为最终返回生成Select语句。

唯一需要注意的是它不是View,它是stored procedure,因为它允许传递您想要最终选择的数据表的变量。

假设:

  1. 模板表是静态的
  2. 所有数据表都有一个模板表
  3. 任何数据表中的所有字段都必须是唯一的*
  4. 所有数据表都有一个PK / identity字段,其中包含“id”一词,必须予以忽略
  5. 数据表中的所有字段在模板表中都有相应的标题
  6. 数据表中的所有字段都以“字段”为前缀,模板表中的所有参考ID都与删除了“字段”的字段名称相对应,具体取决于您的示例
  7. * - 当然可以通过修改模板表模式来改进字段标题所属的数据表的字段,例如,这将删除此假设#3。

    流程:

    • 首先,我们需要字段名称,参考ID和列标题的映射。我们使用table variable执行此操作,并从syscolumns获取我们的信息。然后,我们更新临时表以获取TemplateTable table的标题。

    • 然后,我们需要从DataTable构建一个动态Select列表(这是SP中的一个参数,因此需要一些动态SQL来执行)。我这样做的首选方法是在源表中添加一个我可以更新的位列,比如'IsCompleted',然后使用常规While循环来遍历每一行。在While循环中,我们所做的就是从临时表变量中获取当前的“TitleReference”,并在syscolumns中附加实际字段名称(从上面的第一步开始)。

    • 最后,我们执行具有Select的动态SQL语句,当它在执行的stored procedure内时,结果将作为{{1的结果返回}}。

    完整工作代码

    stored procedure

    结果

    the result

    希望这有帮助,写它很有趣!

答案 1 :(得分:0)

这些内容

DECLARE @f0 VARCHAR(50)=(SELECT title FROM template WHERE componentID=1000)
DECLARE @f1 VARCHAR(50)=(SELECT title FROM template WHERE componentID=1001)
DECLARE @f2 VARCHAR(50)=(SELECT title FROM template WHERE componentID=1002)
@sql='SELECT field1000 AS ' + quotename(@f0)  + ' field1001 AS ' + quotename(@f1)  + ' field1002 AS ' + quotename(@f2) + ' FROM data'
exec sp_executesql @sql