Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中从XML中提取属性_Sql Server_Xml - Fatal编程技术网

Sql server 在SQL Server中从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>

鉴于此XML:

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);