XML 交叉应用辅助 - 二级和多行
XML Cross Apply Assist - Secondary level and multiple rows
我想知道是否有人可以帮助我完成我在 SQL 上所做的一些 XML 工作,令人沮丧的是,他们要求提供更多信息并苦苦挣扎。
附件是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>
我需要在 XML 查询中使用,我可以使用以下 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
(我不确定为什么它没有变成 Whosebug 的代码——我是新手)
我想得到的部分是这样的:
<EstPolicyCount REPEATINGTYPE="PropertyGroup">
<rowdata REPEATINGINDEX="Total12">30</rowdata>
<rowdata REPEATINGINDEX="NonSME">30</rowdata>
我想要的输出是
TransID
Total12
TotalSME
B-2511
30
30
SQL 版本是 Microsoft SQL Server 2016 (SP2)
谢谢
尼克
未提供最小的可重现示例。所以,我从臀部射击。
请尝试以下解决方案。
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);
输出
+---------+---------+----------+
| TransID | Total12 | TotalSME |
+---------+---------+----------+
| B-2511 | 30 | 30 |
+---------+---------+----------+
我想知道是否有人可以帮助我完成我在 SQL 上所做的一些 XML 工作,令人沮丧的是,他们要求提供更多信息并苦苦挣扎。
附件是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>
我需要在 XML 查询中使用,我可以使用以下 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
(我不确定为什么它没有变成 Whosebug 的代码——我是新手)
我想得到的部分是这样的:
<EstPolicyCount REPEATINGTYPE="PropertyGroup">
<rowdata REPEATINGINDEX="Total12">30</rowdata>
<rowdata REPEATINGINDEX="NonSME">30</rowdata>
我想要的输出是
TransID | Total12 | TotalSME |
---|---|---|
B-2511 | 30 | 30 |
SQL 版本是 Microsoft SQL Server 2016 (SP2)
谢谢
尼克
未提供最小的可重现示例。所以,我从臀部射击。
请尝试以下解决方案。
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);
输出
+---------+---------+----------+
| TransID | Total12 | TotalSME |
+---------+---------+----------+
| B-2511 | 30 | 30 |
+---------+---------+----------+