簡體   English   中英

如何在SQL Server中動態讀取和查詢節點的XML列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM