[英]how to shread and query xml column where the nodes are dynamic in sql server
我們有一個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子句傳入的表(應該轉換為從t中選擇* *,其中UnitNumber = 56且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與temp表一起加入時,我們加入
CustomFieldName = field and CustomFieldValue = value
該查詢同時返回entityId 1和entityId 2,但我希望它僅返回entityId 1,因為這是唯一同時滿足這兩個條件的實體
(UnitNumber = 56 AND AptNo = 12)
我還沒有想辦法做到這一點。 當然,如果結構化我們存儲CustomFields的方式會很有幫助,但這是一個已建立的系統,目前無法更改。
任何提示表示贊賞。 謝謝!
這樣的事情可以使您更接近。 從我的頭頂上:
Select top 1 EntityId from #cte
left join #tempTable
on CustomFieldName = field
and CustomFieldValue = value
group by EntityId
order by count(entityid) desc
它確實讓我靠近。 以下是我最終要做的
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)
謝謝您的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.