我有一个带有XML变量解析代码部分的SP。
XML有下一个结构:
<root>
<ID Reason="1">1</ID>
<ID Reason="2">2</ID>
<ID Reason="2">3</ID>
<ID Reason="1">5</ID>
</root>
SP代码部分:
INSERT INTO #tmp_table (ID,Reason)
SELECT IDs.ID.value('.', 'int')
, IDs.ID.value('@Reason', 'int')
FROM @I_XML.nodes('/root/ID') AS Ids(ID)
当我尝试使用具有100000行的XML输入参数运行SP时,需要花费大量时间并且执行成本为5%。
如何改进SP代码部分以加快速度?
答案 0 :(得分:2)
您可以尝试更改获取节点值的方式。
INSERT INTO #tmp_table (ID,Reason)
SELECT IDs.ID.value('text()[1]', 'int')
, IDs.ID.value('@Reason', 'int')
FROM @I_XML.nodes('/root/ID') AS Ids(ID)
通过指定text()
节点,您将获得稍微不同的执行计划而不更改结果。仅使用节点名称(在您的情况下为.
)将使SQL Server深入搜索指定节点下的所有节点值。在您的XML中没有,所以结果将是相同的。
答案 1 :(得分:0)
尝试使用OPENXML
:
declare @hXml int
exec sp_xml_preparedocument @hXml output, @YourXmlParam
insert into #tmp_table
select ID, Reason
from OPENXML(@hXml, '/root/ID') with (ID int '.', Reason int '@Reason')
exec sp_xml_removedocument @hXml