Hi,
I have a table with XML data in a nvarchar column, named CheckoutAttributeXML and I need to extract the value for the attribute ID =2. Here is a sample of the data:
id CreatedOnUtc CheckoutAttributesXml
346601 2020-03-30 17:45:07.530 <Attributes><CheckoutAttribute ID="13"><CheckoutAttributeValue><Value>34</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="14"><CheckoutAttributeValue><Value>Hannah Jewett</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="15"><CheckoutAttributeValue><Value>Manager</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="16"><CheckoutAttributeValue><Value>8772842351</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="12"><CheckoutAttributeValue><Value>31</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="3"><CheckoutAttributeValue><Value>text text text
</Value></CheckoutAttributeValue></CheckoutAttribute><CheckoutAttribute ID="2"><CheckoutAttributeValue><Value>9196a907-f1d9-4ecf-875b-34d59ecd66cf</Value></CheckoutAttributeValue></CheckoutAttribute></Attributes>
I need to get the following results:
Id ExtractedData
346601 9196a907-f1d9-4ecf-875b-34d59ecd66cf
I appreciate your help
Hello,
Please provide the xml data using the three code tick mark ` because we are not seeing the xml?
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Ok, figured out how to post my code.
I'm getting there but I need help on filtering my query to only get the CheckoutAttribute Id= 2, right now I'm getting all Attributes in the string
select
a.Id,
x.y.value('CheckoutAttributeValue[1]', 'nvarchar(255)') as DownloadId
from
(select id, Convert(XML, CheckoutAttributesXml) as XML, CreatedOnUtc from [order]) As A
Cross Apply xml.nodes('//Attributes/CheckoutAttribute') As x(y)
where A.CreatedOnUtc > '2020-03-30 17:45:07.530'
Thanks but the links did not help. My query from above is pulling the data but since they are all CheckoutAttributes, it's pulling multiple rows. I need a filter so that I only get the value for the CheckoutAttribute of Id = 2
right now I'm getting the following results:
Id DownloadId
346601 34
346601 Hannah Jewett
346601 Manager
346601 8772842351
346601 31
346601 Presented to
William Balthrop
1 Year
line break image
In Grateful Appreciation of
Outstanding Dedication and Service
logo
2020
346601 9196a907-f1d9-4ecf-875b-34d59ecd66cf
But I only want the last one, which has CheckoutAttribute id = 2
;with src
as
(
select cast(CheckoutAttributeXML as xml) as xmlized
From order
)
select X.Y.value('(*:Value)[1]', 'VARCHAR(30)') as Value,
x.y.value('../@ID', 'int') AS 'ID'
from src as T
CROSS APPLY T.xmlized.nodes('//Attributes/CheckoutAttribute/CheckoutAttributeValue') as X(Y)
where x.y.value('../@ID', 'int') = 2
2 Likes
Perfect!!!
This is exactly what I needed
Here is the finished query with the same values as the question -- this helps me so it may help others:
select
a.Id,
x.y.value('../@ID', 'int') AS 'ID',
x.y.value('(*:Value)[1]', 'VARCHAR(30)') as DownloadId
from
(select id, Convert(XML, CheckoutAttributesXml) as XML, CreatedOnUtc from [order]) As A
Cross Apply xml.nodes('//Attributes/CheckoutAttribute/CheckoutAttributeValue') As x(y)
where A.CreatedOnUtc > '2020-03-30 17:45:07.530' and a.Id = 346601 and x.y.value('../@ID', 'int') = 2
Yields:
Id ID DownloadId
346601 2 9196a907-f1d9-4ecf-875b-34d59e
... and now I can go a cleanup my 17 Gb download table for any orders older than 6 months.
I would not put the files in a table, but to each his own.
1 Like
it can also be done as
x.y.value('(Value)[1]', 'VARCHAR(30)') as Value