尝试将XML文件获取到SQL Server表中
我有一个大的XML文件,我想进入SQL Server,所以我以可读的格式为最终用户查询它。我已经开始了一个查询,我可以获取一些数据,但无法获取其余数据 这是我的xml文件中的一组示例数据尝试将XML文件获取到SQL Server表中,sql,sql-server,xml,Sql,Sql Server,Xml,我有一个大的XML文件,我想进入SQL Server,所以我以可读的格式为最终用户查询它。我已经开始了一个查询,我可以获取一些数据,但无法获取其余数据 这是我的xml文件中的一组示例数据 <file> <edxMsg> <edxMsgHdr> <trnNm>ICSHDR2</trnNm> <trnAct>N</trnAct> <trnVer>01<
<file>
<edxMsg>
<edxMsgHdr>
<trnNm>ICSHDR2</trnNm>
<trnAct>N</trnAct>
<trnVer>01</trnVer>
<rcvAgncy>PLA</rcvAgncy>
<rcvAgncyObjId>555012069A</rcvAgncyObjId>
<sndAgncy>CLK</sndAgncy>
<sndAgncyApplnId>ICS</sndAgncyApplnId>
<sentDate>20180920</sentDate>
<sentTime>013113615000</sentTime>
<sendGMTOffsetMin>-600</sendGMTOffsetMin>
<sndMchnId>N</sndMchnId>
<trnRefId>37</trnRefId>
</edxMsgHdr>
<trnData>
<batchInfo>
<numRecords>1151</numRecords>
</batchInfo>
</trnData>
</edxMsg>
<edxMsg>
<edxMsgHdr>
<trnNm>ICS400CUR</trnNm>
<trnAct>N</trnAct>
<trnVer>01</trnVer>
<rcvAgncy>PLA</rcvAgncy>
<rcvAgncyObjId>2015</rcvAgncyObjId>
<sndAgncy>CLK</sndAgncy>
<sndAgncyObjId>204630959S</sndAgncyObjId>
<sndAgncyApplnId>ICS</sndAgncyApplnId>
<sndUserId>PLAN-AAD192</sndUserId>
<sentDate>20180919</sentDate>
<sentTime>131812085000</sentTime>
<sendGMTOffsetMin>-600</sendGMTOffsetMin>
<sndMchnId>N</sndMchnId>
<trnRefId>37</trnRefId>
</edxMsgHdr>
<trnData>
<respCurrent>
<freeText>2015</freeText>
<rqstDate>20180919</rqstDate>
<rqstBtch>5575</rqstBtch>
<dob>19690328</dob>
<surname>Knocksville</surname>
<firstname>Jonny</firstname>
<procDts>20180919131812057</procDts>
<partner>N</partner>
<tpId>555012069A</tpId>
<numChild>1</numChild>
<shCareDtl>
<chId>1</chId>
<shPercent>100</shPercent>
</shCareDtl>
<maxRateDtl>
<maxRateBen>DSP</maxRateBen>
<maxRateInd>Y</maxRateInd>
</maxRateDtl>
<maxRateDtl>
<maxRateBen>FTB</maxRateBen>
<maxRateInd>Y</maxRateInd>
</maxRateDtl>
<payDtl>
<paySts>PYD</paySts>
<payType>REG</payType>
<ben>DSP</ben>
<grntDate>20100817</grntDate>
<payDate>20180914</payDate>
<payFreq>2WE</payFreq>
<payActAmt>90760</payActAmt>
<cmpDtl>
<cmp>BASIC</cmp>
<cmpPayAmt>82620</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CES</cmp>
<cmpPayAmt>1410</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>PNSUP</cmp>
<cmpPayAmt>6730</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
</payDtl>
<payDtl>
<paySts>PYD</paySts>
<payType>REG</payType>
<ben>FTB</ben>
<grntDate>20000701</grntDate>
<payDate>20180907</payDate>
<payFreq>2WE</payFreq>
<payLegAmt>51128</payLegAmt>
<payActAmt>51128</payActAmt>
<cmpDtl>
<cmp>FTBA</cmp>
<cmpPayAmt>23786</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBA</cmp>
<cmpPayAmt>23786</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBB</cmp>
<cmpPayAmt>10864</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBB</cmp>
<cmpPayAmt>10864</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESA</cmp>
<cmpPayAmt>448</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESA</cmp>
<cmpPayAmt>448</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESB</cmp>
<cmpPayAmt>196</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESB</cmp>
<cmpPayAmt>196</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>RA</cmp>
<cmpPayAmt>15834</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>RA</cmp>
<cmpPayAmt>15834</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
</payDtl>
<payDtl>
<paySts>NXT</paySts>
<payType>REG</payType>
<ben>DSP</ben>
<grntDate>20100817</grntDate>
<payDate>20180928</payDate>
<payFreq>2WE</payFreq>
<payActAmt>91195</payActAmt>
<cmpDtl>
<cmp>BASIC</cmp>
<cmpPayAmt>83030</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CES</cmp>
<cmpPayAmt>1410</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>PNSUP</cmp>
<cmpPayAmt>6755</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
</payDtl>
<payDtl>
<paySts>NXT</paySts>
<payType>REG</payType>
<ben>FTB</ben>
<grntDate>20000701</grntDate>
<payDate>20180921</payDate>
<payFreq>2WE</payFreq>
<payLegAmt>51128</payLegAmt>
<payActAmt>51128</payActAmt>
<cmpDtl>
<cmp>FTBA</cmp>
<cmpPayAmt>23786</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBA</cmp>
<cmpPayAmt>23786</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBB</cmp>
<cmpPayAmt>10864</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>FTBB</cmp>
<cmpPayAmt>10864</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESA</cmp>
<cmpPayAmt>448</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESA</cmp>
<cmpPayAmt>448</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESB</cmp>
<cmpPayAmt>196</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>CESB</cmp>
<cmpPayAmt>196</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>RA</cmp>
<cmpPayAmt>15834</cmpPayAmt>
<cmpPayCode>ACT</cmpPayCode>
</cmpDtl>
<cmpDtl>
<cmp>RA</cmp>
<cmpPayAmt>15834</cmpPayAmt>
<cmpPayCode>LEG</cmpPayCode>
</cmpDtl>
</payDtl>
<ddnDtl>
<ddnBen>DSP</ddnBen>
<ddnType>RCV</ddnType>
<ddnAmt>9900</ddnAmt>
<ddnDate>20180914</ddnDate>
</ddnDtl>
<ddnDtl>
<ddnBen>DSP</ddnBen>
<ddnType>DDF</ddnType>
<ddnAmt>47319</ddnAmt>
<ddnDate>20180914</ddnDate>
</ddnDtl>
<ddnDtl>
<ddnBen>FTB</ddnBen>
<ddnType>RCV</ddnType>
<ddnAmt>6034</ddnAmt>
<ddnDate>20180907</ddnDate>
</ddnDtl>
<ddnDtl>
<ddnBen>FTB</ddnBen>
<ddnType>DDF</ddnType>
<ddnAmt>3000</ddnAmt>
<ddnDate>20180907</ddnDate>
</ddnDtl>
<incDtl>
<incType>FIN</incType>
<incFreq>ANN</incFreq>
<incAmt>525</incAmt>
<incDate>20150320</incDate>
</incDtl>
<assDtl>
<assType>CIS</assType>
<assAmt>30000</assAmt>
<assDate>20160920</assDate>
</assDtl>
<assDtl>
<assType>HPE</assType>
<assAmt>1000000</assAmt>
<assDate>20100817</assDate>
</assDtl>
</respCurrent>
</trnData>
</edxMsg>
</file>
我正试图为下面的每一项都写一个专栏
file/edxMsg/trnData/respCurrent/payDtl/cmpDtl
我已经尝试了我认为是一切,但我一定错过了什么
任何指导都很好 SQLServer提供XML数据类型来存储和搜索XML数据。如果要在SQL server中搜索XML,可以执行以下步骤- 创建一个包含XML数据类型列的表 在此表中插入XML 根据需要搜索XML节点 注意:如果您有大量数据,那么还应该在XML列上创建XML索引,以提高搜索性能 您可以参考下面的链接了解示例代码
您真的应该检查一下内置的XQuery支持,抛弃旧的、遗留的OPENXML方法 尝试此操作以获取所有节点并从中提取详细信息:
SELECT
Cmp = xc.value('(cmp)[1]', 'varchar(20)'),
CmpPayAmount = xc.value('(cmpPayAmt)[1]', 'decimal(20,4)'),
CmpPayCode = xc.value('(cmpPayCode)[1]', 'varchar(20)')
FROM
@x.nodes('/file/edxMsg/trnData/respCurrent/payDtl/cmpDtl') AS XT(XC)
这将返回XML中所有值的列表(Cmp、CmpPayAmount和CmpPayCode三列),作为正确的关系数据,例如,可以将其插入到表中。从OPENXML开始的方法以及准备和删除XML文档的两个过程已经过时,不应再使用。存在罕见的例外情况
而是使用XML数据类型提供的
试试这个:
DECLARE @xml XML=
N'place your XML here';
SELECT A.msg.value('(edxMsgHdr/trnNm)[1]','nvarchar(10)') AS trnNm
,A.msg.value('(edxMsgHdr/trnAct)[1]','nvarchar(10)') AS trnAct
--Add all header values here
,A.msg.query('trnData') AS trnDataNode
FROM @xml.nodes('/file/edxMsg') A(msg);
中心思想是:
使用.value从XML中检索值
使用交叉应用YourXml.nodes'Some XPath'将重复元素转换为派生集。
使用.query检索XML片段
在本例中,我使用了.nodes来获取两行数据。其中的所有数据似乎都是1:1相关的,因此我们可以使用.value轻松地选择它们
困难的部分将是课程的内容
第一条消息只显示了一个简单的结构,但第二条消息包含了非常复杂的结构
问题是:这需要很多思考,因为它似乎涵盖了分布在多个表中的复杂的1:n相关结构。必须在派生列表中检索任何重复元素,如或。后者本身有嵌套的重复元素,甚至有更多的like和
类似于以下的查询将有助于您从数据库中获取一些数据:
此外,您必须非常了解edxMsg格式,才能知道消息中是否有本示例未涵盖的元素
因此:我们可以提供并解释提取数据所需的工具,但您必须了解自己,什么是可读格式…请为最终用户澄清可读格式。是否有可读格式?嗨,Alex,这很有帮助,但我之所以挣扎,是因为我需要在每行中包含DOB的名字,以便我知道它属于谁。。这是我不知道怎么做的部分…我在从SQL读取xml时遇到了类似的问题。最好的方法是使用像c这样的编程语言来解析文件,然后从c写到数据库。你是如何做到这一点的。没有必要执行步骤1和步骤这很好,我显然偏离了目标,感谢您的指导,正如您现在所说,我必须找出如何将其以可读的格式呈现。。谢谢你!!
DECLARE @xml XML=
N'place your XML here';
SELECT A.msg.value('(edxMsgHdr/trnNm)[1]','nvarchar(10)') AS trnNm
,A.msg.value('(edxMsgHdr/trnAct)[1]','nvarchar(10)') AS trnAct
--Add all header values here
,A.msg.query('trnData') AS trnDataNode
FROM @xml.nodes('/file/edxMsg') A(msg);
SELECT A.msg.value('(edxMsgHdr/trnNm)[1]','nvarchar(10)') AS trnNm
,A.msg.value('(edxMsgHdr/trnAct)[1]','nvarchar(10)') AS trnAct
,A.msg.query('trnData') AS trnDataNode
,B.payDtl.value('(paySts)[1]','nvarchar(100)') AS paySts
,B.payDtl.value('(payType)[1]','nvarchar(100)') AS payType
,C.cmpDtl.value('(cmp)[1]','nvarchar(max)') AS cmp
,C.cmpDtl.value('(cmpPayAmt)[1]','decimal(10,4)') AS cmpPayAmt
FROM @xml.nodes('/file/edxMsg') A(msg)
CROSS APPLY A.msg.nodes('trnData/respCurrent/payDtl') B(payDtl)
CROSS APPLY B.payDtl.nodes('cmpDtl') C(cmpDtl)