动态列名称

时间:2010-07-09 16:48:57

标签: sql-server-2008 dynamic sql-view

是否可以使用基于另一个表的动态列名创建视图(非存储过程)?例如:

Code:
CodeId|Description
------------------
     1|Title
     2|Notes

Data:
DataId|Content|CodeId|GroupId
-----------------------------
     1|Title1 |     1|      1
     2|Note1  |     2|      1
     3|Title2 |     1|      2
     4|Note2  |     2|      2

Select Result:
GroupId|Title |Notes
-------------------
      1|Title1|Note1
      2|Title2|Note2

列名“Title”和“Notes”将来自Code表。我猜的答案是否定的,但想确认一下。谢谢!

编辑:我理解这可能是“危险的”。如果有人更新代码描述,视图将会更改,从而破坏依赖于列名的任何SQL。在这种情况下,我可以使用CodeId代替,但不允许更改。

3 个答案:

答案 0 :(得分:1)

我在想,更糟糕的是,你可以做一些事情,其中​​返回的第一行包含所有列标题。会有点棘手,你可能不得不遭受UNION的性能损失,但听起来可行。

答案 1 :(得分:1)

您可以使用Java或C编写程序,或者使用数据库中的值动态创建“create view”语句,然后执行它。

如果您正在寻找一种只使用SQL语句的方法,我同意答案可能是“无法完成”,但我不愿意做出这样的陈述,因为人们总是想出聪明的话做一些我从未想过的事情。

答案 2 :(得分:1)

EAV(实体 - 属性 - 价值)模型的危险很多,你只是为将来的大量头痛做好准备。话虽如此,你的具体问题似乎可以解决。你被警告了......

您可以通过在代码表上放置触发器来完成此操作。每当有人添加,删除或更新表中的一行时,触发器将负责使用正确的语句重新创建视图。