0

我正在尝试将一组公开可用的数据导入 SQL Server 数据库。我是一个新手,并且正在为此苦苦挣扎-今天大部分时间都花在了这个问题上……无论我做了多少调整,它都不会返回任何结果。在线提供的示例,我可以遵循(并工作),但是当我尝试使用我拥有的实际数据时,我没有得到任何结果。对此的任何帮助都非常感谢。

我正在按照以下 URL 中的步骤操作:

https://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

我使用的 SQL 如下(我的 XML 文件名为 D:\OpenXMLTesting.xml):

    CREATE DATABASE OPENXMLTesting
GO

USE OPENXMLTesting
GO

CREATE TABLE XMLwithOpenXML
(
Id INT IDENTITY PRIMARY KEY,
XMLData XML,
LoadedDateTime DATETIME
)

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'D:\OpenXMLTesting.xml', SINGLE_BLOB) AS x;

SELECT * FROM XMLwithOpenXML




DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM XMLwithOpenXML

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT Id
FROM OPENXML(@hDoc, 'BizData/Pyld/Document/FinInstrmRptgRefDataRpt/RefData/FinInstrmGnlAttrbts')
WITH 
(
Id [varchar](50) '@Id'
)

EXEC sp_xml_removedocument @hDoc
GO

原始 XML 包含以下数据:-

<?xml version="1.0" encoding="UTF-8"?>

-<BizData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.01.xsd">


+<Hdr>


































































-<Pyld>


-<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02 auth.017.001.02_ESMAUG_FULINS_1.1.0.xsd">


-<FinInstrmRptgRefDataRpt>


+<RptHdr>














-<RefData>


-<FinInstrmGnlAttrbts>

<Id>DE000C3JALS0</Id>

<FullNm>EAA3 SI 20211220 CS</FullNm>

<ShrtNm>EEX/EUAA P AUCTION SPOT</ShrtNm>

<ClssfctnTp>ITNXXX</ClssfctnTp>

<NtnlCcy>EUR</NtnlCcy>

<CmmdtyDerivInd>false</CmmdtyDerivInd>

</FinInstrmGnlAttrbts>

<Issr>529900J0JGLSFDWNFC20</Issr>


-<TradgVnRltdAttrbts>

<Id>XEER</Id>

<IssrReq>false</IssrReq>

<FrstTradDt>2015-03-25T06:00:00Z</FrstTradDt>

<TermntnDt>2021-12-20T23:59:59Z</TermntnDt>

</TradgVnRltdAttrbts>


-<DerivInstrmAttrbts>

<PricMltplr>500</PricMltplr>


-<AsstClssSpcfcAttrbts>


-<Cmmdty>


-<Pdct>


-<Envttl>


-<Emssns>

<BasePdct>ENVR</BasePdct>

<SubPdct>EMIS</SubPdct>

<AddtlSubPdct>EUAA</AddtlSubPdct>

</Emssns>

</Envttl>

</Pdct>

<TxTp>OTHR</TxTp>

<FnlPricTp>EXOF</FnlPricTp>

</Cmmdty>

</AsstClssSpcfcAttrbts>

</DerivInstrmAttrbts>


-<TechAttrbts>

<RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>


-<PblctnPrd>

<FrDt>2019-07-16</FrDt>

</PblctnPrd>

<RlvntTradgVn>XEER</RlvntTradgVn>

</TechAttrbts>

</RefData>


-<RefData>


-<FinInstrmGnlAttrbts>

<Id>DE000C3JALT8</Id>

<FullNm>T3PA SI 20211220 CS</FullNm>

<ShrtNm>EEX/EUA P AUCTION SPOT</ShrtNm>

<ClssfctnTp>ITNXXX</ClssfctnTp>

<NtnlCcy>EUR</NtnlCcy>

<CmmdtyDerivInd>false</CmmdtyDerivInd>

</FinInstrmGnlAttrbts>

<Issr>529900J0JGLSFDWNFC20</Issr>


-<TradgVnRltdAttrbts>

<Id>XEER</Id>

<IssrReq>false</IssrReq>

<FrstTradDt>2015-03-25T06:00:00Z</FrstTradDt>

<TermntnDt>2021-12-20T23:59:59Z</TermntnDt>

</TradgVnRltdAttrbts>


-<DerivInstrmAttrbts>

<PricMltplr>500</PricMltplr>


-<AsstClssSpcfcAttrbts>


