!!!!!另送 200 分 求FOR XML的用法!!!!!(顶贴有分!!)

librastar2001 2004-12-08 02:06:33
微软定义的FOR XML 子句的使用准则:
1.FOR XML 无法用于需要在存储过程中进一步处理的选择语句。
2.FOR XML 不能与游标一起使用。
3.一般情况下,FOR XML 无法不能不直接将结果输出到 Microsoft® SQL Server™ 2000 客户端的任何选择语句。
4.FOR XML 无法用于在 INSERT 语句中调用的存储过程。

我如何在存储过程中获取多行如
Select * from tableA for xml raw
中返回的数据?
...全文
261 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
netcoder 2004-12-09
  • 打赏
  • 举报
回复
在存储过程中处理for xml结果,把问题复杂化了吧,是否多此一举呢
楼主说说具体要实现的功能吧
librastar2001 2004-12-09
  • 打赏
  • 举报
回复
哎~~~~~~~~~~~~~~
看来只有用前台程序了
zjcxc 元老 2004-12-08
  • 打赏
  • 举报
回复
前台程序中去处理吧
这个for xml 一般是配合iis来处理的,不是为了在数据库中直接处理的
vinsonshen 2004-12-08
  • 打赏
  • 举报
回复
哈哈,不好意思~~~我随便看了下~~~
lsxaa 2004-12-08
  • 打赏
  • 举报
回复
vinsonshen(猪骨褒咸鱼->味道没得顶)兄弟 别帖这个了,这个不能解决楼主的问题
vinsonshen 2004-12-08
  • 打赏
  • 举报
回复
<c CompanyName="Vins et alcools Chevalier">
<o OrderID="10248" OrderDate="1996-07-04T00:00:00">
<pr ProductName="Queso Cabrales">
<od Quantity="12" UnitPrice="14.0000" total="168.0000"/>
</pr>
<pr ProductName="Singaporean Hokkien Fried Mee">
<od Quantity="10" UnitPrice="9.8000" total="98.0000"/>
</pr>
</c>

在所得到的 XML 文档中缺少 <p> 元素,且返回 <pr> 和 <od> 元素。发生这种现象的原因是查询优化器在结果中消除 P 表,并返回包含 od 表和 pr 表的结果集。

通过重新编写该查询可避免上述现象。例如,可重新编写该查询以创建一个视图并在 SELECT 语句中使用该视图:

CREATE VIEW p AS
SELECT od.OrderID,
pr.ProductName,
od.Quantity,
od.UnitPrice,
od.Quantity * od.UnitPrice AS total
FROM Products AS pr
JOIN
[Order Details] AS od
ON
pr.ProductID = od.ProductID

然后编写 SELECT 语句:

SELECT c.CompanyName,
o.OrderID,
o.OrderDate,
p.ProductName,
p.Quantity,
p.UnitPrice,
p.total
FROM Customers AS c
JOIN
Orders AS o
ON
c.CustomerID = o.CustomerID
JOIN
p
ON
o.OrderID = p.OrderID
FOR XML AUTO

下面是部分结果:

<c CompanyName="Vins et alcools Chevalier">
<o OrderID="10248" OrderDate="1996-07-04T00:00:00">
<p ProductName="Queso Cabrales"
Quantity="12"
UnitPrice="14.0000"
total="168.0000"/>
</o>
</c>

另外,将包含在 XML 名称中无效的字符(如空格)的 SQL Server 名称转换为 XML 名称的方法是将无效字符转换为转义数字实体编码。

仅有两个非字母字符可以在 XML 名称的开始位置使用:冒号 (:) 和下划线 (_)。因为冒号 (:) 已经保留给命名空间,所以将下划线 (_) 选作转义符。编码的转义规则是:

不是有效 XML 名称字符(根据 XML 1.0 规范)的任何 UCS-2 字符均转义为 _xHHHH_ 的形式,其中 HHHH 代表字符的四位十六进制 UCS-2 代码,以最高有效位排在最前面的顺序。例如,表名 Order Details 编码为 Order_x0020_Details。


不符合 UCS-2 领域的字符(介于 U+00010000 和 U+0010FFFF 范围之间的附加 UCS-4 字符)均编码为 _xHHHHHHHH_,其中 HHHHHHHH 代表字符的八位十六进制 UCS-4 编码。


下划线字符不需要进行转义,除非其后为字符 x。例如,表名 Order_Details 不进行编码。


标识符中的冒号 (:) 字符不进行编码,以便 FOR XML 查询可以生成命名空间元素和特性名。例如,下列查询在名称中生成包含冒号的命名空间特性:
SELECT 'namespace-urn' as 'xmlns:namespace',
1 as 'namespace:a'
FOR XML RAW

该查询产生下列结果:

<row xmlns:namespace="namespace-urn" namespace:a="1"/>

在 SELECT 查询中,将任何列投影到二进制大对象 (BLOB) 会使该列成为临时实体(丢失相关联的表名和列名)。这使 AUTO 模式查询产生错误,因为它不知道将该值放在 XML 层次结构的何处,例如:
CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
INSERT INTO MyTable VALUES (1, 0x7)

因为投影到 BLOB,该查询产生一个错误信息:

SELECT Col1,
CAST(Col2 as image) as Col2
FROM MyTable
FOR XML AUTO

