XQuery не вернет документ - PullRequest
       7

XQuery не вернет документ

1 голос
/ 23 октября 2019

Я только начал изучать XQuery и пытаюсь немного поиграть с ним. Теперь, я построил то, что я считаю простым запросом и правильным (насколько я могу видеть), но SQL Manger выводит мне сообщение об ошибке: XQuery [query ()]: "=" ожидалось. Я оглянулся на код, но я не могу понять, как это исправить .. вот мой код:

DECLARE @x AS XML = N'
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>';

SELECT @x.query('for $i in bookstore/book
    let $a := $i/author
    let $t := $i/title
    let $p := $i/price
    where $i/@price < 40
    return
    <This is a test>
    <author>$a</author>
    <title>$t</title>
    <price>$p</price>
    </This is a test>')
AS [I hope this works]

Заранее спасибо за вашу помощь:)

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы были близки, но следует упомянуть три вещи:

  1. Как сказал вам Алан Бурштейн, тег <This is a test> недействителен. Сообщение, которое вы получаете, связано с тем, что движок думает об элементе <This> и ожидает, что is будет первым атрибутом, после которого следует =, как в <This is="some value">.
  2. Your where пытается запросить атрибут @price
  3. Чтобы разрешить необходимые значения {} вокруг ваших переменных.

Попробуйте это:

SELECT @x.query('for $i in bookstore/book
    let $a := $i/author
    let $t := $i/title
    let $p := $i/price
    where $p < 40
    return
    <This-is-a-test>
    <author>{$a}</author>
    <title>{$t}</title>
    <price>{$p}</price>
    </This-is-a-test>')
AS [I hope this works]
0 голосов
/ 23 октября 2019

Это недопустимый элемент xml:

<This is a test>

изменение этого значения на

<ThisIsATest>

исправит ваш запрос, но после исправления, как есть, ваш запрос невернуть что-нибудь. Мои навыки работы с T-SQL XQuery устарели, но вы можете получить то, что пытаетесь сделать, используя nodes и метод values.

Это:

SELECT 
  author = bs.book.value('(author/text())[1]', 'varchar(8000)'),
  title  = bs.book.value('(title/text())[1]', 'varchar(8000)'),
  price  = bs.book.value('(price/text())[1]', 'varchar(8000)')
FROM        (VALUES(@x))                 AS ml(x)
CROSS APPLY ml.x.nodes('bookstore/book') AS bs(book);

Возвращает:

author                title                 price
--------------------- --------------------- ----------
Giada De Laurentiis   Everyday Italian      30.00
J K. Rowling          Harry Potter          29.99
James McGovern        XQuery Kick Start     49.99
Erik T. Ray           Learning XML          39.95

Это (включаяВаш образец XML):

DECLARE @x AS XML = N'
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>';

SELECT 
  author = bs.book.value('(author/text())[1]', 'varchar(8000)'),
  title  = bs.book.value('(title/text())[1]', 'varchar(8000)'),
  price  = bs.book.value('(price/text())[1]', 'varchar(8000)')
FROM        (VALUES(@x))                 AS ml(x)
CROSS APPLY ml.x.nodes('bookstore/book') AS bs(book)
FOR XML PATH('Book');

Возвращает:

<Book>
  <author>Giada De Laurentiis</author>
  <title>Everyday Italian</title>
  <price>30.00</price>
</Book>
<Book>
  <author>J K. Rowling</author>
  <title>Harry Potter</title>
  <price>29.99</price>
</Book>
<Book>
  <author>James McGovern</author>
  <title>XQuery Kick Start</title>
  <price>49.99</price>
</Book>
<Book>
  <author>Erik T. Ray</author>
  <title>Learning XML</title>
  <price>39.95</price>
</Book>
...