Asp.net 将数据从名称-值对表中获取到数据集的高效SQL过程?

Asp.net 将数据从名称-值对表中获取到数据集的高效SQL过程?,asp.net,sql-server,entity-attribute-value,Asp.net,Sql Server,Entity Attribute Value,使用SQL Server,创建一个名称-值对表。每一行基本上都是userid、contentid、sectionid、parameter和value。所以我想在一个表中显示一些数据,比如用户信息。每一位信息都在它自己的行中,所以如何将其放入数据集中以供中继器使用?我能把这些行合并成一行吗?所以我可以在一行上获得多个参数/值对 就像 用户32有两行: (param / value) fname / Bob lname / Smith 显示在中继器的一行上,如下所示: Bob Smith SEL

使用SQL Server,创建一个名称-值对表。每一行基本上都是userid、contentid、sectionid、parameter和value。所以我想在一个表中显示一些数据,比如用户信息。每一位信息都在它自己的行中,所以如何将其放入数据集中以供中继器使用?我能把这些行合并成一行吗?所以我可以在一行上获得多个参数/值对

就像

用户32有两行:

(param / value)
fname / Bob
lname / Smith
显示在中继器的一行上,如下所示:

Bob Smith
SELECT   UserID,
         MAX(CASE WHEN param = 'fname' THEN value ELSE '' END) AS fname,
         MAX(CASE WHEN param = 'lname' THEN value ELSE '' END) AS lname
FROM     MyEAVTable
GROUP BY UserID
有什么想法吗?哦,是的,它采用名称/值对格式的原因是为了遵守所需的标准。

糟糕的标准……)


无论如何,最好的办法是对存储过程使用一些魔法(光标),并以所需的格式从存储过程返回数据。那么绑定到数据集或字符串列表就很简单了。

可能类似于

SELECT fff.firstname, lll.lastname
FROM (
  SELECT ff.value AS firstname
  FROM PairTable AS ff
  WHERE ff.param = 'fname'
    AND ff.userId = 32
) fff, (
  SELECT ll.value AS lastname
  FROM PairTable AS ll
  WHERE ll.param = 'lname'
    AND ll.userId = 32
) lll
另一种选择是

类似这样的内容(未经测试,因为我现在没有SQL Server)


那张桌子糟透了。无意冒犯;-)

关系数据库不能很好地处理EAV表

您还可以分组并执行条件CASE语句,如下所示:

Bob Smith
SELECT   UserID,
         MAX(CASE WHEN param = 'fname' THEN value ELSE '' END) AS fname,
         MAX(CASE WHEN param = 'lname' THEN value ELSE '' END) AS lname
FROM     MyEAVTable
GROUP BY UserID

PIVOT语法很棒-此解决方案的唯一好处是它也可以与SQL 2000一起使用。

这比PIVOT更简单,+1此设计更常见的名称是实体属性值,或EAV。