Eric
Eric

Reputation: 8078

Searching all nodes for xml column

I'm looking for a way to search all the nodes in an sql xml column.

For example if i have the following XML

<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <EntityPropertyOfString>
    <Name>User Label 1</Name>
    <Value>TX 12107210</Value>
  </EntityPropertyOfString>
  <EntityPropertyOfString>
    <Name>User Label 2</Name>
    <Value>BONUS $350/DAY</Value>
  </EntityPropertyOfString>
  <EntityPropertyOfString>
    <Name>User Defined Date 9</Name>
    <Value>11/09/2011</Value>
  </EntityPropertyOfString>
</ArrayOfEntityPropertyOfString>

How can I search for all values that contain the word 'bonus'??

Thank you in advance.

Upvotes: 2

Views: 921

Answers (2)

Mikael Eriksson
Mikael Eriksson

Reputation: 138980

declare @xml xml =
'<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <EntityPropertyOfString>
  <Name>User Label 1</Name>
  <Value>TX 12107210</Value>
 </EntityPropertyOfString>
<EntityPropertyOfString>
<Name>User Label 2</Name>
<Value>BONUS $350/DAY</Value>
</EntityPropertyOfString>
<EntityPropertyOfString>
<Name>User Defined Date 9</Name>
<Value>11/09/2011</Value>
 </EntityPropertyOfString>
 </ArrayOfEntityPropertyOfString>'

select T.N.value('local-name(.)', 'nvarchar(max)') as NodeName,
       T.N.value('text()[1]', 'nvarchar(max)') as NodeValue
from @xml.nodes('//*') as T(N)
where T.N.value('text()[1]', 'nvarchar(max)') like '%bonus%'

Result:

NodeName             NodeValue
-------------------- --------------------
Value                BONUS $350/DAY

For a table it could look like this:

declare @T table (ID int identity primary key, XMLCol xml)

declare @xml xml =
'<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <EntityPropertyOfString>
     <Name>User Label 1</Name>
     <Value>TX 12107210</Value>
   </EntityPropertyOfString>
   <EntityPropertyOfString>
     <Name>User Label 2</Name>
     <Value>BONUS $350/DAY</Value>
   </EntityPropertyOfString>
   <EntityPropertyOfString>
     <Name>User Defined Date 9</Name>
     <Value>11/09/2011</Value>
   </EntityPropertyOfString>
 </ArrayOfEntityPropertyOfString>'

insert into @T values (@xml)
insert into @T values (@xml)

select T1.ID,
       T2.N.value('local-name(.)', 'nvarchar(max)') as NodeName,
       T2.N.value('text()[1]', 'nvarchar(max)') as NodeValue
from @T as T1
  cross apply T1.XMLCol.nodes('//*') as T2(N)  
where T2.N.value('text()[1]', 'nvarchar(max)') like '%bonus%'

Result:

ID          NodeName             NodeValue
----------- -------------------- --------------------
1           Value                BONUS $350/DAY
2           Value                BONUS $350/DAY

Upvotes: 5

Glenn
Glenn

Reputation: 156

If you can make the assumption that bonus will never occur in a tag...

SELECT
  ...
FROM
  ...
WHERE COL_NAME LIKE '%bonus%'

Upvotes: 0

Related Questions