-<Cmmdty>


-<Pdct>


-<Envttl>


-<Emssns>

<BasePdct>ENVR</BasePdct>

<SubPdct>EMIS</SubPdct>

<AddtlSubPdct>EUAE</AddtlSubPdct>

</Emssns>

</Envttl>

</Pdct>

<TxTp>OTHR</TxTp>

<FnlPricTp>EXOF</FnlPricTp>

</Cmmdty>

</AsstClssSpcfcAttrbts>

</DerivInstrmAttrbts>


-<TechAttrbts>

<RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>


-<PblctnPrd>

<FrDt>2019-07-16</FrDt>

</PblctnPrd>

<RlvntTradgVn>XEER</RlvntTradgVn>

</TechAttrbts>

</RefData>


-<RefData>


-<FinInstrmGnlAttrbts>

<Id>DE000F5PP026</Id>

<FullNm>SEME SI 20211220 CS</FullNm>

<ShrtNm>EEX/F 20211220</ShrtNm>

<ClssfctnTp>ITNXXX</ClssfctnTp>

<NtnlCcy>EUR</NtnlCcy>

<CmmdtyDerivInd>true</CmmdtyDerivInd>

</FinInstrmGnlAttrbts>

<Issr>529900J0JGLSFDWNFC20</Issr>


-<TradgVnRltdAttrbts>

<Id>XEER</Id>

<IssrReq>false</IssrReq>

<FrstTradDt>2015-03-25T06:00:00Z</FrstTradDt>

<TermntnDt>2021-12-20T23:59:59Z</TermntnDt>

</TradgVnRltdAttrbts>


-<DerivInstrmAttrbts>

<PricMltplr>1000</PricMltplr>


-<AsstClssSpcfcAttrbts>


-<Cmmdty>


-<Pdct>


-<Envttl>


-<Emssns>

<BasePdct>ENVR</BasePdct>

<SubPdct>EMIS</SubPdct>

<AddtlSubPdct>EUAE</AddtlSubPdct>

</Emssns>

</Envttl>

</Pdct>

<TxTp>OTHR</TxTp>

<FnlPricTp>EXOF</FnlPricTp>

</Cmmdty>

</AsstClssSpcfcAttrbts>

</DerivInstrmAttrbts>


-<TechAttrbts>

<RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>


-<PblctnPrd>

<FrDt>2018-12-04</FrDt>

</PblctnPrd>

<RlvntTradgVn>XEER</RlvntTradgVn>

</TechAttrbts>

</RefData>


-<RefData>


-<FinInstrmGnlAttrbts>

<Id>DE000F5PPQ38</Id>

<FullNm>SEMA SI 20211220 CS</FullNm>

<ShrtNm>EEX/F 20211220</ShrtNm>

<ClssfctnTp>ITNXXX</ClssfctnTp>

<NtnlCcy>EUR</NtnlCcy>

<CmmdtyDerivInd>true</CmmdtyDerivInd>

</FinInstrmGnlAttrbts>

<Issr>529900J0JGLSFDWNFC20</Issr>


-<TradgVnRltdAttrbts>

<Id>XEER</Id>

<IssrReq>false</IssrReq>

<FrstTradDt>2015-03-25T06:00:00Z</FrstTradDt>

<TermntnDt>2021-12-20T23:59:59Z</TermntnDt>

</TradgVnRltdAttrbts>


-<DerivInstrmAttrbts>

<PricMltplr>1000</PricMltplr>


-<AsstClssSpcfcAttrbts>


-<Cmmdty>


-<Pdct>


-<Envttl>


-<Emssns>

<BasePdct>ENVR</BasePdct>

<SubPdct>EMIS</SubPdct>

<AddtlSubPdct>EUAA</AddtlSubPdct>

</Emssns>

</Envttl>

</Pdct>

<TxTp>OTHR</TxTp>

<FnlPricTp>EXOF</FnlPricTp>

</Cmmdty>

</AsstClssSpcfcAttrbts>

</DerivInstrmAttrbts>


-<TechAttrbts>

<RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>


-<PblctnPrd>

<FrDt>2018-12-04</FrDt>

</PblctnPrd>

<RlvntTradgVn>XEER</RlvntTradgVn>

</TechAttrbts>

</RefData>


-<RefData>


-<FinInstrmGnlAttrbts>

<Id>DE000F5PPYW2</Id>

