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

标签 sql sql-server xml sql-server-2005 tsql

我有这个 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) '.')

他们都给我:

enter image description here

问题:

哪个是首选方式?

后者与前者(反之亦然)有什么优势吗?

最佳答案

一个简单的测试表明您的方法 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/

相关文章:

sql - 仅在备份成功时删除数据库

java - 如何使用xpath检索属性名称中包含冒号的属性值

java - 将 CSV 映射到模型

sql-server - SQL Server Management Studio - 保存加密的连接字符串

sql-server - 统计每个组返回的记录数

java - Android Studio新 Activity

c# - 不能将 NULL 值插入列、表;列不允许空值。插入失败

python - pyodbc 中的清理查询仅返回字段名称

mysql - 更新列同表

sql-server - 无法加载动态库 'php_mssql.dll'