问题描述
我一直在测试 OpenXML 和 XQuery,而 OpenXML 在执行 XQuery 方面表现出色(我相信这应该与我阅读的内容相反)
我更喜欢使用 XQuery,所以我正在寻求帮助。有什么方法可以改进 Xquery?
我在一个表中有大约 10,000 个这样的 XML(并且比这个例子大得多)
<Root>
<Data Code="123" Ref="1">
<Node>
<Details Date="2021-06-28" Code="ABC" />
<Types>
<Type Type="3" Count="29" />
<Type Type="5" Count="0" />
<TypeDetails Date2="2021-06-30" />
</Type>
</Types>
<Invoice Number="1234" Version="1" />
</Node>
</Data>
</Root>
OpenXML 查询:
DECLARE name_cursor CURSOR
FOR
SELECT XML
FROM [dbo].[table]
OPEN name_cursor
DECLARE @xmlVal XML
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC sp_xml_preparedocument @idoc OUTPUT,@xmlVal
INSERT INTO finaltable
SELECT Code,Ref,Date,Code,Number,Version,Type,Count,Date2
FROM OPENXML(@iDoc,'Root/Data/Node/Types/Type')
WITH
(
Code [varchar](50) '../../../@Code',Ref [varchar](50) '../../../@Ref',Date [varchar](50) '../../Details/@Date',Code [varchar](50) '../../Details/@Code',Number [varchar](50) '../../Invoice/@Number',Version [varchar](50) '../../Invoice/@Version',Type [varchar](50) '@Type',Count [varchar](50) '@Count',Date2 [varchar](50) 'TypeDetails/@Date2'
)
EXEC sp_xml_removedocument @idoc
FETCH NEXT FROM name_cursor INTO @xmlVal
END
CLOSE name_cursor
DEALLOCATE name_cursor
XQuery(我也为每个节点尝试了不同版本的 CROSS APPLY):
INSERT INTO finaltable
select
c.value('(../../../@Code)[1]','nvarchar(50)') as Code,c.value('(../../../@Ref)[1]','nvarchar(50)') as Ref,c.value('(../../Details/@Date)[1]','nvarchar(50)') as Date,c.value('(../../Details/@Code)[1]',c.value('@Type','nvarchar(50)') as Type,c.value('@Count','nvarchar(50)') as Count,c.value('(TypeDetails/@Date2)[1]','nvarchar(50)') as Date2,c.value('(../../Invoice/@Number)[1]','nvarchar(50)') as Number,c.value('(../../Invoice/@Version)[1]','nvarchar(50)') as Version
from [dbo].[table]
CROSS APPLY XML.nodes('Root/Data/Node/Types/Type') as t(c)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)