2014-04-26 62 views
-3

我正在使用下面的查询从XML文件的属性ad元素中选择XML的值,但是我无法从XML页面属性中读取,所以任何人都请建议如何获取使用此查询的属性值。使用Xquery检索xml属性

select a_node.value('(./text())[1]', 'var char(50)') AS c_val, 
c1_node.value('(./text())[1]', 'var char(50)') AS c_val 2, 
ca_node.value('(./text())[1]', 'var char(50)') AS c_val3, 
d_node.value('(./text())[1]', 'var char(50)') , 
e_node.value('(./text())[1]', 'varchar(50)') , 
f_node.value('(./text())[1]', 'var char(50)') 
FROM @xmlData.nodes('/Reports/x:InquiryResponse/x:ReportData/x:AccountDetails/x:Account') AS b(b_node) 
outer APPLY b.b_node.nodes('./x:primarykey') AS pK_InquiryResponse (a_node) 
outer APPLY b.b_node.nodes('./x:seq') AS CustomerCode (c1_node) 
outer APPLY b.b_node.nodes('./x:id') AS amount (ca_node) 
outer APPLY b.b_node.nodes('./x:ReportedDate') AS CustRefField (d_node) 
outer APPLY b.b_node.nodes('./x:AccountNumber') AS ReportOrderNO (e_node) 
outer apply b.b_node.nodes('./x:CurrentBalance') as additional_id (f_node); 

编辑:XML片段在给予

<sch:Account seq="2" id="345778174" ReportedDate="2014-01-01"> 
    <sch:AccountNumber>TSTC1595</sch:AccountNumber> 
    <sch:CurrentBalance>0</sch:CurrentBalance> 
    <sch:Institution>Muthoot Fincorp Limited</sch:Institution> 
    <sch:PastDueAmount>0</sch:PastDueAmount> 
    <sch:DisbursedAmount>12000</sch:DisbursedAmount> 
    <sch:LoanCategory>JOG Group</sch:LoanCategory> 
</sch:Account> 

<sch:Account seq="2" id="345778174" ReportedDate="2014-01-01"> 
    <sch:BranchIDMFI>THRISSUR ROAD</sch:BranchIDMFI> 
    <sch:KendraIDMFI>COSTCO/RECENT-107</sch:KendraIDMFI> 
</sch:Account> 
+0

SqlServer标记?另外,你能提供一个Xml片段吗? – StuartLC

回答

3

解析的XQuery与XML松散@Variable

假定与此类似(即XML文档的所有属性在一个元件上):

DECLARE @xmlData XML = 
N'<Reports xmlns:x="http://foo"> 
    <x:InquiryResponse> 
     <x:ReportData> 
      <x:AccountDetails> 
       <x:Account x:primarykey="pk" x:seq="sq" x:id="id" 
          x:ReportedDate="2014-01-01T00:00:00" /> 
      </x:AccountDetails> 
     </x:ReportData> 
    </x:InquiryResponse> 
</Reports>'; 

列如下,您可以刮的属性:

WITH XMLNAMESPACES('http://foo' AS x) 
select 
    Nodes.node.value('(@x:primarykey)[1]', 'varchar(50)') AS c_val, 
    Nodes.node.value('(@x:seq)[1]', 'varchar(50)') AS c_val2, 
    Nodes.node.value('(@x:id)[1]', 'varchar(50)') AS c_val3, 
    Nodes.node.value('(@x:ReportedDate)[1]', 'DATETIME') as someDateTime 
FROM 
    @xmlData.nodes('/Reports/x:InquiryResponse/x:ReportData/x:AccountDetails/x:Account') 
    AS Nodes(node); 
  • 属性不需要text(),因为它们是自动弦乐器
  • 这是相当不寻常的命名空间中的属性 - 删除的xmlns别名前缀如果他们不是。

SqlFiddle here

编辑 - 解析XML列

  • 命名空间距离,你有一个表,而不是一个变量,因此APPLY要求数据的属性 -Assumed下降。请注意,OUTER APPLY将返回空值,例如仅当您的行具有 空Xml或缺少Xml元素时才有用。 CROSS APPLY是范数(即 施加XPath来在LHS表中选择的各行)
  • 元素被访问的类似的属性,只是没有@


WITH XMLNAMESPACES('http://foo' AS x) 
select 
    Nodes.node.value('(@seq)[1]', 'varchar(50)') AS c_val2, 
    Nodes.node.value('(@id)[1]', 'varchar(50)') AS c_val3, 
    Nodes.node.value('(@ReportedDate)[1]', 'DATETIME') as someDateTime, 
    Nodes.node.value('(x:AccountNumber)[1]', 'VARCHAR(50)') as accountNumber 
FROM 
    MyXmlData z 
    CROSS APPLY 
z.XmlColumn.nodes('/Reports/x:InquiryResponse/x:ReportData/x:AccountDetails/x:Account') 
     AS Nodes(node); 

Updated Fiddle

编辑Xml File off Disk

这是从磁盘读取的xml文件的相同的东西。请注意,一旦将XML变量(@MyXmlData)中的数据转换为无需CROSS APPLY的任何东西 - 只需提供xpath以选择适当的节点,然后删除元素和属性即可。

DECLARE @MyXmlData XML; 
SET @MyXmlData = 
(SELECT * FROM OPENROWSET (BULK N'c:\temp\file3098.xml', SINGLE_CLOB) AS MyXmlData); 
-- Assuming all on the one element, no need for all the applies 
-- attributes don't have a text axis (they are automatically strings 

WITH XMLNAMESPACES('http://foo' AS x) 
select 
    Nodes.node.value('(@seq)[1]', 'varchar(50)') AS c_val2, 
    Nodes.node.value('(@id)[1]', 'varchar(50)') AS c_val3, 
    Nodes.node.value('(@ReportedDate)[1]', 'DATETIME') as someDateTime, 
    Nodes.node.value('(x:AccountNumber)[1]', 'VARCHAR(50)') as accountNumber 
FROM 
     @MyXmlData.nodes('/Reports/x:InquiryResponse/x:ReportData/x:AccountDetails/x:Account') 
     AS Nodes(node); 
+0

我想采取属性和元素,所以建议使用外部应用示例, – senthil

+0

您需要提供一个像样的输入Xml样本 - 我们不是通灵:)。交叉应用通常只需要处理表中的xml列,而您的帖子引用'@ xmlData',我认为这是'XML'变量。 – StuartLC

+0

TSTC1595 0 Muthoot Fincorp限定 0 12000 JOG Group senthil