как получить количество узлов xml - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующие узлы xml

<PPAProposal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Answers>
<AnswersList>
<Entry key="ac5_a_InsuredDetailsUpload" type="System.Collections.ArrayList">
        <value>
          <anyType xsi:type="xsd:string">C___documents__PPA_813FN0011684_190219_1003.pdf</anyType>
          <anyType xsi:type="xsd:string">New Doc 2019-02-18 13.37.43 (1).pdf</anyType>
        </value>
</Entry>
</Answers>
</AnswersList>
</PPAProposal>

Мне нужно получить количество узлов AnyType.Я написал запрос наподобие приведенного ниже.

SELECT 
(CASE WHEN  Data.value('(/*/Answers/AnswersList/Entry[@key="ac5_a_InsuredDetailsUpload"]/value)[1]', 'nvarchar(max)')!=''
            THEN 

             (SELECT Count((ISNULL(Col.value('(value)[1]', 'nvarchar(max)'), '0'))) AS upload
          FROM Data.nodes('(/*/Answers/AnswersList/Entry[@key="ac5_a_InsuredDetailsUpload"])') AS Tbl(Col))

      ELSE  0
      END
    )
FROM TEMPTABLE

Я могу вернуть счет 1 вместо 2, поскольку в узле «Значение» есть 2 узла.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете сосчитать anyType элементов непосредственно в XPath:

SELECT 
  t.Data.value(
    'count(/*/Answers/AnswersList/Entry[@key="ac5_a_InsuredDetailsUpload"]/value/anyType)', 
    'int'
  ) as anytype_count
FROM TEMPTABLE t;

Демо-версия dbfiddle

0 голосов
/ 20 февраля 2019
declare @XMLDATA xml;
set @XMLDATA = '
<PPAProposal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AnswersList>
<Answers>
<Entry key="ac5_a_InsuredDetailsUpload" type="System.Collections.ArrayList">
    <value>
      <anyTypexsi:type="xsd:string">C___documents__PPA_813FN0011684_190219_1003.pdf</anyType>
      <anyType xsi:type="xsd:string">New Doc 2019-02-18 13.37.43 (1).pdf</anyType>
    </value></Entry></Answers></AnswersList></PPAProposal>'

DECLARE @XMLDocPointer INT; 
EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT,@XMLDATA; 

    SELECT  value INTO #TEMPDATA

    FROM    OPENXML( @XMLDocPointer, '/PPAProposal/AnswersList/Answers/Entry/value/anyType', 2 )
            WITH ( value NVARCHAR(1000), anyType NVARCHAR(1000) )


EXEC sp_xml_removedocument @XMLDocPointer;

select count(*)total from #TEMPDATA
drop table #TEMPDATA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...