<FullNm>SEMC SI 20211220 CS</FullNm>

<ShrtNm>EEX/F 20211220</ShrtNm>

<ClssfctnTp>ITNXXX</ClssfctnTp>

<NtnlCcy>EUR</NtnlCcy>

<CmmdtyDerivInd>true</CmmdtyDerivInd>

</FinInstrmGnlAttrbts>

<Issr>529900J0JGLSFDWNFC20</Issr>


-<TradgVnRltdAttrbts>

<Id>XEER</Id>

<IssrReq>false</IssrReq>

<FrstTradDt>2015-03-25T06:00:00Z</FrstTradDt>

<TermntnDt>2021-12-20T23:59:59Z</TermntnDt>

</TradgVnRltdAttrbts>


-<DerivInstrmAttrbts>

<PricMltplr>1000</PricMltplr>


-<AsstClssSpcfcAttrbts>


-<Cmmdty>


-<Pdct>


-<Envttl>


-<Emssns>

<BasePdct>ENVR</BasePdct>

<SubPdct>EMIS</SubPdct>

<AddtlSubPdct>CERE</AddtlSubPdct>

</Emssns>

</Envttl>

</Pdct>

<TxTp>OTHR</TxTp>

<FnlPricTp>EXOF</FnlPricTp>

</Cmmdty>

</AsstClssSpcfcAttrbts>

</DerivInstrmAttrbts>


-<TechAttrbts>

<RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>


-<PblctnPrd>

<FrDt>2018-12-04</FrDt>

</PblctnPrd>

<RlvntTradgVn>XEER</RlvntTradgVn>

</TechAttrbts>

</RefData>

</FinInstrmRptgRefDataRpt>

</Document>

</Pyld>

</BizData>

非常感谢任何帮助。

谢谢

4

2 回答 2

1

有几点需要指出。

(1) 你的 XML 格式不正确,所以我不得不修复它。

(2) 您所指的文章在 SQL Server 2005 发布之前是相关的。从 SQL Server 2005 开始,它使用基于 w3c 标准的 XQuery 语言来处理 XML 数据类型。Microsoft 专有OPENXML及其伙伴sp_xml_preparedocumentsp_xml_removedocument保留只是为了向后兼容过时的 SQL Server 2000。这就是为什么使用.nodes()

(3) 始终应考虑命名空间。

XML

