2017-09-01 26 views
0

我必須得到公司節點元素的值。我嘗試了所有的 方法從節點獲取數據,但沒有運氣。以下是我的XML。如何在sql server中用命名空間獲取XML節點值?

<?xml version="1.0"?> 
    <CompanyInvoice xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Customer xmlns="http://t.service/CompanyServices/"> 
     <Company> 
      <CompanyId>10001</CompanyId> 
      <CoastalId>454564564564564564564564565465454546565555555</CoastalId> 
      <CompanyFederalId>345345</CompanyFederalId> 
      <CompanyName>Anytime Home</CompanyName> 
      <CompanyAddress>Address1</CompanyAddress> 
      <CompanyCity>TR</CompanyCity> 
      <CompanyState>UT</CompanyState> 
      <CompanyPostalCode>11</CompanyPostalCode> 
      <CompanyCountry>IT</CompanyCountry> 
      <CompanyTelephone>(999) 999-9999</CompanyTelephone> 
     </Company> 
     <CustomerId>33642</CustomerId>  
     </Customer> 
     </CompanyInvoice> 

TSQL代碼: 我只是嘗試了這一點,但沒有得到任何更新

Declare @DATAXML xml ='<?xml version="1.0"?> 
    <CompanyInvoice xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Customer xmlns="http://t.service/CompanyServices/"> 
     <Company> 
      <CompanyId>10001</CompanyId> 
      <CoastalId>454564564564564564564564565465454546565555555</CoastalId> 
      <CompanyFederalId>345345</CompanyFederalId> 
      <CompanyName>Anytime Home</CompanyName> 
      <CompanyAddress>Address1</CompanyAddress> 
      <CompanyCity>TR</CompanyCity> 
      <CompanyState>UT</CompanyState> 
      <CompanyPostalCode>11</CompanyPostalCode> 
      <CompanyCountry>IT</CompanyCountry> 
      <CompanyTelephone>(999) 999-9999</CompanyTelephone> 
     </Company> 
     <CustomerId>33642</CustomerId>  
     </Customer> 
     </CompanyInvoice>' 


;WITH XMLNAMESPACES('http://t.service/CompanyServices/' as x) 
Select 
a.value('x:CompanyId[1]','nvarchar(50)') as CompanyId, 
a.value('x:CoastalId[1]','nvarchar(500)') as CoastalId, 
a.value('x:CompanyName[1]','nvarchar(500)') as CompanyName 
From @DATAXML.nodes('/CompanyInvoice/Customer/Company')as a (a) 
+0

https://stackoverflow.com/questions/19165213/how-to-query-for-xml-values-and-attributes-from-table -in-sql-server – Amit

+1

您需要在查詢中引入和使用名稱空間。請參閱https://docs.microsoft.com/en-us/sql/relational-databases/xml/add-namespaces-to-queries-with-with-xmlnamespaces#using-with-xmlnamespaces-with-the-xml-data -type-methods – Serg

+0

@Serg,我介紹命名空間,但沒有運氣 – sachin

回答

1

基本上你有兩種選擇。 1.正確引入和使用名稱空間。注意名稱空間的作用域。 2.使用通配符命名空間(在生產中不推薦)

Declare @DATAXML xml = N'<?xml version="1.0"?> 
    <CompanyInvoice xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Customer xmlns="http://t.service/CompanyServices/"> 
     <Company> 
      <CompanyId>10001</CompanyId> 
      <CoastalId>454564564564564564564564565465454546565555555</CoastalId> 
      <CompanyFederalId>345345</CompanyFederalId> 
      <CompanyName>Anytime Home</CompanyName> 
      <CompanyAddress>Address1</CompanyAddress> 
      <CompanyCity>TR</CompanyCity> 
      <CompanyState>UT</CompanyState> 
      <CompanyPostalCode>11</CompanyPostalCode> 
      <CompanyCountry>IT</CompanyCountry> 
      <CompanyTelephone>(999) 999-9999</CompanyTelephone> 
     </Company> 
     <CustomerId>33642</CustomerId>  
     </Customer> 
     </CompanyInvoice>'; 


WITH XMLNAMESPACES('http://t.service/CompanyServices/' as x) 
Select 
a.value('x:CompanyId[1]','nvarchar(50)') as CompanyId, 
a.value('x:CoastalId[1]','nvarchar(500)') as CoastalId, 
a.value('x:CompanyName[1]','nvarchar(500)') as CompanyName 
From @DATAXML.nodes('CompanyInvoice/x:Customer/x:Company')as a (a); 

-- 

select t.node.value('*:CompanyId[1]', 'int') 
from @DATAXML.nodes('*:CompanyInvoice/*:Customer/*:Company') t(node); 
+0

感謝此,但爲什麼我們在生產中不使用通配符 – sachin

+0

通常,xml來自另一個鬆散耦合的系統,我們不希望任何不良內容進入我們的數據庫。由於名稱空間是數據交換合同的重要組成部分,我們最好嚴格按合同規定的方式定義它們。 – Serg

0

試試這個這只是和其他例如

REferThis for more info

DECLARE @foo XML 

SELECT @foo = N' 
<harrys> 
    <harry> 
     <fish>0.015000000000</fish> 
     <bicycle>2008-10-31T00:00:00+01:00</bicycle> 
     <foo>ü</foo> 
    </harry> 
    <harry> 
     <fish>0.025000000000</fish> 
     <bicycle>2008-08-31T00:00:00+01:00</bicycle> 
     <foo>ä</foo> 
    </harry> 
</harrys> 
' 

SELECT 
    CAST(CAST(y.item.query('data(fish)') AS varchar(30)) AS float), 
    CAST(LEFT(CAST(y.item.query('data(bicycle)') AS char(25)), 10) AS smalldatetime), 
    CAST(y.item.query('data(foo)') AS varchar(25)) 
FROM 
    @foo.nodes('/*') x(item) 
    CROSS APPLY 
    x.item.nodes('./*') AS y(item) 

SELECT 
    CAST(CAST(x.item.query('data(fish)') AS varchar(30)) AS float), 
    CAST(LEFT(CAST(x.item.query('data(bicycle)') AS char(25)), 10) AS smalldatetime), 
    CAST(x.item.query('data(foo)') AS varchar(25)) 
FROM 
    @foo.nodes('harrys/harry') x(item) 

SELECT 
    CAST(CAST(y.item.query('data(fish)') AS varchar(30)) AS float), 
    CAST(LEFT(CAST(y.item.query('data(bicycle)') AS char(25)), 10) AS smalldatetime), 
    CAST(y.item.query('data(foo)') AS varchar(25)) 
FROM 
    @foo.nodes('/harrys') x(item) 
    CROSS APPLY 
    x.item.nodes('./harry') AS y(item) 

如果這劑量然後工作 Alternate Link

+0

感謝您的回覆,但這並不能幫助我實現我的結果。我已經添加了我的tsql代碼。嘗試獲取這些值 – sachin

相關問題