SQL Server将XML分解到临时表

SQL Server将XML分解到临时表,xml,sql-server-2008,Xml,Sql Server 2008,我有以下XML: <query> <param weight="0.3"> <item type="1" low="18" hi="20" pos="1" /> <item type="1" low="220" hi="220" pos="0" /> </param> <param weight="0.7"> <item type="2" low="5" hi="5" pos="1"

我有以下XML:

<query>
  <param weight="0.3">
    <item type="1" low="18" hi="20" pos="1" />
    <item type="1" low="220" hi="220" pos="0" />
  </param>
  <param weight="0.7">
    <item type="2" low="5" hi="5" pos="1" />
  </param>
</query>
行号将成为行号。我只得到第一行项目[1],但没有得到其他项目。如果删除“[1]”,则会出现单例错误。我该怎么写

这就是我到目前为止所做的:

SELECT  x.node.value('@weight', 'float') As [Weight],
        x.node.value('(item/@type)[1]', 'int') AS [Type],
        x.node.value('(item/@low)[1]', 'float') AS Low,
        x.node.value('(item/@hi)[1]', 'float') AS Hi,
        x.node.value('(item/@pos)[1]', 'bit') AS Pos
FROM    @Input.nodes('/query//*') AS x(node)

我用OPENXML解决了这个问题:

INSERT  INTO @ref
SELECT  *
FROM    OPENXML (@idoc, '/query/param/item', 2)
WITH    ([Weight]   float   '../@weight',
        ParamType   int     '@type',
        Low         float   '@low',
        Hi          float   '@hi',
        Pos         bit     '@pos')

我用OPENXML解决了这个问题:

INSERT  INTO @ref
SELECT  *
FROM    OPENXML (@idoc, '/query/param/item', 2)
WITH    ([Weight]   float   '../@weight',
        ParamType   int     '@type',
        Low         float   '@low',
        Hi          float   '@hi',
        Pos         bit     '@pos')

你的方法肯定比我的容易,但它挑战了我玩FLWOR:

DECLARE @XML XML= '<query> 
  <param weight="0.3"> 
    <item type="1" low="18" hi="20" pos="1" /> 
    <item type="1" low="220" hi="220" pos="0" /> 
  </param> 
  <param weight="0.7"> 
    <item type="2" low="5" hi="5" pos="1" /> 
  </param> 
</query> 
'


SELECT  x.node.query('.').value('(//weight)[1]', 'float') AS [Weight]
      , x.node.query('.').value('(//type)[1]', 'int') AS [Type]
      , x.node.query('.').value('(//low)[1]', 'float') AS Low
      , x.node.query('.').value('(//hi)[1]', 'float') AS Hi
      , x.node.query('.').value('(//pos)[1]', 'bit') AS Pos
FROM    ( SELECT    @XML.query('for $param in /query/param
                    return 
                        for $item in $param/item
                        return 
                            <item>
                                <weight> {data($param/@weight)} </weight>
                                <type> {data($item/@type) } </type>
                                <low> {data($item/@low) } </low>
                                <hi>  {data($item/@hi) } </hi>
                                <pos> {data($item/@pos) } </pos>
                            </item>
                        ') AS result
        ) q
        CROSS APPLY result.nodes('./item') AS x ( node )

你的方法肯定比我的容易,但它挑战了我玩FLWOR:

DECLARE @XML XML= '<query> 
  <param weight="0.3"> 
    <item type="1" low="18" hi="20" pos="1" /> 
    <item type="1" low="220" hi="220" pos="0" /> 
  </param> 
  <param weight="0.7"> 
    <item type="2" low="5" hi="5" pos="1" /> 
  </param> 
</query> 
'


SELECT  x.node.query('.').value('(//weight)[1]', 'float') AS [Weight]
      , x.node.query('.').value('(//type)[1]', 'int') AS [Type]
      , x.node.query('.').value('(//low)[1]', 'float') AS Low
      , x.node.query('.').value('(//hi)[1]', 'float') AS Hi
      , x.node.query('.').value('(//pos)[1]', 'bit') AS Pos
FROM    ( SELECT    @XML.query('for $param in /query/param
                    return 
                        for $item in $param/item
                        return 
                            <item>
                                <weight> {data($param/@weight)} </weight>
                                <type> {data($item/@type) } </type>
                                <low> {data($item/@low) } </low>
                                <hi>  {data($item/@hi) } </hi>
                                <pos> {data($item/@pos) } </pos>
                            </item>
                        ') AS result
        ) q
        CROSS APPLY result.nodes('./item') AS x ( node )

下面的查询应该可以工作

SELECT  x.node.value('../@weight', 'float') As [Weight], 
        x.node.value('(@type)[1]', 'int') AS [Type], 
        x.node.value('(@low)[1]', 'float') AS Low, 
        x.node.value('(@hi)[1]', 'float') AS Hi, 
        x.node.value('(@pos)[1]', 'bit') AS Pos 
FROM    @Input.nodes('/query/param/item') AS x(node) 

下面的查询应该可以工作

SELECT  x.node.value('../@weight', 'float') As [Weight], 
        x.node.value('(@type)[1]', 'int') AS [Type], 
        x.node.value('(@low)[1]', 'float') AS Low, 
        x.node.value('(@hi)[1]', 'float') AS Hi, 
        x.node.value('(@pos)[1]', 'bit') AS Pos 
FROM    @Input.nodes('/query/param/item') AS x(node) 

不管是谁否决了这个问题,都愿意分享原因吗?不说原因就直接否决是毫无意义的。只是删除了xpath标记-这是99%的SQL问题,我没有看到任何xpath问题被讨论。@Dimitre-我被你的评论搞糊涂了。。。通过更好地理解XPath,我解决了这个问题。这正是问题所在。或者我在这里遗漏了什么?谁投了否决票,谁愿意分享原因?不说原因就投否决票是没有意义的。只是删除了xpath标记-这是99%的SQL问题,我没有看到任何xpath问题被讨论。@Dimitre-我被你的评论搞糊涂了。。。通过更好地理解XPath,我解决了这个问题。这正是问题所在。还是我遗漏了什么?+1很有效,谢谢。我发现是等级制度在起作用。就速度而言,这比OPENXML花费的时间长34%。很有意思,谢谢。我发现是等级制度在起作用。就速度而言,这比OPENXML花费的时间长34%。有趣的