'XML Cross Apply Assist - Secondary level and multiple rows
I was wondering if someone could assist me with some XML work I am doing on SQL, frustratingly theyve asked for further information and struggling.
Attached is the XML:
<pagedata>
<BinderSections REPEATINGTYPE="PageList">
<rowdata REPEATINGINDEX="1">
<Compliance>
<EstPolicyCount REPEATINGTYPE="PropertyGroup">
<rowdata REPEATINGINDEX="Total12">30</rowdata>
<rowdata REPEATINGINDEX="NonSME">30</rowdata>
</EstPolicyCount>
</Compliance>
</rowdata>
</BinderSections>
</pagedata>
I need to use in an XML query, I can get most of it using the following SQL:
DECLARE @id INT
DECLARE @SQL NVARCHAR(MAX)
SET @id = 1
WHILE (@id <= 1)
BEGIN
SET @SQL = '
SELECT
t.TransID
--BinderSection.value(N''(rowdata[@REPEATINGINDEX="'+CAST(@id as varchar(MAX))+'"]/Compliance/EstPolicyCount[@REPEATINGTYPE="PropertyGroup"]''/rowdata[@REPEATINGINDEX="Total12"/text())[1]'', N''nvarchar(MAX)'') as [Total12]
FROM (SELECT TransID, CAST(TransXML as XML) as TransXML FROM [dbo].[DA_TRANSACTIONS]) t
CROSS APPLY TransXML.nodes(''pagedata/BinderSections[@REPEATINGTYPE="PageList"]'') as pagedata(BinderSection)
--CROSS APPLY BinderSection.nodes(''Compliance/EstPolicyCount[@REPEATINGTYPE="PropertyGroup"]'') as pagedata2(EstPolicyCount)
WHERE t.TransID = ''B-2511''';
EXEC (@SQL)
SET @id = @id + 1
END
(I am not sure why its not turning into code for stackoverflow - i am new)
The part I am trying to get is this:
<EstPolicyCount REPEATINGTYPE="PropertyGroup">
<rowdata REPEATINGINDEX="Total12">30</rowdata>
<rowdata REPEATINGINDEX="NonSME">30</rowdata>
The output I would want is
| TransID | Total12 | TotalSME |
|---|---|---|
| B-2511 | 30 | 30 |
SQL version is Microsoft SQL Server 2016 (SP2)
Thanks
Nick
Solution 1:[1]
A minimal reproducible example is not provided. So, I am shooting from the hip.
Please try the following solution.
SQL
-- DDL and sample data population, start
DECLARE @DA_TRANSACTIONS TABLE (TransID VARCHAR(10) PRIMARY KEY, TransXML NVARCHAR(MAX));
INSERT INTO @DA_TRANSACTIONS (TransID, TransXML) VALUES
('B-2511', N'<pagedata>
<BinderSections REPEATINGTYPE="PageList">
<rowdata REPEATINGINDEX="1">
<Compliance>
<EstPolicyCount REPEATINGTYPE="PropertyGroup">
<rowdata REPEATINGINDEX="Total12">30</rowdata>
<rowdata REPEATINGINDEX="NonSME">30</rowdata>
</EstPolicyCount>
</Compliance>
</rowdata>
</BinderSections>
</pagedata>');
-- DDL and sample data population, end
SELECT t.TransID
, Total12 = c.value('(rowdata[@REPEATINGINDEX="Total12"]/text())[1]', 'INT')
, TotalSME = c.value('(rowdata[@REPEATINGINDEX="NonSME"]/text())[1]', 'INT')
FROM @DA_TRANSACTIONS AS t
CROSS APPLY (SELECT TrXML = TRY_CAST(TransXML AS XML)) x
CROSS APPLY TrXML.nodes('/pagedata/BinderSections/rowdata/Compliance/EstPolicyCount') AS t1(c);
Output
+---------+---------+----------+
| TransID | Total12 | TotalSME |
+---------+---------+----------+
| B-2511 | 30 | 30 |
+---------+---------+----------+
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
