2012-05-24 48 views
1

如果名稱空間在所有元素中都加上前綴,您將如何編寫t-sql查詢?我已經嘗試了許多變化,這是迄今爲止,但它只是不起作用...但T-SQL中的XML名稱空間

DECLARE @x xml 
SET @x = (SELECT xml_data_column FROM dbo.Table 
WHERE xmlFileName = 'E:\trnFile.xml' ) 
;WITH XMLNAMESPACES('http://schemas.xmlsoap.org/soap/envelope/' AS [soap] 
, 'tns:RetrievePurchaseResponse xmlns:tns="urn:Transaction"' AS tns) 
SELECT t.c.value('orderRef[1]', 'int') orderReference 
, t.c.value('orderNumber[1]', 'varchar(100)') orderNumber 
, t.c.value('subtotal[1]', 'varchar(100)') subtotal 
FROM @x.nodes('/soap:Envelope/soap:Body/tns:RetrievePurchaseResponse/tns:purchase') AS t(c) 

援助將不勝感激!

下面是XML輸入文件:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Body> 
<tns:RetrievePurchaseResponse xmlns:tns="urn:Transaction"> 
    <tns:purchase> 
    <tns:orderRef>10027</tns:orderRef> 
     <tns:orderNumber>425816</tns:orderNumber> 
     <tns:subtotal>95.00</tns:subtotal> 
</tns:purchase> 
    </tns:RetrievePurchaseResponse> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

預計產出將是

orderReference,  orderNumber, orderUserEmail 
10027,  425816,    [email protected] 
+0

請發表你正在處理的XML的樣本和預期產出您使用該XML的查詢。 –

+0

好的,我添加了它作爲參考 – brynn

回答

2
DECLARE @x xml 

SET @x = (
    SELECT xml_data_column 
    FROM dbo.Table 
    WHERE xmlFileName = 'E:\trnFile.xml' 
); 

WITH XMLNAMESPACES(
    'urn:Transaction' AS tns 
) 
SELECT 
    t.c.value('tns:orderRef[1]', 'int') orderReference 
, t.c.value('tns:orderNumber[1]', 'varchar(100)') orderNumber 
, t.c.value('tns:subtotal[1]', 'varchar(100)') subtotal 
FROM 
    @x.nodes('//tns:RetrievePurchaseResponse/tns:purchase') AS t(c) 
+1

哇!謝謝!工作!我只需要將元素的前綴添加到元素中即可使其起作用。即tns: tcvalue('tns:orderRef [1]','int')orderReference ,tcvalue('tns:orderNumber [1]','varchar(100)')orderNumber,tcvalue('tns:小計[1]','varchar(100)')小計 – brynn

+0

@brynn對,我忘了這麼做。答覆修改。 – Tomalak

1
declare @x xml 
set @x = ' 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <tns:RetrievePurchaseResponse xmlns:tns="urn:Transaction"> 
     <tns:purchase> 
     <tns:orderRef>10027</tns:orderRef> 
     <tns:orderNumber>425816</tns:orderNumber> 
     <tns:subtotal>95.00</tns:subtotal> 
     </tns:purchase> 
    </tns:RetrievePurchaseResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>'; 

with xmlnamespaces('urn:Transaction' as tns) 
select 
    @X.value('(//tns:RetrievePurchaseResponse/tns:purchase/tns:orderRef)[1]', 'int') orderReference, 
    @x.value('(//tns:RetrievePurchaseResponse/tns:purchase/tns:orderNumber)[1]', 'int') orderNumber, 
    @x.value('(//tns:RetrievePurchaseResponse/tns:purchase/tns:orderUserEmail)[1]', 'varchar(100)') orderUserEmail 
+0

非常感謝,Mikael,你的版本工作太:-) – brynn