在SQL Server中加载XML会返回空值

时间:2014-11-09 10:42:53

标签: sql-server xml

我尝试将XML文件加载到SQL Server中,但是当我加载属性dtv:AppVersion时,我已经获得了空值。

我正在使用此代码加载它:

DECLARE @xml xml 

SET @xml = N'
<?xml version="1.0" ?>
   <POSLog xmlns="http://www.nrf-arts.org/IXRetail/namespace/"
           xmlns:dtv="http://www.datavantagecorp.com/xstore/"   
           xmlns:cbp="http://www.datavantagecorp.com/xstore/cbp/"
           mlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:schemaLocation="http://www.nrf-arts.org/IXRetail/namespace/POSLog.xsd">
     <Transaction CancelFlag="false" TrainingModeFlag="false" OfflineFlag="false"  dtv:AppVersion="3.4.1.9 - 8.6.0 - 0.0">
<RetailStoreID>2001</RetailStoreID>
<WorkstationID>1</WorkstationID>
<TillID>0</TillID>
<SequenceNumber>62602</SequenceNumber>
 </Transaction>
</POSLog>'

;with xmlnamespaces(default 'http://www.nrf-arts.org/IXRetail/namespace/')
SELECT doc.col.value('@CancelFlag', 'Varchar(50)') CancelFlag,
       doc.col.value('@TrainingModeFlag', 'Varchar(50)') TrainingModeFlag,
       doc.col.value('@OfflineFlag', 'Varchar(50)') OfflineFlag,
       doc.col.value('@AppVersion', 'Varchar(50)') AppVersion, 
       doc.col.value('RetailStoreID[1]', 'Varchar(50)') RetailStoreID,
       doc.col.value('WorkstationID[1]', 'Varchar(50)') WorkstationID,
       doc.col.value('TillID[1]', 'Varchar(50)') TillID,
       doc.col.value('SequenceNumber[1]', 'Varchar(50)') SequenceNumber
FROM @xml.nodes('/POSLog/Transaction') doc(col)

问题是dtv:AppVersion的值始终为null:错误在哪里?

非常感谢每一个建议。

1 个答案:

答案 0 :(得分:1)

您需要在xmlnamespaces子句中引用命名空间,并在查询元素中引用它。

;with xmlnamespaces(default 'http://www.nrf-arts.org/IXRetail/namespace/', 
'http://www.datavantagecorp.com/xstore/' as dtv)
SELECT doc.col.value('@CancelFlag', 'Varchar(50)') CancelFlag,
       doc.col.value('@TrainingModeFlag', 'Varchar(50)') TrainingModeFlag,
       doc.col.value('@OfflineFlag', 'Varchar(50)') OfflineFlag,
       doc.col.value('@dtv:AppVersion', 'Varchar(50)') AppVersion, 
       doc.col.value('RetailStoreID[1]', 'Varchar(50)') RetailStoreID,
       doc.col.value('WorkstationID[1]', 'Varchar(50)') WorkstationID,
       doc.col.value('TillID[1]', 'Varchar(50)') TillID,
       doc.col.value('SequenceNumber[1]', 'Varchar(50)') SequenceNumber
FROM @xml.nodes('/POSLog/Transaction') doc(col)