SQL Server:处理XML时OPENXML与SELECT..FROM?

Roy*_*mir 10 xml sql t-sql sql-server sql-server-2005

我有这个xml:

DECLARE @x XML
SET @x = 
    '<data>
       <add>a</add>
       <add>b</add>
       <add>c</add>
     </data>';
Run Code Online (Sandbox Code Playgroud)

任务:

我想列出一下 a,b,c.

方法1:

SELECT s.value('.', 'VARCHAR(8000)') AS [ADD]
FROM   @x.nodes('/data/add') AS t(s) 
Run Code Online (Sandbox Code Playgroud)

方法2:

DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @x

SELECT *
FROM   OPENXML(@idoc, '/data/add', 2)
       WITH ([add] NVARCHAR(MAX) '.')
Run Code Online (Sandbox Code Playgroud)

他们俩都给我:

在此输入图像描述

题 :

哪个是首选方式?

后者与前者(或反之)有什么好处吗?

Mik*_*son 9

一个简单的测试表明,您的方法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
Run Code Online (Sandbox Code Playgroud)

测试:

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
Run Code Online (Sandbox Code Playgroud)

结果方法1:

SQL Server Execution Times:
   CPU time = 63 ms,  elapsed time = 70 ms.
Run Code Online (Sandbox Code Playgroud)

结果方法2:

SQL Server Execution Times:
   CPU time = 156 ms,  elapsed time = 159 ms.
Run Code Online (Sandbox Code Playgroud)

(在SQL Server 2005上测试过.)