我有一个非常大的XML文档,我正在将其加载到SQL中,然后尝试解析以添加到现有表的末尾。
到目前为止,我的代码是:'
INSERT INTO XMLAttempt1(XMLData, LoadedDateTime)
SELECT CONVERT(XML, Bulkcolumn) AS Bulkcolumn, getdate()
from openrowset(bulk 'filepath.xml', Single_clob) as x;
select * from XMLAttempt1
DECLARE @XML as XML, @hdoc int, @doc nvarchar(MAX);
SELECT @xml = XMLDATA FROM XMLAttempt1;
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XML;
Select *
FROM OPENXML (@hdoc, 'CxXMLResults/Query/Result', 1)
WITH (ID int '../@id',
@NodeId INT @NodeId',
ProjectID int '../../@ProjectId',
ScanId int '../../@ScanId');
XML 的格式为:
<Result NodeId="635920047" lots of other info>
<Path ResultId="63592" PathId="47" SimilarityId="-1924977021">
<PathNode>
<FileName></FileName>
<Line>292</Line>
<Column>82</Column>
<NodeId>1</NodeId>
<Name>SelectedValue</Name>
<Type></Type>
<Length>13</Length>
<Snippet>
<Line>
<Number>292</Number>
<Code> stuff;</Code>
</Line>
</Snippet>
</PathNode>
[next x numbers of PathNode]
</Path>
</Result>
<Result NodeId="635920048"
[etc until the next QueryId]
我已经看过这篇文章(计算SQL中XML的子标签数量(,但我无法让它工作,我认为这是因为我尝试使用它的地方 - 我没有正确语法。
DECLARE @XML as XML, @hdoc int, @doc nvarchar(MAX);
SELECT @xml = XMLDATA FROM XMLAttempt1;
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XML;
Select *
FROM OPENXML (@hdoc, 'CxXMLResults/Query/Result', 1)
WITH (ID int '../@id',
@XML.query('count(@NodeId') INT '@NodeId',
ProjectID int '../../@ProjectId',
ScanId int '../../@ScanId');
但它在@XML说语法不正确
当前结果:
ID NodeID ProjectID ScanId
427 635920047 20336 63592
427 635920048 20336 63592
427 635920049 20336 63592
427 635920050 20336 63592
427 635920051 20336 63592
427 635920052 20336 63592
我最终想要的是:
ID Count ofNodes ProjectID ScanId
427 6 20336 63592
任何帮助将不胜感激。
你没有显示足够的XML,所以这需要一些猜测...
但首先:FROM OPENXML
已经过时,不应再使用(存在极少数例外(。而是使用 XML 的本机方法。
如前所述,这是疯狂的猜测
SELECT @XML.value('(/CxXMLResults/Query/@id)[1]','nvarchar(max)') AS id
,@XML.value('count(/CxXMLResults/Query/Result/@NodeId)','int') AS CountOfNodes
,@XML.value('(/CxXMLResults/@ProjectId)[1]','nvarchar(max)') AS ProjectId
,@XML.value('(/CxXMLResults/@ScanId)[1]','nvarchar(max)') AS ScanId
一些提示:
- 向后导航(你用
../../
做的事情被称为非常慢,尽量避免它。 - 我假设不涉及命名空间(
xmlns="something"
( - 我假设您向我们展示的XML周围有
<CxXMLResults>
和<Query>
,并且id,ProjectId和ScanId的值存在于您未显示的部分。 - 您可能需要调整 XPathes