Sql 使用xml将数据分解到表中

Sql 使用xml将数据分解到表中,sql,sql-server,xml,Sql,Sql Server,Xml,我正在学习XML/SQL,有以下问题。我想将XML数据分解到一个表中。但我的问题是:我有许多作者在同一图书类别中使用相同的标签()。我想选择所有的作者,但我不能做到这一点。你能帮我做那件事吗 结果应该如下所示: category title author author1 author2 =======================================================================

我正在学习XML/SQL,有以下问题。我想将XML数据分解到一个表中。但我的问题是:我有许多作者在同一图书类别中使用相同的标签(
)。我想选择所有的作者,但我不能做到这一点。你能帮我做那件事吗

结果应该如下所示:

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
声明@var xml=
哈利·波特
J K.罗琳
2005
29.99
XQuery启动
詹姆斯·麦戈文
伯特纳
库尔特·卡格尔
2003
49.99
';
EXEC sp_xml_preparedocument@int OUTPUT,@var
挑选
*
进入我的桌子
从…起
OPENXML(@int,'bookstore/book',11)
具有
(
varchar类(100),
标题varchar(100),
作者varchar(100)
author1 varchar(100),
author2 varchar(100)
);
这是一种方法

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) '.'
);

请注意,使用第二种方法时,示例数据将有4行,因为第一本书有1位作者,而第二本书有3位作者。请注意,我更改了OPENXML行,使其在层次结构中的开头稍微向下一点。

如果您知道您将永远不会有超过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方法(也存在内存泄漏和其他缺陷)容易得多

这将为您提供如下输出:

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)

obs:我是Stackoverflow的新手,所以我不知道如何正确设置结果表的格式。对此我感到很抱歉。我不知道术语“将数据分解到表中”是什么意思。