我尝试使用 XQuery 将 XML 分解到临时表中.nodes
如下。但是,我遇到了性能问题。粉碎需要花费很多时间。请给我一个关于替代方案的想法。
我的要求是将批量记录传递给存储过程并解析这些记录并根据记录值执行一些操作。
CREATE TABLE #DW_TEMP_TABLE_SAVE(
[USER_ID] [NVARCHAR](30),
[USER_NAME] [NVARCHAR](255)
)
insert into #DW_TEMP_TABLE_SAVE
select
A.B.value('(USER_ID)[1]', 'nvarchar(30)' ) [USER_ID],
A.B.value('(USER_NAME)[1]', 'nvarchar(30)' ) [USER_NAME]
from
@l_n_XMLDoc.nodes('//ROW') as A(B)
指定text()
值子句中的节点。
insert into #DW_TEMP_TABLE_SAVE
select A.B.value('(USER_ID/text())[1]', 'nvarchar(30)' ) [USER_ID],
A.B.value('(USER_NAME/text())[1]', 'nvarchar(30)' ) [USER_NAME]
from @l_n_XMLDoc.nodes('/USER_DETAILS/RECORDSET/ROW') as A(B)
不使用text()
将创建一个查询计划,尝试将指定节点的值与其所有子节点连接起来,我想在这种情况下您不希望这样做。如果不使用查询的串联部分text()
由 UDX 运营商完成,最好不要将其纳入您的计划中。
![enter image description here](https://i.stack.imgur.com/LKQ45.png)
另一件要尝试的事情是OPENXML。在某些场景(大型 xml 文档)中,我发现 OPENXML 执行速度更快。
declare @idoc int
exec sp_xml_preparedocument @idoc out, @l_n_XMLDoc
insert into #DW_TEMP_TABLE_SAVE
select USER_ID, USER_NAME
from openxml(@idoc, '/USER_DETAILS/RECORDSET/ROW', 2)
with (USER_ID nvarchar(30), USER_NAME nvarchar(30))
exec sp_xml_removedocument @idoc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)