使用FOR XML限制
FOR XML AUTO和FOR XML RAW 对返回二进制数据都不提供完全支持。例如,若选择一个二进制字段(比如 Employees.Photo列)并使用FOR XML RAW,则会收到一条难以处理的错误消息。避免这种情况的一种方法是将一个URL返给二进制数据字段。这就需要首先在IIS中建立一个SQL Server虚拟目录。另一种方法不需要进行IIS配置,它是在FOR XML子句中指定BINARY BASE64选项,如以下代码所示:
SELECT EmployeeID, FirstName, LastName, Photo
FROM Employees
WHERE LastName LIKE 'D%'
FOR XML RAW,BINARY BASE64
这样SQL Server就会使用BASE64格式来格式化二进制数据。其优点是SQL语句将不再改变。缺点是读取使用BINARY BASE64的查询结果不方便。下面的XML是使用BINARY BASE64时所返回的结果的一个例子。这里削减了Photo属性的内容,因为其长度超过了14,000个字符!
<row EmployeeID="1" FirstName="Nancy"
LastName="Davolio" Photo="FRw...f4="/>
FOR XML AUTO模式的另一个限制是它不支持GROUP BY子句或聚合函数。不过,可以通过选择若干行、构成TABLE变量,然后使用FOR XML AUTO子句从该中间表中检索这些行来避开这种限制。下面的SQL代码即可完成这一任务:
DECLARE @TempTable TABLE (OrderID INT, Total MONEY)
INSERT INTO @TempTable
SELECT OrderID, SUM(UnitPrice * Quantity) AS Total
FROM [Order Details]
GROUP BY OrderID
SELECT OrderID, Total FROM @TempTable AS OrderDetails FOR XML AUTO
使用FOR XML时,还必须说明计算列。尽管FOR XML支持计算列,但仍需确保对这些列进行命名。当FOR XML试图创建每一列的属性时,就会出现问题。属性名是通过使用关联的列名创建的。因此如果该列是一个计算列且没有别名,则SQL Server将停滞不前。简单的办法是确保给计算列取个别名,如下面的SQL语句及其XML结果所示:
SELECT TOP 1 LastName + ', ' + FirstName AS FullName
FROM Employees
FOR XML AUTO
<Employees FullName="Davolio, Nancy"/>
使用FOR XML时值得注意的最后一个问题是任何专用的XML字符都将通过使用XML编码来转换。正如HTML可以转换URL中的专用字符一样,适当形式的XML可以编码专用字符。例如,如果<字符包含在数据中,则它将转换成“<”。
如何使用SQL Server 2000中的XML功能一
0
相关文章