有很多问题:
-
您应该指定确切的路径,而不是
//
因为它更快。
-
XQuery的逻辑是“返回1/2/3。。。
OfficerInd
节点“when you want is”返回第一个
办公用品
包含在第1/2/3页。。。
Form990PartVIISectionAGrp
如果你指定了确切的誓言,你就会注意到这一点。
-
第一个
CROSS APPLY
是不必要的,因为你没有使用它
.nodes
罗塞特。
-
即使你先需要
交叉申请
你应该把它注入第二个,而不是再回到根上。
-
是
varchar(max)
这是一种合理的数据类型吗?也许应该是这样
varchar(30)
甚至
char(1)
WITH XMLNAMESPACES (DEFAULT 'http://www.irs.gov/efile')
SELECT
Form990PartVIISectionAGrpOfficerInd0 =
c2.value('(Form990PartVIISectionAGrp[1]/OfficerInd/text())[1]','varchar(MAX)')
, Form990PartVIISectionAGrpOfficerInd1 =
c2.value('(Form990PartVIISectionAGrp[2]/OfficerInd/text())[1]','varchar(MAX)')
, Form990PartVIISectionAGrpOfficerInd2 =
c2.value('(Form990PartVIISectionAGrp[3]/OfficerInd/text())[1]','varchar(MAX)')
, Form990PartVIISectionAGrpOfficerInd3 =
c2.value('(Form990PartVIISectionAGrp[4]/OfficerInd/text())[1]','varchar(MAX)')
, Form990PartVIISectionAGrpOfficerInd4 =
c2.value('(Form990PartVIISectionAGrp[5]/OfficerInd/text())[1]','varchar(MAX)')
, Form990PartVIISectionAGrpOfficerInd5 =
c2.value('(Form990PartVIISectionAGrp[6]/OfficerInd/text())[1]','varchar(MAX)')
FROM Form990
CROSS APPLY XMLData.nodes('/Return/ReturnData/IRS990') AS t2(c2);
请注意,您还可以将所有这些节点拆分为单独的行,而不是单独的列。你可以使用一个计算所有早期节点的黑客程序来获得这个位置。
WITH XMLNAMESPACES (DEFAULT 'http://www.irs.gov/efile')
SELECT
Form990PartVIISectionAGrpOfficerInd = c2.value('(OfficerInd/text())[1]','varchar(MAX)')
, Position = c2.value('let $i:= . return count(../Form990PartVIISectionAGrp[. << $i]) + 1','int')
FROM Form990
CROSS APPLY XMLData.nodes('/Return/ReturnData/IRS990/Form990PartVIISectionAGrp') AS t2(c2)
db<>fiddle