<?xml version="1.0" encoding="UTF-8"?>
<BizData xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
         xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01"
         xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.01.xsd">
    <Hdr/>
    <Pyld>
        <Document xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
                  xmlns="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02"
                  xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02 auth.017.001.02_ESMAUG_FULINS_1.1.0.xsd">
            <FinInstrmRptgRefDataRpt>
                <RptHdr/>
                <RefData>
                    <FinInstrmGnlAttrbts>
                        <Id>DE000C3JALS0</Id>
                        <FullNm>EAA3 SI 20211220 CS</FullNm>
                        <ShrtNm>EEX/EUAA P AUCTION SPOT</ShrtNm>
                        <ClssfctnTp>ITNXXX</ClssfctnTp>
                        <NtnlCcy>EUR</NtnlCcy>
                        <CmmdtyDerivInd>false</CmmdtyDerivInd>
                    </FinInstrmGnlAttrbts>
                    <Issr>529900J0JGLSFDWNFC20</Issr>
                    <TradgVnRltdAttrbts>
                        <Id>XEER</Id>
                        <IssrReq>false</IssrReq>
                        <FrstTradDt>20150325T06:00:00Z</FrstTradDt>
                        <TermntnDt>20211220T23:59:59Z</TermntnDt>
                    </TradgVnRltdAttrbts>
                    <DerivInstrmAttrbts>
                        <PricMltplr>500</PricMltplr>
                        <AsstClssSpcfcAttrbts>
                            <Cmmdty>
                                <Pdct>
                                    <Envttl>
                                        <Emssns>
                                            <BasePdct>ENVR</BasePdct>
                                            <SubPdct>EMIS</SubPdct>
                                            <AddtlSubPdct>EUAA</AddtlSubPdct>
                                        </Emssns>
                                    </Envttl>
                                </Pdct>
                                <TxTp>OTHR</TxTp>
                                <FnlPricTp>EXOF</FnlPricTp>
                            </Cmmdty>
                        </AsstClssSpcfcAttrbts>
                    </DerivInstrmAttrbts>
                    <TechAttrbts>
                        <RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>
                        <PblctnPrd>
                            <FrDt>20190716</FrDt>
                        </PblctnPrd>
                        <RlvntTradgVn>XEER</RlvntTradgVn>
                    </TechAttrbts>
                </RefData>
                <RefData>
                    <FinInstrmGnlAttrbts>
                        <Id>DE000C3JALT8</Id>
                        <FullNm>T3PA SI 20211220 CS</FullNm>
                        <ShrtNm>EEX/EUA P AUCTION SPOT</ShrtNm>
                        <ClssfctnTp>ITNXXX</ClssfctnTp>
                        <NtnlCcy>EUR</NtnlCcy>
                        <CmmdtyDerivInd>false</CmmdtyDerivInd>
                    </FinInstrmGnlAttrbts>
                    <Issr>529900J0JGLSFDWNFC20</Issr>
                    <TradgVnRltdAttrbts>
                        <Id>XEER</Id>
                        <IssrReq>false</IssrReq>
                        <FrstTradDt>20150325T06:00:00Z</FrstTradDt>
                        <TermntnDt>20211220T23:59:59Z</TermntnDt>
                    </TradgVnRltdAttrbts>
                    <DerivInstrmAttrbts>
                        <PricMltplr>500</PricMltplr>
                        <AsstClssSpcfcAttrbts>
                            <Cmmdty>
                                <Pdct>
                                    <Envttl>
                                        <Emssns>
                                            <BasePdct>ENVR</BasePdct>
                                            <SubPdct>EMIS</SubPdct>
                                            <AddtlSubPdct>EUAE</AddtlSubPdct>
                                        </Emssns>
                                    </Envttl>
                                </Pdct>
                                <TxTp>OTHR</TxTp>
                                <FnlPricTp>EXOF</FnlPricTp>
                            </Cmmdty>
                        </AsstClssSpcfcAttrbts>
                    </DerivInstrmAttrbts>
                    <TechAttrbts>
                        <RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>
                        <PblctnPrd>
                            <FrDt>20190716</FrDt>
                        </PblctnPrd>
                        <RlvntTradgVn>XEER</RlvntTradgVn>
                    </TechAttrbts>
                </RefData>
                <RefData>
                    <FinInstrmGnlAttrbts>
                        <Id>DE000F5PP026</Id>
                        <FullNm>SEME SI 20211220 CS</FullNm>
                        <ShrtNm>EEX/F 20211220</ShrtNm>
                        <ClssfctnTp>ITNXXX</ClssfctnTp>
                        <NtnlCcy>EUR</NtnlCcy>
                        <CmmdtyDerivInd>true</CmmdtyDerivInd>
                    </FinInstrmGnlAttrbts>
                    <Issr>529900J0JGLSFDWNFC20</Issr>
                    <TradgVnRltdAttrbts>
                        <Id>XEER</Id>
                        <IssrReq>false</IssrReq>
                        <FrstTradDt>20150325T06:00:00Z</FrstTradDt>
                        <TermntnDt>20211220T23:59:59Z</TermntnDt>
                    </TradgVnRltdAttrbts>
                    <DerivInstrmAttrbts>
                        <PricMltplr>1000</PricMltplr>
                        <AsstClssSpcfcAttrbts>
                            <Cmmdty>
                                <Pdct>
                                    <Envttl>
                                        <Emssns>
                                            <BasePdct>ENVR</BasePdct>
                                            <SubPdct>EMIS</SubPdct>
                                            <AddtlSubPdct>EUAE</AddtlSubPdct>
                                        </Emssns>
                                    </Envttl>
                                </Pdct>
                                <TxTp>OTHR</TxTp>
                                <FnlPricTp>EXOF</FnlPricTp>
                            </Cmmdty>
                        </AsstClssSpcfcAttrbts>
                    </DerivInstrmAttrbts>
                    <TechAttrbts>
                        <RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>
                        <PblctnPrd>
                            <FrDt>20181204</FrDt>
                        </PblctnPrd>
                        <RlvntTradgVn>XEER</RlvntTradgVn>
                    </TechAttrbts>
                </RefData>
                <RefData>
                    <FinInstrmGnlAttrbts>
                        <Id>DE000F5PPQ38</Id>
                        <FullNm>SEMA SI 20211220 CS</FullNm>
                        <ShrtNm>EEX/F 20211220</ShrtNm>
                        <ClssfctnTp>ITNXXX</ClssfctnTp>
                        <NtnlCcy>EUR</NtnlCcy>
                        <CmmdtyDerivInd>true</CmmdtyDerivInd>
                    </FinInstrmGnlAttrbts>
                    <Issr>529900J0JGLSFDWNFC20</Issr>
                    <TradgVnRltdAttrbts>
                        <Id>XEER</Id>
                        <IssrReq>false</IssrReq>
                        <FrstTradDt>20150325T06:00:00Z</FrstTradDt>
                        <TermntnDt>20211220T23:59:59Z</TermntnDt>
                    </TradgVnRltdAttrbts>
                    <DerivInstrmAttrbts>
                        <PricMltplr>1000</PricMltplr>
                        <AsstClssSpcfcAttrbts>
                            <Cmmdty>
                                <Pdct>
                                    <Envttl>
                                        <Emssns>
                                            <BasePdct>ENVR</BasePdct>
                                            <SubPdct>EMIS</SubPdct>
                                            <AddtlSubPdct>EUAA</AddtlSubPdct>
                                        </Emssns>
                                    </Envttl>
                                </Pdct>
                                <TxTp>OTHR</TxTp>
                                <FnlPricTp>EXOF</FnlPricTp>
                            </Cmmdty>
                        </AsstClssSpcfcAttrbts>
                    </DerivInstrmAttrbts>
                    <TechAttrbts>
                        <RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>
                        <PblctnPrd>
                            <FrDt>20181204</FrDt>
                        </PblctnPrd>
                        <RlvntTradgVn>XEER</RlvntTradgVn>
                    </TechAttrbts>
                </RefData>
                <RefData>
                    <FinInstrmGnlAttrbts>
                        <Id>DE000F5PPYW2</Id>
                        <FullNm>SEMC SI 20211220 CS</FullNm>
                        <ShrtNm>EEX/F 20211220</ShrtNm>
                        <ClssfctnTp>ITNXXX</ClssfctnTp>
                        <NtnlCcy>EUR</NtnlCcy>
                        <CmmdtyDerivInd>true</CmmdtyDerivInd>
                    </FinInstrmGnlAttrbts>
                    <Issr>529900J0JGLSFDWNFC20</Issr>
                    <TradgVnRltdAttrbts>
                        <Id>XEER</Id>
                        <IssrReq>false</IssrReq>
                        <FrstTradDt>20150325T06:00:00Z</FrstTradDt>
                        <TermntnDt>20211220T23:59:59Z</TermntnDt>
                    </TradgVnRltdAttrbts>
                    <DerivInstrmAttrbts>
                        <PricMltplr>1000</PricMltplr>
                        <AsstClssSpcfcAttrbts>
                            <Cmmdty>
                                <Pdct>
                                    <Envttl>
                                        <Emssns>
                                            <BasePdct>ENVR</BasePdct>
                                            <SubPdct>EMIS</SubPdct>
                                            <AddtlSubPdct>CERE</AddtlSubPdct>
                                        </Emssns>
                                    </Envttl>
                                </Pdct>
                                <TxTp>OTHR</TxTp>
                                <FnlPricTp>EXOF</FnlPricTp>
                            </Cmmdty>
                        </AsstClssSpcfcAttrbts>
                    </DerivInstrmAttrbts>
                    <TechAttrbts>
                        <RlvntCmptntAuthrty>DE</RlvntCmptntAuthrty>
                        <PblctnPrd>
                            <FrDt>20181204</FrDt>
                        </PblctnPrd>
                        <RlvntTradgVn>XEER</RlvntTradgVn>
                    </TechAttrbts>
                </RefData>
            </FinInstrmRptgRefDataRpt>
        </Document>
    </Pyld>
