Sql server 在SQL Server中从XML中提取属性
鉴于此XML:Sql server 在SQL Server中从XML中提取属性,sql-server,xml,Sql Server,Xml,鉴于此XML: DECLARE @input XML = '<Data> <Tab Name="UserData"> <Row> <BeneficialOwnerName>Fred Flintstone</BeneficialOwnerName> <TaxID>111-11-1111</TaxID> </Row> <Row>
DECLARE @input XML = '<Data>
<Tab Name="UserData">
<Row>
<BeneficialOwnerName>Fred Flintstone</BeneficialOwnerName>
<TaxID>111-11-1111</TaxID>
</Row>
<Row>
<BeneficialOwnerName>Barney Rubble</BeneficialOwnerName>
<TaxID>222-22-2222</TaxID>
</Row>
</Tab>
<Tab Name="OtherData">
<Row>
<BeneficialOwnerName>Bugs Bunny</BeneficialOwnerName>
<TaxID>333-33-3333</TaxID>
</Row>
<Row>
<BeneficialOwnerName>Road Runner</BeneficialOwnerName>
<TaxID>444-44-4444</TaxID>
</Row>
</Tab>
</Data>'
我的SQL如下所示:
SELECT
Name = XCol.value('@Name','varchar(25)'),
BeneficialOwnerName = XCol.value('BeneficialOwnerName[1]','varchar(25)'),
TaxID = XCol.value('TaxID[1]','varchar(25)')
FROM
@input.nodes('/Data/Tab/Row') AS XTbl(XCol)
但取决于我如何调整FROM子句,我会得到两行选项卡名称或4行选项卡名称为Null的数据
我需要做什么才能显示数据
谢谢
卡尔除了姓名栏,一切都很好。试试这个:
SELECT
Name = XCol.value('../@Name','varchar(25)'),
BeneficialOwnerName = XCol.value('BeneficialOwnerName[1]','varchar(25)'),
TaxID = XCol.value('TaxID[1]','varchar(25)')
FROM
@input.nodes('/Data/Tab/Row') AS XTbl(XCol)
从性能的角度来看,访问父元素往往比单独选择每个级别更昂贵。对于您的示例,下面的代码稍微快一点,但在更大的XML上会有明显的不同:
SELECT
Name = t.c.value('@Name','varchar(25)'),
BeneficialOwnerName = r.c.value('BeneficialOwnerName[1]','varchar(25)'),
TaxID = r.c.value('TaxID[1]','varchar(25)')
FROM @input.nodes('/Data/Tab') t(c)
cross apply t.c.nodes('./Row') r(c);
回答很好,+1来自我这边,只是一个小小的提示:如果你想要最好的性能,最好使用
(TaxID/text())[1]
,或者-甚至稍微快一点-TaxID[1]/text()[1]
。您可能知道为什么使用text()
@Shnugo会更快,从技术上讲是的,而且两者之间存在差异。然而,即使计划不同,该样本的性能差异也可以忽略不计。我们需要一个更大或更复杂的XML才能注意到这一点+从我这边
SELECT
Name = t.c.value('@Name','varchar(25)'),
BeneficialOwnerName = r.c.value('BeneficialOwnerName[1]','varchar(25)'),
TaxID = r.c.value('TaxID[1]','varchar(25)')
FROM @input.nodes('/Data/Tab') t(c)
cross apply t.c.nodes('./Row') r(c);