我在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
他们之间有什么不同
答案 0 :(得分:3)
非常简单:一个很好,另一个很糟糕
FROM OPENXML
与相应的SP准备和删除文档已经过时,不应再使用(很少有例外)。而是使用适当的methods the XML data type provides。
SQL-Server不会将XML存储为您看到的字符串,而是存储为层次结构树结构。您看到的XML是在您阅读时为您构建的。所有修改,使用XPath
和XQuery
进行的所有搜索/过滤都是针对表格式树完成的。这是非常快的,因为没有必要进行字符串解析(当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
并且可以处理这个更高效的,但我对此表示怀疑......