2014-11-24 3 views
0

Я пытаюсь прочитать XML-файл с SQL Server. Я думаю, что это проблема с пространством имен .. Это пример моего простого 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) 

Я не получить любое значение из SELECT.

Как установить пространство имен для этого xml-файла? Если удалить строки для пространства имен XML (http://schemas.datacontract.org/2004/07/LiveUpdateWS "Xmlns: я =" http://www.w3.org/2001/XMLSchema -instance «>) все работает отлично

+1

Почему вы '(SELECT Child.value (...)) 'в каждом столбце, а не просто' Child.value (...) '? Почему, по-вашему, вам нужна строка пространства имен? (Я имею в виду, если он работает без него, тогда просто без него?) –

ответ

1

Ну, если. вы используете WITH XMLNAMESPACES, то вы либо определить по умолчанию XML пространство имен, которое будет применяться без использования явного префикса, или вы определяете XML пространство имен с префиксом, что вам нужно для использования в XPath выражений.

Чтобы использовать пространство имен по умолчанию, используйте это утверждение:

;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) 
Смежные вопросы