从 XML 个节点查询值(可能是 NAMESPACE 问题)
Querying values from XML nodes (possible NAMESPACE issue)
我已经处理过查询 XML 并且我有一个看起来应该是非常简单的查询。
我的数据以XML格式存储,例如:
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>'
我正在查询它:
;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)
我试过在字段后有和没有“[1]”,没有 NAMESPACE
我试过使用 //Email[1]
或 @Email
进行查询,但我没有运气。有什么建议吗?
你很接近 - 不需要命名空间 - 但你的语法有点不对劲 - 试试这个:
select
C.value('Email[1]', 'varchar(255)'),
C.value('FirstName[1]', 'varchar(25)')
FROM
@data.nodes('data-set/Row') as T(C)
XPath 表达式(.value()
调用中的第一个参数)需要放在括号中 - 它应该 而不是 以 /
开头(因为它是 "relative" 到 .nodes()
调用返回的 XML 片段。
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)
我已经处理过查询 XML 并且我有一个看起来应该是非常简单的查询。
我的数据以XML格式存储,例如:
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>'
我正在查询它:
;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)
我试过在字段后有和没有“[1]”,没有 NAMESPACE
我试过使用 //Email[1]
或 @Email
进行查询,但我没有运气。有什么建议吗?
你很接近 - 不需要命名空间 - 但你的语法有点不对劲 - 试试这个:
select
C.value('Email[1]', 'varchar(255)'),
C.value('FirstName[1]', 'varchar(25)')
FROM
@data.nodes('data-set/Row') as T(C)
XPath 表达式(.value()
调用中的第一个参数)需要放在括号中 - 它应该 而不是 以 /
开头(因为它是 "relative" 到 .nodes()
调用返回的 XML 片段。
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)