0

我有一个带有 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 代码部分以使其更快?

4

2 回答 2

3

您可以尝试更改获取节点值的方式。

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 中没有,因此结果将是相同的。

于 2013-07-09T14:10:44.407 回答
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
于 2013-07-09T14:03:09.377 回答