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 |
+---------+---------+----------+