SQL 服务器 XML 多个节点名称相同的文件
SQL Server XML file with multiple nodes named the same
我有这个内部 XML,我正在将其传递给 SQL 服务器存储过程。
如您所见,它包含多个 root
个节点,但另外,它还可以包含 1 到 'n
' 个 LotResults
个子节点。
有没有一种方法可以在存储过程中对其进行操作,以便我可以为每个 root
节点检索所有 LotResults
/Result
节点?
到目前为止我已经声明了可以处理顶级节点的cursor
:
DECLARE cur CURSOR FOR
SELECT tab.col.value('ID[1]','NCHAR(10)') as INT_TransactionID,
tab.col.value('ResultDateTime[1]','INT') as DAT_ResultDateTime,
tab.col.value('StandardComment[1]/ID[1]','BIT') as INT_StandardCommentID,
tab.col.value('ReviewComment[1]/ID[1]','BIT') as INT_ReviewCommentID
FROM @XML_Results.nodes('/roots/root') AS tab(col)
OPEN cur
-- loop over nodes within xml document and populate declared variables
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
-- use my values here
END
-- fetch next record
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
END
CLOSE cur;
注意:我发现了一个描述 how to extract nodes with the same name 的 post,我觉得它可以用来实现我在这里想要做的事情,但我需要一些关于如何实现的指导适用于我的场景。
没有光标!游标是由魔鬼创造的,目的是引导可怜的小数据库人远离基于集合的思维之光,深入到程序方法的黑暗领域...
请(对于以后的问题):不要粘贴图片!必须输入我的示例...
顺便说一句:您在这里使用我的价值观 很难提出正确的建议。根据你在那里做什么,实际上可能需要一个游标。但在这种情况下,您应该像我向您展示的那样从查询创建游标...
这样试试:
DECLARE @xml XML=
'<roots>
<root>
<ID>5</ID>
<LotResults>
<ID>13</ID>
<Result>
<ID>5</ID>
<Count>2</Count>
</Result>
</LotResults>
<LotResults>
<ID>13</ID>
<Result>
<ID>5</ID>
<Count>2</Count>
</Result>
</LotResults>
<StandardComment>
<ID>0</ID>
</StandardComment>
<ReviewComment>
<ID>0</ID>
</ReviewComment>
</root>
<root>
<ID>44</ID>
<LotResults>
<ID>444</ID>
<Result>
<ID>4444</ID>
<Count>2</Count>
</Result>
</LotResults>
<LotResults>
<ID>555</ID>
<Result>
<ID>55</ID>
<Count>2</Count>
</Result>
</LotResults>
<StandardComment>
<ID>5</ID>
</StandardComment>
<ReviewComment>
<ID>5</ID>
</ReviewComment>
</root>
</roots>';
--这是查询
SELECT r.value('ID[1]','int') AS root_ID
,lr.value('ID[1]','int') AS LotResult_ID
,lr.value('(Result/ID)[1]','int') AS LotResult_Result_ID
,lr.value('(Result/Count)[1]','int') AS LotResult_Result_Count
,r.value('(StandardComment/ID)[1]','int') AS StandardComment_ID
,r.value('(ReviewComment/ID)[1]','int') AS ReviewComment_ID
FROM @xml.nodes('/roots/root') AS A(r)
CROSS APPLY r.nodes('LotResults') AS B(lr)
我有这个内部 XML,我正在将其传递给 SQL 服务器存储过程。
如您所见,它包含多个 root
个节点,但另外,它还可以包含 1 到 'n
' 个 LotResults
个子节点。
有没有一种方法可以在存储过程中对其进行操作,以便我可以为每个 root
节点检索所有 LotResults
/Result
节点?
到目前为止我已经声明了可以处理顶级节点的cursor
:
DECLARE cur CURSOR FOR
SELECT tab.col.value('ID[1]','NCHAR(10)') as INT_TransactionID,
tab.col.value('ResultDateTime[1]','INT') as DAT_ResultDateTime,
tab.col.value('StandardComment[1]/ID[1]','BIT') as INT_StandardCommentID,
tab.col.value('ReviewComment[1]/ID[1]','BIT') as INT_ReviewCommentID
FROM @XML_Results.nodes('/roots/root') AS tab(col)
OPEN cur
-- loop over nodes within xml document and populate declared variables
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
-- use my values here
END
-- fetch next record
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
END
CLOSE cur;
注意:我发现了一个描述 how to extract nodes with the same name 的 post,我觉得它可以用来实现我在这里想要做的事情,但我需要一些关于如何实现的指导适用于我的场景。
没有光标!游标是由魔鬼创造的,目的是引导可怜的小数据库人远离基于集合的思维之光,深入到程序方法的黑暗领域...
请(对于以后的问题):不要粘贴图片!必须输入我的示例...
顺便说一句:您在这里使用我的价值观 很难提出正确的建议。根据你在那里做什么,实际上可能需要一个游标。但在这种情况下,您应该像我向您展示的那样从查询创建游标...
这样试试:
DECLARE @xml XML=
'<roots>
<root>
<ID>5</ID>
<LotResults>
<ID>13</ID>
<Result>
<ID>5</ID>
<Count>2</Count>
</Result>
</LotResults>
<LotResults>
<ID>13</ID>
<Result>
<ID>5</ID>
<Count>2</Count>
</Result>
</LotResults>
<StandardComment>
<ID>0</ID>
</StandardComment>
<ReviewComment>
<ID>0</ID>
</ReviewComment>
</root>
<root>
<ID>44</ID>
<LotResults>
<ID>444</ID>
<Result>
<ID>4444</ID>
<Count>2</Count>
</Result>
</LotResults>
<LotResults>
<ID>555</ID>
<Result>
<ID>55</ID>
<Count>2</Count>
</Result>
</LotResults>
<StandardComment>
<ID>5</ID>
</StandardComment>
<ReviewComment>
<ID>5</ID>
</ReviewComment>
</root>
</roots>';
--这是查询
SELECT r.value('ID[1]','int') AS root_ID
,lr.value('ID[1]','int') AS LotResult_ID
,lr.value('(Result/ID)[1]','int') AS LotResult_Result_ID
,lr.value('(Result/Count)[1]','int') AS LotResult_Result_Count
,r.value('(StandardComment/ID)[1]','int') AS StandardComment_ID
,r.value('(ReviewComment/ID)[1]','int') AS ReviewComment_ID
FROM @xml.nodes('/roots/root') AS A(r)
CROSS APPLY r.nodes('LotResults') AS B(lr)