SQL Server:读取XML数据

时间:2015-10-30 01:23:44

标签: sql-server xml sql-server-2008 sql-server-2012

我从网站www.SQLauthority.com获取此查询:

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
<Colors>
<Color1>White</Color1>
<Color2>Blue</Color2>
<Color3>Black</Color3>
<Color4 Special="Light">Green</Color4>
<Color5>Red</Color5>
</Colors>
<Fruits>
<Fruits1>Apple</Fruits1>
<Fruits2>Pineapple</Fruits2>
<Fruits3>Grapes</Fruits3>
<Fruits4>Melon</Fruits4>
</Fruits>
</SampleXML>'

SELECT
    a.b.value('Colors[1]/Color1[1]','varchar(10)') AS Color1,
    a.b.value('Colors[1]/Color2[1]','varchar(10)') AS Color2,
    a.b.value('Colors[1]/Color3[1]','varchar(10)') AS Color3,
    a.b.value('Colors[1]/Color4[1]/@Special','varchar(10)')+' '+
    +a.b.value('Colors[1]/Color4[1]','varchar(10)') AS Color4,
    a.b.value('Colors[1]/Color5[1]','varchar(10)') AS Color5,
    a.b.value('Fruits[1]/Fruits1[1]','varchar(10)') AS Fruits1,
    a.b.value('Fruits[1]/Fruits2[1]','varchar(10)') AS Fruits2,
    a.b.value('Fruits[1]/Fruits3[1]','varchar(10)') AS Fruits3,
    a.b.value('Fruits[1]/Fruits4[1]','varchar(10)') AS Fruits4
FROM @MyXML.nodes('SampleXML') a(b) 

我无法更好地了解节点从xml数据中获取的方式。

我对此几乎没有疑问。

  1. 这里的a(b)是什么?

  2. 如果我在颜色中有另一个节点并且附加了所有现有的子节点,结构将如何改变?

  3. 即:

     <Colorss>
       <Colors>
          <Color1>White</Color1>
          <Color2>Blue</Color2>
          <Color3>Black</Color3>
          <Color4 Special="Light">Green</Color4>
          <Color5>Red</Color5>
       </Colors>
    <Colorss>
    <Fruits>
         <Fruits1>Apple</Fruits1>
         <Fruits2>Pineapple</Fruits2>
         <Fruits3>Grapes</Fruits3>
         <Fruits4>Melon</Fruits4>
    </Fruits>
    
    1. a.b.value是什么意思?当我鼠标悬停它时显示一个派生表。我可以查看表格的值吗?
    2. 我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

  

这是什么(b)?

.nodes('SampleXML')的调用是一个XQuery函数,它返回一个伪表,该表包含此XPath表达式匹配的每个元素的一个XML片段列 - a(b)是表别名(a)表示该列,b是包含XML片段的伪表中列的名称。

  

a.b.value是什么意思?

这是基于上述内容 - a表别名,用于该临时内联伪表,b列名称对于该表中的列,.value()是另一个XQuery函数,它将根据XPath表达式(第一个参数)从XML中提取单个值,并将它作为第二个参数中指定的数据类型返回。 / p>

您应该查看SQL Server中对XQuery支持的介绍,以便更好地理解:

并且还有许多关于XQuery的其他介绍和教程 - 只需使用您最喜爱的搜索引擎进行搜索,您就会获得大量的点击量!

答案 1 :(得分:1)

这是我的刺伤@ it:

  1. a-指向root; b指指根节点和子节点
  2.     DECLARE @MyXML XML
    SET @MyXML = '<SampleXML>
    <Colors>
    <Color1>White</Color1>
    <Color2>Blue</Color2>
    <Color3>Black</Color3>
    <Color4 Special="Light">Green</Color4>
    <Color5>Red
      <Color6>Black44</Color6>
      <Color7>Black445</Color7>
    </Color5>
    </Colors>
    <Fruits>
    <Fruits1>Apple</Fruits1>
    <Fruits2>Pineapple</Fruits2>
    <Fruits3>Grapes</Fruits3>
    <Fruits4>Melon</Fruits4>
    </Fruits>
    </SampleXML>'
    
    1. 得到一个内心的孩子

      选择 a.c.value('Colors 1 / Color1 1','varchar(10)')AS Color1, a.c.value('Colors 1 / Color2 1','varchar(10)')AS Color2, a.c.value('Colors 1 / Color3 1','varchar(10)')AS Color3, a.c.value('Colors 1 / Color4 1 / @ Special','varchar(10)')AS Color4, a.c.value('Colors 1 / Color5 1','varchar(10)')AS Color5,  a.c.value('Colors 1 / Color5 1 / Color7 1','varchar(50)')AS Color6a,    acvalue('Colors 1 / Color5 1 / Color6 1','varchar(50)')AS Color6b,acvalue('Fruits 1 / Fruits1 {{ 3}}','varchar(10)')AS Fruits1, a.c.value('Fruits 1 / Fruits2 1','varchar(10)')AS Fruits2, a.c.value('Fruits 1 / Fruits3 1','varchar(10)')AS Fruits3, a.c.value('Fruits 1 / Fruits4 1','varchar(10)')AS Fruits4  FROM @ MyXML.nodes('SampleXML')a(c)

    2. 使用查询表达式/ root / Color(n)的nodes()方法调用将返回一个包含三行的行集,每行包含原始XML文档的逻辑副本,并且上下文项设置为一的节点 1