【问题标题】:how to shread and query xml column where the nodes are dynamic in sql server如何在sql server中分解和查询节点是动态的xml列
【发布时间】:2013-06-12 19:55:40
【问题描述】:

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

<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 的方式是结构化的,那将是非常有帮助的,但这是一个已建立的系统,现在无法更改。

感谢任何提示。谢谢!

【问题讨论】:

  • 好问题。感谢您的发帖,我期待着阅读答案。

标签: sql-server tsql sqlxml


【解决方案1】:

这样的事情可以让你更接近。在我脑海中浮现:

Select top 1 EntityId from #cte 
left join #tempTable 
on CustomFieldName = field 
and CustomFieldValue = value 
group by EntityId 
order by count(entityid) desc

【讨论】:

  • 仍在尝试弄清楚如何使用 stackoverflow 的约定,但想感谢您的回答。这很有帮助。
【解决方案2】:

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

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)

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2014-07-04
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2013-08-18
    相关资源
    最近更新 更多