Sql 使用xml将数据分解到表中
我正在学习XML/SQL,有以下问题。我想将XML数据分解到一个表中。但我的问题是:我有许多作者在同一图书类别中使用相同的标签(Sql 使用xml将数据分解到表中,sql,sql-server,xml,Sql,Sql Server,Xml,我正在学习XML/SQL,有以下问题。我想将XML数据分解到一个表中。但我的问题是:我有许多作者在同一图书类别中使用相同的标签()。我想选择所有的作者,但我不能做到这一点。你能帮我做那件事吗 结果应该如下所示: category title author author1 author2 =======================================================================
)。我想选择所有的作者,但我不能做到这一点。你能帮我做那件事吗
结果应该如下所示:
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的新手,所以我不知道如何正确设置结果表的格式。对此我感到很抱歉。我不知道术语“将数据分解到表中”是什么意思。