SQL Server命名空间

时间:2014-11-24 17:29:40

标签: sql-server xml

我试图从SQL Server读取XML文件。我认为这是Namespace的一个问题.. 这是我简单的XML的一个例子:

<?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命名空间的行

<ArrayOfStatistica xmlns =
"http://schemas.datacontract.org/2004/07/LiveUpdateWS" xmlns: i =
"http://www.w3.org/2001/XMLSchema -instance ">

一切正常。

2 个答案:

答案 0 :(得分:1)

好吧,如果您使用WITH XMLNAMESPACES,那么您 定义默认 XML命名空间,该命名空间可以在不使用显式前缀的情况下应用,或者您定义XML您需要在XPath表达式中使用前缀的命名空间。

要使用默认 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) 

答案 1 :(得分: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)