2009-08-28 53 views
2

的SQLServer有一個稱爲OPENXML一個非常有用的功能。它的工作原理是這樣使用:OPENXML Postgres裏

DECLARE @idoc int 
DECLARE @doc varchar(1000) 
SET @doc =' 
<ROOT> 
<Customer CustomerID="VINET" ContactName="Paul Henriot"> 
    <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> 
     <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> 
     <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> 
    </Order> 
</Customer> 
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> 
    <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> 
     <OrderDetail OrderID="10283" 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 that uses the OPENXML rowset provider. 
SELECT * 
FROM OPENXML (@idoc, '/ROOT/Customer',1) 
WITH (CustomerID varchar(10), 
     ContactName varchar(20)) 

有了結果:

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

是否有人知道的Postgres替代的?

回答

1

這是目前不可能在PostgreSQL的(除非有人寫真棒代碼,他沒有告訴任何人到現在爲止)。

1

我敢肯定,這個代碼可以改善,但是這似乎Postgres裏返回相同的結果,你不張貼在SQL Server的代碼。

WITH test_xml(data) AS (VALUES 
    ('<ROOT> 
    <Customer CustomerID="VINET" ContactName="Paul Henriot"> 
     <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> 
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> 
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> 
     </Order> 
    </Customer> 
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> 
     <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> 
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/> 
     </Order> 
    </Customer> 
    </ROOT>'::XML) 
) 
SELECT unnest((xpath('//Customer/@CustomerID', test_xml.data))), 
     unnest((xpath('//Customer/@ContactName', test_xml.data))) 
FROM test_xml