使用sp_xml_preparedocument和直接从xml参数中选择有什么不同

时间:2017-06-08 07:25:47

标签: sql-server xml

我在MSSQL 2012中有一个存储过程。

sp获取xml数据类型并将数据插入表

我发现我可以使用两个选项。

选项1

DECLARE @strXML AS xml  
SET @strXML = '<DocumentElement><LocationData><SL_ID>2</SL_ID>
<IsDefault>1</IsDefault></LocationData><LocationData><SL_ID>3</SL_ID>
<IsDefault>0</IsDefault></LocationData></DocumentElement>'



SELECT 
    'SL_ID' = x.v.value('SL_ID[1]','int'),
    'IsDefault' = x.v.value('IsDefault[1]','int')
 FROM @strXML.nodes('DocumentElement/LocationData') x(v)

选项2

DECLARE @strXML AS xml  
SET @strXML = '<DocumentElement><LocationData><SL_ID>2</SL_ID>
<IsDefault>1</IsDefault></LocationData><LocationData><SL_ID>3</SL_ID>
<IsDefault>0</IsDefault></LocationData></DocumentElement>'



DECLARE @hDoc int


EXEC sp_xml_preparedocument @hDoc OUTPUT, @strXML

SELECT SL_ID,IsDefault
FROM OPENXML(@hDoc, 'DocumentElement/LocationData')
WITH 
(
   SL_ID int 'SL_ID',
   IsDefault int 'IsDefault'
)

EXEC sp_xml_removedocument @hDoc

他们之间有什么不同

1 个答案:

答案 0 :(得分:3)

有什么区别?

非常简单:一个很好,另一个很糟糕

FROM OPENXML与相应的SP准备和删除文档已经过时,不应再使用(很少有例外)。而是使用适当的methods the XML data type provides

SQL-Server不会将XML存储为您看到的字符串,而是存储为层次结构树结构。您看到的XML是在您阅读时为您构建的。所有修改,使用XPathXQuery进行的所有搜索/过滤都是针对表格式树完成的。这是非常快的,因为没有必要进行字符串解析(当XML被推入原生XML类型时,只执行一次)。

使用FROM OPENXML的老式方法会一遍又一遍地执行这个昂贵的过程......

非常重要:现代方法完全 ad-hoc inlined ),而旧方法需要在程序上工作(不能可在VIEW内或内嵌TVF中使用

一些背景:

阅读此链接有关sp_xml_preparedocument

的信息
  

[xmltext]是原始XML文档。 MSXML解析器解析它   XML文档。 xmltext是一个文本参数:char,nchar,varchar,   nvarchar,text,ntext或xml。

传入的参数作为字符串处理。如果您传入真实XML ,则需要重新构建内部XML树的字符串表示,以便再次执行昂贵的解析过程。可能是,这个过程足够智能,可以识别出参数已经是XML并且可以处理这个更高效的,但我对此表示怀疑......