【发布时间】:2014-11-12 12:13:07
【问题描述】:
我正在使用 EAV 模式将任意数据存储在单个表中 (Entries)。 Data 存储为nvarchar 并通过PropertyID 链接目标数据类型。现在我想创建一个视图来使用数据透视重构数据,但我无法将Data 动态转换为它的预期数据类型。执行下面的查询,我得到错误#8114 error converting data type nvarchar to float。
这本质上是我的数据库结构:
EntryID | PropertyID | Data (nvarchar)
----------------------------
1 | 1 | 1
2 | 2 | abc
3 | 3 | 2.0
....
PropertyID | PropertyName | TypeID
------------------------------------
1 | intProp | 1
2 | strProp | 2
3 | fltProp | 3
....
TypeID | TypeName
-----------------
1 | int
2 | string
3 | float
4 | bool
5 | datetime
....
这是查询:
SELECT [intProp], [strProp], [fltProp]
FROM
(
SELECT e.EntryID, p.PropertyName,
CASE
WHEN t.TypeName = 'int' THEN
CAST(e.data as int)
WHEN t.TypeName = 'float' THEN
CAST(e.data as float)
WHEN t.TypeName = 'string' THEN
e.data
END as converted
FROM
Entries e
INNER JOIN Properties p ON e.PropertyID = p.PropertyID
INNER JOIN Types t ON p.TypeID = t.TypeID
) as t1
PIVOT
(
MAX(converted)
FOR PropertyName IN ( [intProp], [strProp], [fltProp])
) as piv
显然CASE 语句是问题所在,但是如何将查询转换为动态转换为正确的数据类型?
【问题讨论】:
-
您需要在枢轴之后进行强制转换,但您不能动态地执行此操作。你只能做
CAST(piv.[intProp] AS INT)。您遇到了EAV被视为 SQL 反模式的原因之一。 -
这可能有助于解决您的问题:stackoverflow.com/questions/27744532/…>
标签: sql sql-server sql-server-2008-r2 pivot entity-attribute-value