</BizData>

SQL,方法 #1

-- DDL and sample population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, XMLData XML, LoadedDateTime DATETIME DEFAULT GETDATE());

INSERT INTO @tbl (XMLData)
SELECT TRY_CAST(BulkColumn AS XML) AS BulkColumn 
FROM OPENROWSET(BULK 'e:\temp\OpenXMLTesting.xml', SINGLE_BLOB) AS x;
-- DDL and sample population, start

;WITH XMLNAMESPACES (DEFAULT 'urn:iso:std:iso:20022:tech:xsd:auth.017.001.02'
    , 'urn:iso:std:iso:20022:tech:xsd:head.003.001.01' AS ns1)
SELECT c.value('(FinInstrmGnlAttrbts/Id/text())[1]','VARCHAR(30)') AS FinInstrmGnlAttrbts_Id
    , c.value('(TradgVnRltdAttrbts/Id/text())[1]','VARCHAR(30)') AS TradgVnRltdAttrbts_Id
FROM @tbl AS tbl
    CROSS APPLY tbl.xmldata.nodes('/ns1:BizData/ns1:Pyld/Document/FinInstrmRptgRefDataRpt/RefData') AS t(c);

SQL,方法 #2

-- Method #2, directly from the XML file as a virtual DB table on the file system
;WITH XMLNAMESPACES (DEFAULT 'urn:iso:std:iso:20022:tech:xsd:auth.017.001.02'
    , 'urn:iso:std:iso:20022:tech:xsd:head.003.001.01' AS ns1), rs (xmldata) AS
