在其他数据库产品中是否存在与MS SQL“FOR XML PATH”相同的内容?

时间:2009-03-20 02:43:38

标签: sql xml

我目前正在使用Microsoft的FOR XML PATH功能以XML格式从MS SQL Server中提取数据。我非常喜欢这个功能,但是使用特定于供应商的功能总是很不舒服。

是否有其他主要数据库供应商有类似的东西?

修改

让我更具体地说明我正在寻找的功能类型

在MS SQL中,您可以使用此查询

SELECT so.id AS '@Id',
       so.Code AS '@Code',  
       cu.Code AS 'Customer/@Code',
       cu.Name AS 'Customer/@Name',
       (SELECT Item_Num AS '@Item',
                pa.Code AS '@PartCode'
        FROM tblSalesItem si
            LEFT JOIN tblPart pa ON pa.Id = si.Part_Id
        WHERE si.SalesOrder_ID = so.Id 
        FOR XML PATH('SalesItem') , type) 
FROM tblSalesOrder so
    JOIN tblCustomer cu ON so.customer_id = cu.ID
FOR XML PATH('SalesOrder'), ROOT('SalesOrders')

生成此XML

<SalesOrders>
  <SalesOrder Id="13" Code="C1002     ">
    <Customer Code="ROBERTS   " Name="Roberts Equipment  Inc." />
    <SalesItem Item="1" PartCode="FP-0001" />
    <SalesItem Item="2" PartCode="FP-0003" />
  </SalesOrder>
  <SalesOrder Id="15" Code="C1004     ">
    <Customer Code="EXBEL-LIFTS" Name="Exbel Lifts Inc." />
    <SalesItem Item="1" />
  </SalesOrder>
</SalesOrders>

我可以逐列控制元素和属性的使用。我可以创建元素的属性以将相关列组合在一起。我可以使用子查询来生成嵌套元素。您甚至可以使用返回XML的函数来生成任意深度的树。

3 个答案:

答案 0 :(得分:2)

FOR XML PATH不符合ANSI SQL-92标准,因此将取决于各个供应商。我不知道Oracle或MySQL中的任何等价物。

答案 1 :(得分:2)

PostgreSQL 8.3没有专门的FOR XML PATH,但其XML函数(参见section 9.14 of the manual,特别是9.14.3)似乎提供了非常相似的功能。

答案 2 :(得分:0)

Oracle在其数据库中有一整套XML处理包。您甚至可以将XML直接存储到数据库中(无INSERTS)并进行查询。有关示例,请参阅:How to format xml with oracle

以下是其中一个例子:

    SQL> select dbms_xmlgen.getxml('select employee_id, first_name,
  2  last_name, phone_number from employees where rownum < 6') xml
  3  from dual

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <EMPLOYEE_ID>100</EMPLOYEE_ID>
  <FIRST_NAME>Steven</FIRST_NAME>
  <LAST_NAME>King</LAST_NAME>
  <PHONE_NUMBER>515.123.4567</PHONE_NUMBER>
 </ROW>
 <ROW>
  <EMPLOYEE_ID>103</EMPLOYEE_ID>
  <FIRST_NAME>Alexander</FIRST_NAME>
  <LAST_NAME>Hunold</LAST_NAME>
  <PHONE_NUMBER>590.423.4567</PHONE_NUMBER>
 </ROW>
 <ROW>
  <EMPLOYEE_ID>104</EMPLOYEE_ID>
  <FIRST_NAME>Bruce</FIRST_NAME>
  <LAST_NAME>Ernst</LAST_NAME>
  <PHONE_NUMBER>590.423.4568</PHONE_NUMBER>
   </ROW>
  </ROWSET>