我有两张桌子,我想把它们组合成一个视图。第一个表包含结构:
模板表
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
这可能吗?我一直试图让它与数据透视表一起工作,但我对如何使用标题作为数据列感到兴奋。
答案 0 :(得分:1)
好吧,我对这个有点过分,但这会做你想要的。此过程将所有字段与正确的数据表列组合在一起,并且不需要知道也不关心数据表中有多少列。
它不使用游标,但由于可能有许多模板表,它确实使用动态SQL为最终返回生成Select
语句。
唯一需要注意的是它不是View
,它是stored procedure
,因为它允许传递您想要最终选择的数据表的变量。
假设:
* - 当然可以通过修改模板表模式来改进字段标题所属的数据表的字段,例如,这将删除此假设#3。
流程:
首先,我们需要字段名称,参考ID和列标题的映射。我们使用table variable
执行此操作,并从syscolumns
获取我们的信息。然后,我们更新临时表以获取TemplateTable table
的标题。
然后,我们需要从DataTable构建一个动态Select
列表(这是SP中的一个参数,因此需要一些动态SQL来执行)。我这样做的首选方法是在源表中添加一个我可以更新的位列,比如'IsCompleted',然后使用常规While
循环来遍历每一行。在While循环中,我们所做的就是从临时表变量中获取当前的“TitleReference”,并在syscolumns中附加实际字段名称(从上面的第一步开始)。
最后,我们执行具有Select
的动态SQL语句,当它在执行的stored procedure
内时,结果将作为{{1的结果返回}}。
完整工作代码
stored procedure
结果
希望这有帮助,写它很有趣!
答案 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