2009-08-28 11 views
2

SQLServerには、OPENXMLという非常に便利な機能があります。PostgresのOPENXML

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

誰かが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)) 

:それはこのように使用されている作品?

答えて

1

これはPostgreSQLでは現時点では不可能です(誰かに今まで誰も教えてくれなかった素晴らしいコードを誰かが書いていない限り)。

1

私はこのコードを改善できると確信していますが、投稿されたコードがSQL Serverと同じ結果をPostgresに返すようです。

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