SQL存储动态数据

SQL存储动态数据,sql,sql-server,sql-server-2008,stored-procedures,pivot,Sql,Sql Server,Sql Server 2008,Stored Procedures,Pivot,我有一个表,它链接到另一个表,指定键值对的值。然后,值表链接到包含名称(键)的表。表的定义(足够接近)如下所示: --------------- Entity --------------- EntityID Name Some other data --------------- Value ---------------- ValueID EntityID Value --------------- Key --------------- KeyID ValueID Name 每个实体

我有一个表,它链接到另一个表,指定键值对的值。然后,值表链接到包含名称(键)的表。表的定义(足够接近)如下所示:

---------------
Entity
---------------
EntityID
Name
Some other data

---------------
Value
----------------
ValueID
EntityID
Value

---------------
Key
---------------
KeyID
ValueID
Name
每个实体可以有多个值,每个值有一个键。每个实体可能没有相同数量的值。基本上,这种结构允许我动态添加表行,而无需修改实体表

我想在Entity表上执行select*,使用Key.Name字段作为列标题,并显示适当的Value.Values

SQL中是否有一个动态结构,我可以为实体中的每一行插入,然后返回select on


我希望这是有意义的

根据您的描述,听起来您想查看数据。有两种方法可以使用PIVOT实现这一点,一种是对要转换的列进行编码的静态PIVOT,另一种是在执行时确定列的动态PIVOT

静态轴:

select *
from
(
  select e.entityid, v.value,
    e.name EntityName, k.name KeyName
  from value v
  left join entity e
    on v.entityid = e.entityid
  left join [key] k
    on v.valueid = k.valueid
) x
pivot
(
  max(value)
  for KeyName in ([name 1], [name 2], [name 3], [name 4], [name 5])
) p;

动态轴在运行时确定列:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from [key]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT entityid, EntityName, ' + @cols + ' from 
             (
                select e.entityid, v.value,
                  e.name EntityName, k.name KeyName
                from value v
                left join entity e
                  on v.entityid = e.entityid
                left join [key] k
                  on v.valueid = k.valueid
            ) x
            pivot 
            (
                max(value)
                for KeyName in (' + @cols + ')
            ) p '

execute(@query)


这两者都可以放在存储过程中。如果为每个表发布一些示例数据,然后发布所需的结果,那么确定正确的查询就更容易了

这种类型的动态操作非常依赖于系统。您使用的是哪种数据库?此外,您是否仅限于在SQL中执行此操作,或者是否可以使用调用SQL的外部语言?后者会使这更容易。理论上看起来不错,但实际上一点也不好。为什么要将键和值放在不同的表中?这毫无意义,而且肯定会表现不佳。此外,您似乎正在反转键和值的角色,因为它们传统上是在EAV设计中定义的。@RBarryYoung这与表和应用程序代码中的其他内容有关。性能不会是一个问题,因为每个实体类型(此模型针对不同类型的实体重复)都只有少数几个与之相关联的动态列。我设法修改了您的示例,并使其与我的DB一起工作。非常感谢你的帮助!