2

我们有一个 xml 列,其中节点名称因站点而异(基本上,除了我们提供的标准字段外,我们还允许用户创建自定义字段,这些字段保存在我提到的 xml 列中。示例单元格看起来喜欢

<Dictionary><UnitNumber>56</UnitNumber><AptNo>12</AptNo></Dictionary>

请注意,节点 UnitNumber 和 AptNo 完全是客户特定的,它可以是 AutoBrand 和 ManifestNo 以及 TravelSite。

现在,我们允许客户查询这些字段。存储的 proc 获取一个 xml 参数,我们将该 xml 参数解析为一个临时表,该表如下所示

field         value
-----          -----
UnitNumber      56
AptNo           12  

所以这个表就是客户作为where子句传入的(应该翻译成select * from t where UnitNumber = 56 and AptNo = 12)

然后我们从结果将来自的表中删除 xml 列。由于我们使用了 nodes() 函数和 OUTER APPLY,最终的 CTE 有一些重复的身份,因为它们有多个节点。

我们做xml粉碎的sql语句如下

SELECT T.C.value('local-name(.)', 'nvarchar(100)') as CustomFieldName,
T.C.value('.', 'nvarchar(100)') as CustomFieldValue,
#tempTable.*
FROM #tempTable
OUTER APPLY #tempTable.CustomFields.nodes('/Dictionary/child::*') as T(C)

这会返回类似

CustomFieldName        CustomFieldValue       EntityId
---------------        ----------------       ----------
UnitNumber               56                     1
AptNo                    12                     1
UnitNumber               56                     2

因此,当我们将 CTE 与临时表连接时,我们加入

CustomFieldName = field and CustomFieldValue = value

查询返回 entityId 1 和 entityId 2,但我希望它只返回 entityId 1,因为这是唯一同时满足这两个条件的实体

(UnitNumber = 56 AND AptNo = 12)

我还没有想出办法来实现这一点。当然,如果我们存储 CustomFields 的方式是结构化的,那将非常有帮助,但这是一个已建立的系统,现在无法更改。

任何提示表示赞赏。谢谢!

4

2 回答 2

0

它确实让我很接近。以下是我最终做的

SELECT ROW_NUMBER() OVER(PARTITION BY EntityId ORDER BY EntityId DESC) As EntityCount, EntityId
from CTE JOIN #tempTable ON 
CustomFieldName = field and CustomFieldValue = value 
Where EntityCount = (select count(*) from #temptable)

谢谢您的帮助。

于 2013-06-13T19:55:53.170 回答
0

像这样的东西可以让你更接近。在我的头顶上:

Select top 1 EntityId from #cte 
left join #tempTable 
on CustomFieldName = field 
and CustomFieldValue = value 
group by EntityId 
order by count(entityid) desc
于 2013-06-12T20:28:27.677 回答