SQL Server将XML分解到临时表
我有以下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"
<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%。有趣的