2

我正在尝试从 Xml 数据类型中获取一些值。数据如下:

<Individual xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <FirstName xmlns="http://nswcc.org.au/BusinessEntities.Crm">Lirria</FirstName>
    <LastName xmlns="http://nswcc.org.au/BusinessEntities.Crm">Latimore</LastName>
</Indvidual>

注意元素 FirstName 和 LastName 中存在 xmlns - 这是在我们通过序列化 ac# 业务对象创建 xml 时添加的。无论如何,元素中此名称空间的存在似乎导致 XQuery 表达式失败,例如:

SELECT MyTable.value('(//Individual/LastName)[1]','nvarchar(100)') AS FirstName

这将返回 null。但是当我从 xml 中的元素中剔除命名空间时(例如,使用 Replace T-SQL 语句),上面会返回一个值。但是必须有更好的方法——有没有一种方法可以使这个查询工作,即不先更新 xml?

谢谢

约翰戴维斯

4

2 回答 2

7

您需要正确命名要选择的元素。请参阅使用 WITH XMLNAMESPACES 添加命名空间。这是使用您的 XML 的示例:

declare @x xml;
set @x = N'<Individual 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <FirstName xmlns="http://nswcc.org.au/BusinessEntities.Crm">Lirria</FirstName>
        <LastName xmlns="http://nswcc.org.au/BusinessEntities.Crm">Latimore</LastName>
    </Individual>';

with xmlnamespaces (N'http://nswcc.org.au/BusinessEntities.Crm' as crm)
select @x.value(N'(//Individual/crm:LastName)[1]',N'nvarchar(100)') AS FirstName
于 2009-10-19T04:29:57.513 回答
0

* 通配符还允许您在不强制使用显式命名空间的情况下选择元素。Remus 的回答是要走的路,但这可能有助于其他有命名空间问题的人:

select @x.value(N'(//Individual/*:LastName)[1]',N'nvarchar(100)')
于 2014-03-21T11:50:30.030 回答