(
    SELECT TRY_CAST(BulkColumn AS XML) AS BulkColumn 
    FROM OPENROWSET(BULK 'e:\temp\OpenXMLTesting.xml', SINGLE_BLOB) AS x
)
SELECT c.value('(FinInstrmGnlAttrbts/Id/text())[1]','VARCHAR(30)') AS FinInstrmGnlAttrbts_Id
    , c.value('(TradgVnRltdAttrbts/Id/text())[1]','VARCHAR(30)') AS TradgVnRltdAttrbts_Id
FROM rs AS tbl
    CROSS APPLY tbl.xmldata.nodes('/ns1:BizData/ns1:Pyld/Document/FinInstrmRptgRefDataRpt/RefData') AS t(c);

输出

+------------------------+-----------------------+
| FinInstrmGnlAttrbts_Id | TradgVnRltdAttrbts_Id |
+------------------------+-----------------------+
| DE000C3JALS0           | XEER                  |
| DE000C3JALT8           | XEER                  |
| DE000F5PP026           | XEER                  |
| DE000F5PPQ38           | XEER                  |
| DE000F5PPYW2           | XEER                  |
+------------------------+-----------------------+
于 2020-02-23T04:26:28.853 回答
0

不幸的是,XML 命名空间是 Microsoft 文档所在的一个领域,sp_xml_preparedocument而且OpenXML非常缺乏细节。当前的所有示例都显示匿名 XML。nodes和文档在这query方面要好得多。

您尝试解析的 XML 文档包含 BizData 和 Document 元素上的 XML 命名空间声明。您需要将这些考虑在内:

  • 调用时,sp_xml_preparedocument您需要提供一个@xpath_namespaces参数,并且
  • 调用时,OpenXML您需要在 XPath 表达式中提供命名空间前缀以及with模式定义。

例如:

declare
  @hDoc int,
  @xml xml =
N'<BizData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.01.xsd">
  <Pyld>
    <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02 auth.017.001.02_ESMAUG_FULINS_1.1.0.xsd">
      <FinInstrmRptgRefDataRpt>
        <RefData>
          <FinInstrmGnlAttrbts>
            <Id>DE000C3JALS0</Id>
          </FinInstrmGnlAttrbts>
        </RefData>
      </FinInstrmRptgRefDataRpt>
    </Document>
  </Pyld>
</BizData>';

-- Use sp_xml_preparedocument with an xpath namespaces declaration.
-- Here we define:
-- namespace prefix a = urn:iso:std:iso:20022:tech:xsd:head.003.001.01
-- namespace prefix b = urn:iso:std:iso:20022:tech:xsd:auth.017.001.02
-- REF: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-xml-preparedocument-transact-sql
exec sp_xml_preparedocument
  @hDoc output,
  @xml,
  N'<root xmlns:a="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xmlns:b="urn:iso:std:iso:20022:tech:xsd:auth.017.001.02" />'


-- Use OpenXML with namespace qualified paths.
-- i.e.: We use the 'a:' and 'b:' namespace prefixes defined in sp_xml_preparedocument to qualify the XPath expressions.
-- REF: https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql
select *
from OpenXML(@hDoc, '/a:BizData/a:Pyld/b:Document/b:FinInstrmRptgRefDataRpt/b:RefData/b:FinInstrmGnlAttrbts')
with ( Id [varchar](50) 'b:Id' );

exec sp_xml_removedocument @hDoc;

产生结果:

Id
DE000C3JALS0

HTH。

于 2020-02-23T01:08:30.717 回答