我有这个 xml:
DECLARE @x XML
SET @x =
'<data>
<add>a</add>
<add>b</add>
<add>c</add>
</data>';
任务:
我想列出a,b,c
。
方法一:
SELECT s.value('.', 'VARCHAR(8000)') AS [ADD]
FROM @x.nodes('/data/add') AS t(s)
方法二:
DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @x
SELECT *
FROM OPENXML(@idoc, '/data/add', 2)
WITH ([add] NVARCHAR(MAX) '.')
他们都给我:
问题:
哪个是首选方式?
后者与前者(反之亦然)有什么优势吗?
最佳答案
一个简单的测试表明您的方法 1 比方法 2 花费的时间更少。我不会得出任何关于它总是如此的结论。这可能取决于您的 XML 的结构方式以及您需要如何查询 XML。
要测试的存储过程:
create procedure TestXML
@X xml
as
set nocount on
select X.N.value('.', 'varchar(8000)')
from @X.nodes('/root/item') as X(N)
go
create procedure TestOpenXML
@X xml
as
set nocount on
declare @idoc int
exec sp_xml_preparedocument @idoc out, @X
select value
from openxml(@idoc, '/root/item',1)
with (value varchar(8000) '.')
exec sp_xml_removedocument @idoc
测试:
declare @X xml
set @X =
(
select number as '*'
from master..spt_values
for xml path('item'), root('root'), type
)
set statistics time on
exec TestXML @X
exec TestOpenXML @X
结果方法一:
SQL Server Execution Times:
CPU time = 63 ms, elapsed time = 70 ms.
结果方法 2:
SQL Server Execution Times:
CPU time = 156 ms, elapsed time = 159 ms.
(在 SQL Server 2005 上测试。)
关于SQL Server : OPENXML vs SELECT. .FROM 在处理 XML 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9614415/