如何将.nodes()应用于列的单元而不是XML变量?

时间:2014-05-30 15:02:02

标签: sql sql-server xml nodes cross-apply

有没有办法将.node()方法应用于特定列而不是XML变量?我正致力于将XML文件传输到SQL表中。我的一些XML文件有子节点。所以我使用Cross Apply功能将孩子与父母联系起来。

例如,我的表中的一个列存储了一个子xml文件。 一个单元格包含以下XML :(注意我已经取出了xml并已将其存储在@input变量中)。

DECLARE @input XML 
SET @INPUT = N'
    <ParentElement ID="1">
      <Title>parent1</Title>
      <Description />
      <ChildElement ID="6">
        <Title>Child 4</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
      <ChildElement ID="0">
        <Title>Child1</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
      <ChildElement ID="8">
        <Title>Child6</Title>
        <Description />
        <StartDate>2010-01-25T00:00:00</StartDate>
        <EndDate>2010-01-25T00:00:00</EndDate>
      </ChildElement>
    </ParentElement>'

这就是我Cross Apply的样子:

SELECT
    Parent.Elm.value('(@ID)[1]', 'int') AS 'ID',
    Parent.Elm.value('(Title)[1]', 'varchar(100)') AS 'Title',
    Parent.Elm.value('(Description)[1]', 'varchar(100)') AS 'Description',
    Child.Elm.value('(@ID)[1]', 'int') AS 'ChildID',
    Child.Elm.value('(Title)[1]', 'varchar(100)') AS 'ChildTitle',
    Child.Elm.value('(StartDate)[1]', 'DATETIME') AS 'StartDate',
    Child.Elm.value('(EndDate)[1]', 'DATETIME') AS 'EndDate'
FROM
    @input.nodes('/ParentElement') AS Parent(Elm)
CROSS APPLY
    Parent.Elm.nodes('ChildElement') AS Child(Elm)

目前,我不得不从XML单元格中提取child-xml节点数据并将其存储在变量(@input)中,以便我可以应用.nodes()方法它。我希望能够简单地在该列中的每个特定单元格上调用nodes方法。有没有办法做到这一点?

感谢您的帮助!

感谢来自此a link帖子的Beta033和marc_s关于如何让十字架申请工作!

1 个答案:

答案 0 :(得分:0)

select 
    parent.value('(@ID)[1]', 'int') AS 'ID',
    parent.value('(Title)[1]', 'varchar(100)') AS 'Title',
    parent.value('(Description)[1]', 'varchar(100)') AS 'Description',
    child.value('(@ID)[1]', 'int') AS 'ChildID',
    child.value('(Title)[1]', 'varchar(100)') AS 'ChildTitle',
    child.value('(StartDate)[1]', 'DATETIME') AS 'StartDate',
    child.value('(EndDate)[1]', 'DATETIME') AS 'EndDate'    
 from 
      yourtable
           cross apply
      xmldata.nodes('/ParentElement') xp(parent)
           cross apply
      xp.parent.nodes('ChildElement') xc(child)

其中xmldata是包含yourtable

中的xml数据的字段