2014-11-24 179 views
0

我試圖從SQL Server讀取XML文件。我認爲這是與命名空間的問題.. 這是我簡單的XML的例子:SQL Server命名空間

<?xml version="1.0"?> 
<ArrayOfStatistica xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://schemas.datacontract.org/2004/07/LiveUpdateWS"> 
    <Statistica> 
     <BuildFinale>68</BuildFinale> 
     <BuildIniziale>1</BuildIniziale> 
     <DataInserimento>2014-11-21T09:34:25.387</DataInserimento> 
     <IdCliente>-1</IdCliente> 
     <IdOperazione>4</IdOperazione> 
     <IdRivenditore>-1</IdRivenditore> 
     <IdTipoProdotto>-1</IdTipoProdotto> 
     <IdUtente>2</IdUtente> 
     <IdVersione>3</IdVersione> 
    </Statistica> 
    <Statistica> 
     <BuildFinale>68</BuildFinale> 
     <BuildIniziale>1</BuildIniziale> 
     <DataInserimento>2014-11-21T09:37:43.84</DataInserimento> 
     <IdCliente>-1</IdCliente> 
     <IdOperazione>4</IdOperazione> 
     <IdRivenditore>-1</IdRivenditore> 
     <IdTipoProdotto>-1</IdTipoProdotto> 
     <IdUtente>2</IdUtente> 
     <IdVersione>3</IdVersione> 
    </Statistica> 
</ArrayOfStatistica> 

用下面的代碼:

;WITH XMLNAMESPACES ('http://schemas.datacontract.org/2004/07/LiveUpdateWS"' AS ArrayOfStatistica) 
SELECT 
    (SELECT Child.value('(IdStatistica)[1]', 'bigint')),  
    (SELECT Child.value('(IdUtente)[1]', 'int')),  
    (CASE WHEN Child.value('(IdRivenditore)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdRivenditore)[1]', 'int')) end),  
    (CASE WHEN Child.value('(IdCliente)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdCliente)[1]', 'int')) end), 
    (SELECT Child.value('(DataInserimento)[1]', 'datetime')),    
    (CASE WHEN Child.value('(IdTipoProdotto)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdTipoProdotto)[1]', 'int')) end), 
    (SELECT Child.value('(IdVersione)[1]', 'int')), 
    (SELECT Child.value('(BuildIniziale)[1]', 'bigint')), 
    (SELECT Child.value('(BuildFinale)[1]', 'bigint')), 
    (SELECT Child.value('(IdOperazione)[1]', 'int')) 

    FROM 
    @xmlfile.nodes('ArrayOfStatistica/Statistica') AS N(Child) 

我沒有得到任何選擇值。

我應該如何設置這個XML文件的命名空間? 如果我刪除了XML命名空間的線(http://schemas.datacontract.org/2004/07/LiveUpdateWS 「的xmlns:I =」 http://www.w3.org/2001/XMLSchema -instance「>) 一切工作正常

+1

爲什麼你有'(SELECT Child.value(...))'而不是僅僅是'Child.value(...)'?你爲什麼覺得你需要命名空間? (我的意思是,如果沒有它,那就去沒有它?) – 2014-11-24 17:34:14

回答

1

嗯,如果。您使用WITH XMLNAMESPACES,那麼你要麼定義地沒有使用一個明確的前綴應用了默認 XML命名空間,或者你定義了前綴,你需要在你的XPath表達式使用XML命名空間。

要使用默認 XML命名空間,請使用這樣的說法:

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/LiveUpdateWS') 

,然後您現有的XPath表達式(不加任何前綴)應該工作。

如果定義前綴,當你不得不使用,在你的XPath表達式前綴!

;WITH XMLNAMESPACES ('http://schemas.datacontract.org/2004/07/LiveUpdateWS' AS ns) 

SELECT 
    Child.value('(ns:IdStatistica)[1]', 'bigint'),  
    Child.value('(ns:IdUtente)[1]', 'int'),  
    .......  
FROM 
    @xmlfile.nodes('ns:ArrayOfStatistica/ns:Statistica') AS N(Child) 
0

考慮到所有的因素都在命名空間http://schemas.datacontract.org/2004/07/LiveUpdateWS,您可以使用DEFAULT(還要注意錯別字在您的命名空間 - 你有一個額外尾隨"

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/LiveUpdateWS') 
SELECT 
    (SELECT Child.value('(IdStatistica)[1]', 'bigint')),  
    (SELECT Child.value('(IdUtente)[1]', 'int')),  
    (CASE WHEN Child.value('(IdRivenditore)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdRivenditore)[1]', 'int')) end),  
    (CASE WHEN Child.value('(IdCliente)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdCliente)[1]', 'int')) end), 
    (SELECT Child.value('(DataInserimento)[1]', 'datetime')),    
    (CASE WHEN Child.value('(IdTipoProdotto)[1]', 'int') = -1 THEN NULL else (SELECT Child.value('(IdTipoProdotto)[1]', 'int')) end), 
    (SELECT Child.value('(IdVersione)[1]', 'int')), 
    (SELECT Child.value('(BuildIniziale)[1]', 'bigint')), 
    (SELECT Child.value('(BuildFinale)[1]', 'bigint')), 
    (SELECT Child.value('(IdOperazione)[1]', 'int')) 
    FROM 
    @xmlfile.nodes('ArrayOfStatistica/Statistica') AS N(Child)