在多个XML里用 select 语句多表查询,怎么做?

xiaokun111 2006-03-14 01:29:14
有多个XML文件,1个XML文件对应一个表。
例如执行:

select a.a1,b.b1,c.c1 from '1.xml' a ,'2.xml' b,'3.xml' c where a.id=b.id

上面写法不对,大概是这个意思。大家给个思路
...全文
288 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyu112 2006-03-16
  • 打赏
  • 举报
回复
学习
hglhyy 2006-03-15
  • 打赏
  • 举报
回复
示例
在检索数据时,用 rowpattern 标识 XML 文档中决定行的节点。rowpattern 用 MSXML XPath 实现中使用的 XPath 模式语言表示。例如,如果模式以元素或特性结束,则将为 rowpattern 选定的每个元素或特性节点创建一行。

flags 值提供默认映射。在 SchemaDeclaration 中如果没有指定 ColPattern,则使用 flags 参数所指定的映射。如果在 SchemaDeclaration 中指定了 ColPattern,则忽略 flags 值。指定的 ColPattern 确定映射(attribute-centric 或 element-centric),还确定在处理溢出/未用完数据时的行为。

A. 执行带 OPENXML 的简单 SELECT 语句
下例中的 XML 文档由 <Customer>、<Order> 和 <OrderDetail> 元素组成。OPENXML 语句从 XML 文档中检索两列行集(CustomerID 和 ContactName)中的客户信息。

首先调用 sp_xml_preparedocument 存储过程以获得文档句柄。此文档句柄传递到 OPENXML。

在 OPENXML 语句中:

rowpattern (/ROOT/Customer) 标识要处理的 <Customer> 节点。


flags 参数值设置为 1 表示 attribute-centric 映射。因此,XML 特性映射到在 SchemaDeclaration 中定义的行集中的列。


在 SchemaDeclaration 中(在 WITH 子句中),指定的 ColName 值与相应的 XML 特性名相匹配。因此,在 SchemaDeclaration 中不指定 ColPattern 参数。
最后 SELECT 语句检索 OPENXML 所提供的行集中的所有列。

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))
EXEC sp_xml_removedocument @idoc

结果如下:

CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez

如果在 flags 设置为 2 时(表示 element-centric 映射)执行上述 SELECT 语句,两个客户的 CustomerID 和 ContactName 值将作为 NULL 值返回,因为 <Customer> 元素没有任何子元素。

如果在 XML 文档中,<CustomerID> 和 <ContactName> 是子元素,则 element-centric 映射将检索值。

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer>
<CustomerID>VINET</CustomerID>
<ContactName>Paul Henriot</ContactName>
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer>
<CustomerID>LILAS</CustomerID>
<ContactName>Carlos Gonzlez</ContactName>
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',2)
WITH (CustomerID varchar(10),
ContactName varchar(20))
EXEC sp_xml_removedocument @idoc

结果如下:

CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez

xiaokun111 2006-03-15
  • 打赏
  • 举报
回复
没人回答请版主为我结贴。
xiaokun111 2006-03-15
  • 打赏
  • 举报
回复
谢谢 hglhyy(為人民币服务!) ,好复杂,看的不太明白。

我有这样格式的xml文件若干,在不访问数据库的情况下
在本地将数据按照
select a.a1,b.b1,c.c1 from '1.xml' a ,'2.xml' b,'3.xml' c where a.id=b.id
这样的格式查询应该怎么写?

<?xml version="1.0" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA><FIELDS>
<FIELD attrname="ID" fieldtype="i4" readonly="true" SUBTYPE="Autoinc"/>
<FIELD attrname="aaa" fieldtype="string" WIDTH="50"/>
<FIELD attrname="bbb" fieldtype="string" WIDTH="50"/>
<FIELD attrname="ccc" fieldtype="string" WIDTH="50"/>
<FIELD attrname="ddd" fieldtype="string" WIDTH="50"/>
</FIELDS><PARAMS/>
</METADATA><ROWDATA>
<ROW ID="1" aaa="1111" bbb="2222" ccc="3333" ddd="4444"/>
<ROW ID="2" aaa="1111" bbb="abc" ccc="sdf" ddd="ggg"/>
<ROW ID="3" aaa="1111" bbb="yyy" ccc="uuu" ddd="ppp"/>
<ROW ID="4" aaa="1111" bbb="sdww" ccc="hhh" ddd="llk"/>
<ROW ID="5" aaa="1111" bbb="gfgf" ccc="nnn" ddd="vvv"/>
<ROW ID="6" aaa="2222" bbb="qwe" ccc="rrr" ddd="g"/>
<ROW ID="7" aaa="2222" bbb="ere" ccc="dd" ddd="HHH"/>
<ROW ID="8" aaa="3333" bbb="4444" ccc="5555" ddd="6666"/>
<ROW ID="9" aaa="3333" bbb="3333" ccc="eree" ddd="rrrr"/>
</ROWDATA></DATAPACKET>
ReViSion 2006-03-14
  • 打赏
  • 举报
回复
哈哈,OpenXML,我也没看明白
子陌红尘 2006-03-14
  • 打赏
  • 举报
回复
查联机帮助:OPENXML()

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