TSQL使用名称空间查询xml
问题描述:
我一直在寻找解决方案来解决我的问题。其实我想从XML列中检索一些数据。 下面是数据:TSQL使用名称空间查询xml
<Notification xmlns="http://model.company/notification/de/v1"
dateNotification="2017-07-24T11:47:51.012+02:00"
identifiant="4b7330c7-021f-4cf9-ace6-f74d73f409ef"
personneId="1071249"
source="REGLES"
sourceVersion="1.0.17"
typeMouvement="MODIFICATION">
<EvenementDE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
referenceOriginale="1071249"
xsi:type="ChangementSignaletique">
<Champ
ancienneValeur="Doe"
nom="nom"
nouvelleValeur="DOE" />
</EvenementDE>
<EvenementDE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
referenceOriginale="1071249"
xsi:type="ChangementSignaletique">
<Champ
ancienneValeur="John"
nom="prenom"
nouvelleValeur="John Carl" />
</EvenementDE>
</Notification>
我想找回 “ancienneValeur”, “nouvelleValeur” 特定 “referenceOriginale”。 以下是提琴手:Fiddler 从根中获取属性很容易,但无法从Champ获取属性。
我希望有人能帮助我。 在此先感谢。
答
您必须使用适当的XPath作为您希望查询/呈现的元素和属性。
DECLARE @xml XML = N'... your xml...';
WITH XMLNAMESPACES (DEFAULT 'http://model.company/notification/de/v1')
SELECT
N.N.value('./Champ[1]/@ancienneValeur', 'NVARCHAR(100)') AS [ancienneValeur]
FROM @xml.nodes('/Notification/EvenementDE') As N(N)
WHERE N.N.value('./@referenceOriginale', 'INT') = 1071249
...结果...
ancienneValeur
Doe
John
特别是随着大个XML倒不如包括了'WHERE'为*谓词*成'.nodes()'的'的XQuery '。类似'.nodes('/ Notification/EvenementDE [@ ReferenceOriginale = 1071249]')'。如果需要,可以使用'sql:variable()'或'sql:column()'引入硬编码值。 – Shnugo
好点。 '.exist(...)'函数也快于'.value(...)'和'.query(...)' –
真的,这取决于你在寻找什么... – Shnugo