我试图使用下面的代码将XML压缩成SQL表。输入数据表(@incomingTable)包含10k个未键入的XML,查询需要7秒才能返回输出。当我检查执行计划时,发现大部分时间花费在"表Vaued函数(带有XPATH过滤器的XML阅读器)"步。我的猜测是这一步是指查询中的Value方法。
value()方法隐式使用Transact-SQL CONVERT运算符,并尝试将XQuery表达式的结果转换为Transact-SQL转换指定的相应SQL类型。
问题:是否有其他XML方法可以在没有数据类型转换的情况下检索元素/属性值。因为无论如何我想把数据作为字符串。帮助我比较两种方法的结果。
还有其他方法可以优化此查询吗?
select
sqlXml.value('@ID', 'varchar(50)') as XMLFieldName,
sqlXml.value('@TS', 'varchar(50)') as XMLTSValue,
sqlXml.value('.','varchar(800)') as XMLFieldValue
from @incomingTable
cross apply playfieldvalues.nodes('/PlayAttributes/PlayFields/PlayField') as
XMLData(sqlXml)
答案 0 :(得分:0)
尝试使用OPENXML:
DECLARE @idoc int;
EXEC sp_xml_preparedocument @idoc OUTPUT, @incomingTable;
SELECT *
FROM OPENXML (@idoc, '/PlayAttributes/PlayFields/PlayField',1)
WITH (XMLFieldName varchar(50) '@ID',
XMLTSValue varchar(50) '@TS',
XMLFieldValue varchar(800) '.');
EXEC sp_xml_removedocument @idoc;
OPENXML允许访问XML数据,就像它是关系记录集一样。它提供了XML文档的内存中表示的表格(行集)视图。从技术上讲,OPENXML是一个类似于表或视图的行集提供程序;因此,它可以在使用表或视图的任何地方使用。例如,您可以将OPENXML与SELECT或SELECT INTO语句一起使用,以处理保留在内存中的XML文档。