我在 MSSQL 2012 中有一个存储过程。
sp 获取 xml 数据类型并将数据插入表中
我发现我可以使用两个选项。
option 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)
option 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
它们之间有什么不同
有什么不同?
很简单:一个是好的,另一个是坏的????
FROM OPENXML
使用相应的 SP 来准备和删除已过时的文档,不应再使用(存在极少数例外)。而是使用适当的XML 数据类型提供的方法 https://msdn.microsoft.com/en-us/library/ms190798.aspx.
SQL-Server 不会将 XML 存储为您看到的字符串,而是存储为层次结构树结构。您看到的 XML 是在您阅读时为您构建的。所有修改,所有搜索/过滤XPath
and XQuery
是针对一个类似桌子的树。这速度快得惊人,因为不需要进行字符串解析(这只在 XML 被推送到原生 XML 类型).
老式的方法FROM OPENXML
将一遍又一遍地进行这个昂贵的过程......
And 很重要: 现代方法完全ad-hoc (inlined),而旧方法需要按程序工作(不能在VIEW
或在一个内联TVF)
一些背景:
阅读此链接了解sp_xml_preparedocument https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-xml-preparedocument-transact-sql:
[ xmltext ] 是原始 XML 文档。 MSXML 解析器解析此
XML 文档。 xmltext 是文本参数:char、nchar、varchar、
nvarchar、text、ntext 或 xml。
您传入的参数将作为字符串处理。如果你传入一个real XML它需要重建一个字符串表示内部 XML 树的一部分只是为了再次执行昂贵的解析过程。可能是,该过程足够聪明,可以识别该参数是一个XML
已经可以处理这个更高的性能,但我对此表示怀疑......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)