Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用节点、值方法和交叉应用在SQL中扁平化XML的性能问题_Sql_Sql Server_Xml_Xsd_Xquery Sql - Fatal编程技术网

使用节点、值方法和交叉应用在SQL中扁平化XML的性能问题

使用节点、值方法和交叉应用在SQL中扁平化XML的性能问题,sql,sql-server,xml,xsd,xquery-sql,Sql,Sql Server,Xml,Xsd,Xquery Sql,我试图使用下面的代码将XML扁平化为SQL表。输入数据表(@incomingTable)包含10k个未键入的XML。查询需要7秒才能返回输出。当我检查执行计划时,发现大部分时间都花在“表变量函数(带XPATH过滤器的XML读取器)”步骤上。我猜这一步是指查询中的Value方法 value()方法隐式使用Transact-SQL CONVERT运算符,并尝试将XQuery表达式的结果转换为Transact-SQL CONVERT指定的相应SQL类型 问题:是否有其他XML方法可以在不转换数据类型的

我试图使用下面的代码将XML扁平化为SQL表。输入数据表(@incomingTable)包含10k个未键入的XML。查询需要7秒才能返回输出。当我检查执行计划时,发现大部分时间都花在“表变量函数(带XPATH过滤器的XML读取器)”步骤上。我猜这一步是指查询中的Value方法

value()方法隐式使用Transact-SQL CONVERT运算符,并尝试将XQuery表达式的结果转换为Transact-SQL CONVERT指定的相应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)
尝试使用:

OPENXML允许像访问关系记录集一样访问XML数据。它提供了XML文档的内存表示形式的表格(行集)视图。从技术上讲,OPENXML是一个类似于表或视图的行集提供程序;因此,它可以在任何使用表或视图的地方使用。例如,您可以将OPENXML与SELECT或SELECT INTO语句一起使用,以处理保留在内存中的XML文档


您是否尝试过
OPENXML
?OPENXML以列形式返回输出,我希望数据以行形式返回。有可能吗?嗯。。。我看到您的查询-它返回3列。请详细说明。OPENXML也可以做同样的事情。如果您有巨大的XML,它将比
节点
工作得更快。我想我明白您的问题了。请参考我的答案。唯一微小的改进可能是使用
text()[1]
而不是
,但这不会更快。。。如何提供此
@incomingTable
?在大多数情况下,最昂贵的过程是将字符串XML转换为原生XML类型(这是一个层次结构表),我正在尝试这个示例。我会随时通知你的。谢谢。我收到错误消息:Msg 257,级别16,状态31,过程sp_xml_preparedocument,第1行[批处理开始行0]不允许从数据类型void type隐式转换为ntext。使用CONVERT函数运行此查询。“我的XML结构是10 17 7 A 2+2 1 FG'预期O/P,三列为Play.Shared.gameKey 56492 Football.Str_D 1/3/2015 12:00:00 AM Play.Quarter 1 Play.Shared.Time_of_Day 01:39:47它正在工作。我试图让它同时处理一堆xml,而不是一次处理一个xml。
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;