0

私は XML/SQL を勉強していますが、次の質問があります。XML データをテーブルに分割したいと考えています。しかし、私の質問は<author>、同じ本のカテゴリ内で同じタグ ( ) を使用している多くの著者がいるということです。すべての著者を選択したいのですが、この点を達成できません。それをするのを手伝ってくれませんか?

結果は次のようになります。

category    title              author             author1        author2
=============================================================================
CHILDREN    Harry Potter       J K. Rowling       NULL           NULL
WEB         XQuery Kick Start  James McGovern     Per Bothner    Kurt Cagle

コード:

declare @int int
declare @var xml = '<?xml version="1.0" encoding="ISO-8859-1"?>
 <bookstore>

 <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>
   <year>2003</year>
   <price>49.99</price>
 </book>

 </bookstore>';

EXEC sp_xml_preparedocument @int OUTPUT, @var


SELECT
*
into MyTable
FROM
OPENXML(@int, 'bookstore/book', 11)
with
(
category varchar(100),
title varchar(100),
author varchar(100)
author1 varchar(100),
author2 varchar(100)
);
4

2 に答える 2

2

作成者が 3 人を超えることがないことがわかっている場合は、次のようなものを使用できます。

SELECT
    XBook.value('@category', 'varchar(20)'),
    XBook.value('(title)[1]', 'varchar(50)'),
    XBook.value('(year)[1]', 'int'),
    XBook.value('(price)[1]', 'decimal(10,2)'),
    XBook.value('(author)[1]', 'varchar(50)'),
    XBook.value('(author)[2]', 'varchar(50)'),
    XBook.value('(author)[3]', 'varchar(50)')
FROM 
    @var.nodes('/bookstore/book') AS XTbl(XBook)

個人的には、ネイティブの XQuery サポートを使用する方が、古くてぎこちない OPENXMLアプローチ (メモリ リークやその他の欠陥にも悩まされていた)よりもはるかに簡単だと思います。

これにより、次のような出力が得られます。

ここに画像の説明を入力

于 2013-10-10T19:47:29.013 に答える
0

これは一つの方法です...

SELECT
*
into MyTable
FROM
OPENXML(@int, 'bookstore/book', 11)
with
(
category varchar(100) '@category',
title varchar(100) 'title',
author varchar(100) 'author[1]',
author1 varchar(100) 'author[2]',
author2 varchar(100) 'author[3]'
);

そして、これは別の方法で、構造が異なります。

SELECT
*
into MyTable
FROM
OPENXML(@int, 'bookstore/book/author', 11)
with
(
category varchar(100) '../@category',
title varchar(100) '../title',
author varchar(100) '.'
);

2 番目の方法を使用すると、サンプル データで 4 行が得られることに注意してください。OPENXML 行を変更して、階層の少し下から開始することに注意してください。

于 2013-10-10T19:43:23.713 に答える