Как использовать XQuery для этого XML - PullRequest
0 голосов
/ 14 июля 2020

Это мой образец XML.

<?xml version="1.0" encoding="utf-16"?>
<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>

Я пытаюсь разобрать XML таким образом, используя xquery.

declare @xmldata xml =N'
<?xml version="1.0" encoding="utf-16"?>
<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>'

Declare @cnt INT = @xmldata.value('count(/Root/string)', 'INT')     
print @cnt

Как разобрать приведенный выше образец XML by xquery?

EDIT

declare @xmldata xml =N'<?xml version="1.0" encoding="utf-16"?>
<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>'

Declare @i INT, @cnt INT = @xmldata.value('count(/Root/string)', 'INT')     

DECLARE @LineItem VARCHAR(MAX)

SET @i = 1      
WHILE @i <= @cnt      
BEGIN     

SELECT @LineItem = col.value('(string/text())[1]', 'VARCHAR(MAX)')  
FROM @xmldata.nodes('/Root/string[position() = sql:variable("@i")]') AS tab (col);   

PRINT @LineItem

SET @i=@i+1
END

Моя позиция не печатается, пока l oop. Что не так в коде?

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Другой способ:

 DECLARE @companyxml xml =
'<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>';


SELECT x.XmlCol.value('.', 'VARCHAR(4000)') AS CompanyName
  FROM @companyxml.nodes('/Root/string') x (XmlCol);
0 голосов
/ 14 июля 2020

Оператор print не выводит нулевые значения. Поскольку tab (col) уже ссылается на узел /Root/string, функция col.value('(string/text())[1]', 'VARCHAR(MAX)') возвращает null.

Если вы реструктурируете свой код таким образом, вы получите желаемый результат печати ...

declare @xmldata xml =N'<?xml version="1.0" encoding="utf-16"?>
<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>'

Declare @i INT, @cnt INT = @xmldata.value('count(/Root/string)', 'INT')     

DECLARE @LineItem VARCHAR(MAX)

SET @i = 1      
WHILE @i <= @cnt      
BEGIN     

SELECT @LineItem = col.value('.', 'VARCHAR(MAX)')  
FROM @xmldata.nodes('/Root/string[position() = sql:variable("@i")]') AS tab (col);   

PRINT @LineItem

SET @i=@i+1
END
EBITDA
Products Revenue

Если вы хотите использовать результаты в чем-то другом, вы можете вернуть такой набор результатов:

declare @xmldata xml =N'<?xml version="1.0" encoding="utf-16"?>
<Root>
  <string>EBITDA</string>
  <string>Products Revenue</string>
</Root>';

select col.value('.', 'VARCHAR(MAX)') as LineItem
from @xmldata.nodes('/Root/string') as tab (col);
LineItem
----------------
EBITDA
Products Revenue

(2 rows affected)
...