如果删除投影,该查询将产生预期的结果:

SELECT Col1,
Col2
FROM MyTable
FOR XML AUTO

结果如下:

<Computed Col1="1" Col2="dbobject/Computed[@Col1='1']/@Col2"/>

vinsonshen 2004-12-08
  • 打赏
  • 举报
回复
FOR XML 子句的使用准则
FOR XML 子句只有在 SELECT 语句中及受到以下限制时才有效:

无论在 UPDATE、INSERT 或 DELETE 语句、嵌套 SELECT 语句还是其它语句(SELECT INTO、赋值语句)中,FOR XML 在子选择中都无效。例如,不支持下面示例中的子选择:
示例 A

SELECT *
FROM Table1
WHERE ......(SELECT * FROM Table2 FOR XML RAW)

示例 B

DECLARE @doc nchar(3000)
SET @doc = (SELECT * FROM Customers WHERE CustomerID = 'ALFKI' FOR XML RAW)

对于与 COMPUTE BY 或 FOR BROWSE 子句一起使用的任何选择语句,FOR XML 都无效,例如:
SELECT OrderID, UnitPrice
FROM [Order Details]
ORDER BY OrderID COMPUTE SUM(UnitPrice) BY OrderID

当前不支持 GROUP BY 和聚合函数与 FOR XML AUTO 共同使用。例如:
SELECT max(price), min(price), avg(price)
FROM titles
FOR XML AUTO

FOR XML 在用于视图定义或用于返回行集的用户定义函数的 SELECT 语句中无效。例如,不能使用下面的语句:
CREATE VIEW AllOrders AS SELECT * FROM Orders FOR XML AUTO

但是允许如下的语句:

SELECT * FROM ViewName FOR XML AUTO are allowed.

FOR XML 无法用于需要在存储过程中进一步处理的选择语句。


FOR XML 不能与游标一起使用。


一般情况下,FOR XML 无法不能不直接将结果输出到 Microsoft® SQL Server™ 2000 客户端的任何选择语句。


FOR XML 无法用于在 INSERT 语句中调用的存储过程。


如果带 FOR XML 子句的 SELECT 语句在查询中指定一个由四部分组成的名称,则在本地计算机上执行查询时,在所得到的 XML 文档中将不返回这个服务器名称。但是,当在网络服务器上执行查询时,将返回这个由四部分组成的服务器名称。
例如,对于下面的查询:

SELECT TOP 1 LastName
FROM ServerName.Northwind.dbo.Employees
FOR XML AUTO

当 ServerName 是本地服务器时,该查询返回:

<Northwind.dbo.Employees LastName="Buchanan"/>

当 ServerName 是网络服务器时,该查询返回:

<ServerName.Northwind.dbo.Employees LastName="Buchanan"/>

通过指定下列别名可避免上述现象:

SELECT TOP 1 LastName
FROM ServerName.Northwind.dbo.Employees x
FOR XML AUTO

该查询返回:

<x ="Buchanan"/>

在带 FOR XML AUTO 子句的 SELECT 语句中使用派生表可能不会产生希望的嵌套。
当指定使用 FOR XML AUTO 模式的查询时,将实现 FOR BROWSE 模式。FOR XML AUTO 模式使用 FOR BROWSE 模式提供的信息确定结果集中的层次结构。

例如,请看下面的查询。在该查询中创建了派生表 P。

SELECT c.CompanyName,
o.OrderID,
o.OrderDate,
p.ProductName,
p.Quantity,
p.UnitPrice,
p.Total
FROM Customers AS c
JOIN
Orders AS o
ON
c.CustomerID = o.CustomerID
JOIN
(
SELECT od.OrderID,
pr.ProductName,
od.Quantity,
od.UnitPrice,
od.Quantity * od.UnitPrice AS total
FROM Products AS pr
JOIN
[Order Details] AS od
ON
pr.ProductID = od.ProductID
) AS p
ON
o.OrderID = p.OrderID
FOR XML AUTO

下面是部分结果:

vinsonshen 2004-12-08
  • 打赏
  • 举报
回复

FOR XML 子句的基本语法
在 FOR 子句中指定 XML 模式的基本语法为:

FOR XML mode [, XMLDATA] [, ELEMENTS][, BINARY BASE64]

参数
XML mode

指定 XML 模式。XML 模式决定所得到的 XML 的形式。
mode 可以是 RAW、AUTO 或 EXPLICIT。

XMLDATA

指定应返回 XML-Data 架构。文档的架构被预先设计为内嵌式架构。

ELEMENTS

如果指定 ELEMENTS 选项,则列作为子元素返回。否则,列将映射到 XML 特性。只有在 AUTO 模式下才支持该选项。

BINARY BASE64

如果指定 BINARY Base64 选项,则查询所返回的任何二进制数据都用 base64 编码格式表示。使用 RAW 和 EXPLICIT 模式检索二进制数据时,必须指定该选项。在 AUTO 模式中,默认情况下将二进制数据作为引用返回。
lmj2003 2004-12-08
  • 打赏
  • 举报
回复
学习
学习
vinsonshen 2004-12-08
  • 打赏
  • 举报
回复
学习下~~~
lsxaa 2004-12-08
  • 打赏
  • 举报
回复
学习
flyelf 2004-12-08
  • 打赏
  • 举报
回复
gz

34,588

社区成员

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

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