Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 server 在SQLServer中,有没有更理想的方法从XML列中检索多个值_Sql Server_Xml_Tsql_Xml Parsing_Azure Sql Database - Fatal编程技术网

Sql server 在SQLServer中,有没有更理想的方法从XML列中检索多个值

Sql server 在SQLServer中,有没有更理想的方法从XML列中检索多个值,sql-server,xml,tsql,xml-parsing,azure-sql-database,Sql Server,Xml,Tsql,Xml Parsing,Azure Sql Database,我们的数据库中有一个带有XML数据列的表 在该专栏中,有一大块xml数据,其中存储了大量应用程序值 在一个更经常调用的查询中,在同一个查询中从此Xml列检索多个值。e、 g SELECT v.OtherColumns --... ,v.[Data].value('(/Record//Inputs/Net)[1]', 'money') as 'Input Net' ,v.[Data].value('(/Record//Inputs/Vat)[1]', 'money') a

我们的数据库中有一个带有XML数据列的表

在该专栏中,有一大块xml数据,其中存储了大量应用程序值

在一个更经常调用的查询中,在同一个查询中从此Xml列检索多个值。e、 g

SELECT 
    v.OtherColumns --...
    ,v.[Data].value('(/Record//Inputs/Net)[1]', 'money') as 'Input Net'
    ,v.[Data].value('(/Record//Inputs/Vat)[1]', 'money') as 'Input Vat'
    ,v.[Data].value('(/Record//Inputs/Gross)[1]', 'money') as 'Input Gross'
    ,v.[Data].value('(/Record//Outputs/Net)[1]', 'money') as 'Output Net'
    ,v.[Data].value('(/Record//Outputs/Vat)[1]', 'money') as 'Output Vat'
    ,v.[Data].value('(/Record//Outputs/Gross)[1]', 'money') as 'Output Gross'
From 
    Validations as v
    --... remainder of query
在我看来,它必须从这个列中读取数据6次,然后对其进行6次解析。当我查看SQLAzure门户下的查询计划时,这是迄今为止对查询的最大影响

在完整查询中,有20个XPath查询针对同一列,每个查询占查询的4.7%


有没有更好的方法在子查询中检索整个列一次,然后对该列的内存内容运行XPath查询?

尝试使用XQuery语句FLWOR。它应该减少解析时间。
请参见

查询的其他部分是什么?您有[2]、[3]等的联合吗?查询的其他部分是与其他表的一些内部连接,但占查询的0%(因此影响可以忽略不计),并且被连接的表已被正确索引。20*4.7%的TVF占用了95%的查询时间,这并不是一种非常有效的方法——这是XML数据和XPath的本质。您可以向该列添加一个XML索引,它可能会显著加快速度。+1对于
创建主XML索引
over
数据
列和辅助XML索引
。。。for property
应该尝试XML索引,但没有任何区别。有没有更好的方法来做到这一点。查询是作为报表的一部分运行的,因此我考虑使用小时工单将整个结果表转储到汇总表中,然后在报表中查询该汇总表