SQL Server - 具有缺少命名空间的查询XML列

问题描述:

这个问题看起来真的很讨厌。在名为“Message”的列中有以下小XML,我想查询它。我遇到的问题是“ClaimData”元素。如您所见,它将其名称空间设置为空字符串。SQL Server - 具有缺少命名空间的查询XML列

<DataExchange xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.abc.com/library/DataExchange"> 
    <Data> 
     <ClaimData xmlns=""> 
      <CurrentClaimNumber>TEST0000319001</CurrentClaimNumber> 
     </ClaimData> 
    </Data> 
</DataExchange>  

下面的查询是针对XML列返回NULL值,因为ClaimData元素使用一个空的命名空间,我不知道如何在XML列的查询表明这一点。

有人可以给出一个工作(并希望测试)如何查询XML消息列中的“CurrentClaimNumber”元素(这是“ClaimData”的子元素)的例子吗?

非常非常感谢。

WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    DEFAULT 'http://schemas.rising.com/library/DataExchange' 
) SELECT [StoredMessageID], 
    Message.value('(/DataExchange/Data/ClaimData/CurrentClaimNumber)[1]', 'CHAR(750)') 
    FROM [DataExchange].[dbo].[MessageStorage] 

如何将默认名称空间分配给前缀以便您可以使用空名称空间而不使用空名称空间?如下

WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    'http://schemas.abc.com/library/DataExchange' AS "de" 
) SELECT [StoredMessageID], 
    Message.value('(/de:DataExchange/de:Data/ClaimData/CurrentClaimNumber)[1]', 
                     'CHAR(750)') 
    FROM [DataExchange].[dbo].[MessageStorage] 

验证:这可能是唯一的选择

insert into MessageStorage values(' 
<DataExchange 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.abc.com/library/DataExchange"> 
    <Data> 
     <ClaimData xmlns=""> 
      <CurrentClaimNumber>TEST0000319001</CurrentClaimNumber> 
     </ClaimData> 
    </Data> 
</DataExchange>'); 


WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    'http://schemas.abc.com/library/DataExchange' AS "de" 
) SELECT [StoredMessageID], 
    Message.value('(/de:DataExchange/de:Data/ClaimData/CurrentClaimNumber)[1]', 
                     'CHAR(750)') 
    FROM [dbo].[MessageStorage] 

结果:

1  TEST0000319001 
+0

我原来的XML是稍有不妥。命名空间应该出现在开放的DataExchange元素中。尽管在你的回应中,我认为你没有注意到。您的解决方案不起作用,因为ClaimData元素不使用默认名称空间。它使用一个空的(即缺少)名称空间。 – 2013-03-14 13:18:37

+0

它使用空名称空间。我对此很清楚。如果您指定了默认名称空间,则将无法访问空名称空间。你尝试了我的解决方案,还是假设它不起作用? – JLRishe 2013-03-14 13:36:38

+0

我做了尝试,但似乎我犯了一个错误。确实有效。非常感谢你。这节省了我很多时间。 – 2013-03-14 17:20:09