从XML节点查询值(可能是NAMESPACE问题)

时间:2016-03-29 21:10:08

标签: sql-server xml sql-server-2008-r2 xquery-sql

我一直在查询XML,我觉得它应该是一个非常简单的查询。

我的数据以XML格式存储,例如:

for (int i = 0; i < myarr.length; i++) {
     myarr[i] = 0;
}

我使用以下方式查询:

declare @data xml = 
'<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Row>
        <Dept>DepartmentName</Dept>
        <FirstName>John</FirstName>
        <LastName>Smith</LastName>
        <Alias>JSmith</Alias>
        <PhoneNo>5555555555</PhoneNo>
        <Email>JSmith@company.com</Email>
        <AcctNo>123456</AcctNo>
    </Row>
    <Row>
    ...
    </Row>
</data-set>'

我已经在字段之后使用'[1]'进行了尝试,没有使用;WITH XMLNAMESPACES (DEFAULT 'http://www.w3.org/2001/XMLSchema-instance') select C.value('/Row[1]/Email[1]','varchar(max)') C.value('/Row[1]/FirstName[1]','varchar(max)') from @data.nodes('data-set') as T(C) 我尝试使用NAMESPACE//Email[1]进行查询但是没有运气。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你很接近 - 不需要命名空间 - 但你的语法略有偏差 - 试试这个:

select
    C.value('Email[1]', 'varchar(255)'),
    C.value('FirstName[1]', 'varchar(25)')
FROM
    @data.nodes('data-set/Row') as T(C)

XPath表达式(.value()调用中的第一个参数)需要在括号中 - 它应该/开头(因为它是“相对的” .nodes()调用返回的XML片段。

答案 1 :(得分:2)

declare @data xml = 
'<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Row>
        <Dept>DepartmentName</Dept>
        <FirstName>John</FirstName>
        <LastName>Smith</LastName>
        <Alias>JSmith</Alias>
        <PhoneNo>5555555555</PhoneNo>
        <Email>JSmith@company.com</Email>
        <AcctNo>123456</AcctNo>
    </Row>
    <Row>
        <Dept>DepartmentName</Dept>
        <FirstName>Alan</FirstName>
        <LastName>Wake</LastName>
        <Alias>AWake</Alias>
        <PhoneNo>7777777777</PhoneNo>
        <Email>AWake@company.com</Email>
        <AcctNo>123457</AcctNo>
    </Row>
</data-set>'


select  T.C.value('(Email)[1]','varchar(max)') as Email,
        T.C.value('(FirstName)[1]','varchar(max)') as FirstName
from @data.nodes('/data-set/Row') as T(C)

结果:

Email                     FirstName
------------------------- -------------------------
JSmith@company.com        John
AWake@company.com         Alan

(2 row(s) affected)