我试图从SQL Server中的表中解析XML文件(复数)中的特定字段。我已经使用以属性为中心的XQuery编写了一个存储过程来执行此操作,但效率很差(31行为3小时)。经过一些研究后,我发现以元素为中心的XQuery可能更有效,但到目前为止我发现的唯一例子是将XML文件设置为标量变量。换句话说,一个文件被复制粘贴到查询中,然后从T(C).nodes / node1 / etc中选择字段。我不能使用这种方法,因为我查询〜200万条记录,每条记录都有自己的自己的XML文件和格式/布局不一定相同。该表还包含常见的SQL数据类型(varchar,int等..)
这是一个XML示例(每个ID的每个文件都作为文件快捷方式存储在一个表中。单击快捷方式打开SQL Server中的XML文件,如下所示):
'<Node1>
<Node2>
<Node3>
<ID>555555555</ID>
</Node3>
</Node2>
<Node2a>
<Name="John">
</Node2a>
</Node1>'
比如说,我想获得SUBMISSION_ID(varchar存储在同一个表中,但不存储在XML文件中),名称和ID,以及具有一些额外条件的人口中的所有人。正如我所说,我使用以下以属性为中心的方法完成了这项工作:
SELECT
SUBSTRING(SUBMISSION_ID, 1, 20) as SUBMISSION_ID,
SUBSTRING(XML_DATA.value('(//Node1/Node2/Node3/ID)[1]','varchar(20)'),1,9) as ID,
SUBSTRING(XML_DATA.value('(//Node1/Node2a/Name)[1]','varchar(30)'),1,20) as Name
FROM dbname.dbo.EXAMPLE_TABLE
WHERE Name LIKE 'JOHN%'
注意:我使用子字符串是因为我将数据导出到制表符分隔的文本文件中,所以我想要固定长度的列。
所以我的目标是更有效地编写这个查询,也许使用以元素为中心的XQuery,但我不确定如何将XML格式数据设置为数组并解析该数组中的字段。我想也许我可以使用光标,但RBAR不一定是世界上最有效的东西。
这是我的第二次(并且不成功)尝试的示例 - 使用游标和以元素为中心的XQuery:
DECLARE @Open_XML XML
SET @Open_XML =
'<Node1>
<Node2>
<Node3>
<ID>555555555</ID>
</Node3>
</Node2>
<Node2a>
<Name="John">
</Node2a>
</Node1>'
;
DECLARE XQ_Cur CURSOR STATIC FORWARD_ONLY READ_ONLY FOR
SELECT
tbl.SUBMISSION_ID,
dbname.dbo.EXAMPLE_TABLE.VALUE('ID[1]','varchar(20)') as ID,
dbname.dbo.EXAMPLE_TABLE.VALUE('Name[1]','varchar(20)') as Name,
FROM dbname.dbo.EXAMPLE_TABLE tbl,
@Open_XML.NODES('/Node1/Node2/Node3') dbname.dbo.EXAMPLE_TABLE(XML_DATA),
@Open_XML.NODES('/Node1/Node2a') dbname.dbo.EXAMPLE_TABLE(XML_DATA)
OPEN XQ_Cur;
FETCH NEXT FROM XQ_Cur
WHILE 0 = @@FETCH_STATUS
BEGIN
FETCH NEXT FROM XQ_Cur;
END
CLOSE XQ_Cur;
DEALLOCATE XQ_Cur;