2

I'm playing around with SQL and XML. I have a column in our database (properties) where XML is stored.

An example of this XML looks like this:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xyz.de/activerepository/fileprops">
  <props>
    <prop ns="ARM:" elem="_NoFilter">
      <value xsi:type="xsd:boolean">true</value>
    </prop>
    <prop ns="DAV:" elem="displayname">
      <value xsi:type="xsd:string">Some text in it</value>
    </prop>
    <prop ns="DAV:" elem="getcontenttype">
      <value xsi:type="xsd:string">message/rfc822</value>
    </prop>
    <prop ns="DAV:" elem="creationdate">
      <value xsi:type="xsd:dateTime">2017-01-02T09:38:28.1278078</value>
    </prop>
  </props>
</root>

I've written a query, where I get all props of this XML structure.

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
SELECT 
    cast(properties as xml).query('root/props/prop'),
    *
FROM   tm_cas_files (nolock)
where  id = 'A7ED7D99-8CDB-47F6-8EF5-18E7FCB97F28'

This query works fine, but I get all nodes of the XML structure.

The result of this query looks like this:

<p1:prop xmlns:p1="http://www.xyz.de/activerepository/fileprops" ns="ARM:" elem="_NoFilter">
  <p1:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:boolean">true</p1:value>
</p1:prop>
<p2:prop xmlns:p2="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="displayname">
  <p2:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">Some text in it</p2:value>
</p2:prop>
<p3:prop xmlns:p3="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="getcontenttype">
  <p3:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">message/rfc822</p3:value>
</p3:prop>
<p4:prop xmlns:p4="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="creationdate">
  <p4:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:dateTime">2017-01-02T09:38:28.1278078</p4:value>
</p4:prop>

How can I get now only a specific node of this XML?

I've already tested this query (to get i.e. "_NoFilter" node), but this SQL query returns no / empty result:

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
SELECT 
    cast(properties as xml).query('root/props/prop[elem="_NoFilter"]'),
    *
FROM   tm_cas_files (nolock)
where  id = 'A7ED7D99-8CDB-47F6-8EF5-18E7FCB97F28'
0

2 Answers 2

2

If you just want the _NoFilter node, you can use XPath to select only this one.

/root/props/prop[@elem="_NoFilter"]

or maybe even

/root/props/prop[@elem="_NoFilter"]/value

shorthand:

//prop[@elem="_NoFilter"]/value
Sign up to request clarification or add additional context in comments.

Comments

2

If you already know the index of the item, one way is

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
SELECT 
    @xml.query('root/props/prop[2]')

Or better you can use following SQL XML Query

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
select
    val.value('.','nvarchar(100)') as [PropValue]
from @xml.nodes('/root/props/prop[@elem="_NoFilter"]/value') as p(val)

enter image description here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.