postgresql 将xml解析从T-SQL迁移到postgres时出现问题

ukxgm1gy  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

我在“迁移”我的查询时遇到了问题,在这个查询中,我解析了一个存储有XML的列,i从T-SQL“迁移”到Postgres,因为我当前的开发需要它。在T-SQL中,这是我当前的查询:
我在T-SQL中的查询,需要一个包含从另一个系统中检索的XML的列,我用“XMLNAMESPACES”为XML创建前缀,然后我执行一个REDUCTION INTO以将查询保存在先前创建的表中,我用子查询“选择”我想要返回的值或“列”,在此之后,我将“XML”列转换为“XML”,它已经在“VARCHAR”中,最后调用.nodes函数返回从查询派生的表

WITH XMLNAMESPACES('http://www.sat.gob.mx/cfd/4' AS cfdi, 
                    'http://www.sat.gob.mx/Pagos20' AS pago20, 
                    'http://www.sat.gob.mx/TimbreFiscalDigital' AS tfd)

INSERT INTO [CFDI_SON990511MI0_RECIBIDOS].[dbo].[DataXml_SON990511MI0_RepsRecibidos_2023] (UUID, DoctoRelacionado, NumParcialidad, ImpPagado, FePago)

SELECT 
        prx4_0.*
FROM
(
    SELECT 
            UUID,
            x.value('(@IdDocumento)', 'NVARCHAR(64)') AS DoctoRelacionado,
            x.value('(@NumParcialidad)', 'TINYINT') AS NumParcialidad,
            x.value('(@ImpPagado)', 'DECIMAL(26, 8)') AS ImpPagado,
            x.value('(/cfdi:Comprobante/@Fecha)[1]', 'DATETIME') AS FePago
    FROM [dbo].[XML]
    
    --El casteo ocurre aqui
    CROSS APPLY(SELECT CAST(XML AS XML)) A(TheXml)

    --Se llama a la funcion .nodes para retornar la tabla derivada de la consulta
    CROSS APPLY TheXml.nodes('/cfdi:Comprobante/cfdi:Complemento/pago20:Pagos/pago20:Pago/pago20:DoctoRelacionado') B(x)
) prx4_0
GO

字符串
这是一个可以复制的XML:

-- DDL and sample data population, start
DECLARE @tbl TABLE (UUID UNIQUEIDENTIFIER PRIMARY KEY, xmldata NVARCHAR(MAX));
INSERT @tbl (UUID, xmldata) VALUES
('AAA1ADA1-9151-4C90-AA62-43590DCC7C81', 
        N'<cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd
            http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd" 
            LugarExpedicion="37480" TipoDeComprobante="P" Total="0" Moneda="XXX" Certificado="MIIG" 
            SubTotal="0" NoCertificado="00001000000504465028" Sello="V1" Fecha="2023-01-09T17:09:53" Version="3.3" 
            xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:pago10="http://www.sat.gob.mx/Pagos">
        <cfdi:Emisor Rfc="CARE891026810" Nombre="MARIA ELIZABETH CHAVEZ RAMIREZ" RegimenFiscal="621"></cfdi:Emisor>
        <cfdi:Receptor Rfc="SON990511MI0" Nombre="SONIGAS SA DE CV" UsoCFDI="P01"></cfdi:Receptor>
        <cfdi:Conceptos>
            <cfdi:Concepto ClaveProdServ="84111506" Cantidad="1" ClaveUnidad="ACT" Descripcion="Pago" ValorUnitario="0" Importe="0"></cfdi:Concepto>
        </cfdi:Conceptos>
        <cfdi:Complemento>
            <pago10:Pagos Version="1.0">
                <pago10:Pago FechaPago="2022-12-27T00:00:00" FormaDePagoP="03" MonedaP="MXN" Monto="31508.65">
                    <pago10:DoctoRelacionado IdDocumento="AAA1D7E6-23AD-44FC-A544-9CB47D9CFCCD" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="999.99" ImpPagado="999.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA124C5-48FC-4409-BB76-8A23BF6318F3" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="6904.91" ImpPagado="6904.91" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA17CA8-222A-4146-A943-58AAFD62C7F3" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="2284.99" ImpPagado="2284.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA111BC-4CE8-4572-8C75-2D673F1ED9F4" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="1800.00" ImpPagado="1800.00" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA1686A-7605-423D-809F-A6EE240E9587" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="3229.99" ImpPagado="3229.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA1783C-A24A-4DC6-8A87-54591E555CCE" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="2599.99" ImpPagado="2599.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA17618-B009-4A80-8C12-CF7F697A512E" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="3167.95" ImpPagado="3167.95" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA1DBB5-B99E-4BFB-AD27-FC249EDEEBCE" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="2972.86" ImpPagado="2972.86" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA19C00-65FB-4E83-9AD7-2EF660694ECF" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="4629.99" ImpPagado="4629.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                    <pago10:DoctoRelacionado IdDocumento="AAA1CD78-9581-4F43-8741-8C9506E26B2C" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="2739.99" ImpPagado="2739.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                </pago10:Pago>
            </pago10:Pagos>
            <registrofiscal:CFDIRegistroFiscal xmlns:schemaLocation="http://www.sat.gob.mx/registrofiscal http://www.sat.gob.mx/sitio_internet/cfd/cfdiregistrofiscal/cfdiregistrofiscal.xsd" Version="1.0" Folio="2301200000009898" xmlns:registrofiscal="http://www.sat.gob.mx/registrofiscal">
            </registrofiscal:CFDIRegistroFiscal>
            <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="AAA1ADA1-9151-4C90-AA62-43590DCC7C81" FechaTimbrado="2023-01-09T17:20:57" RfcProvCertif="SAT970701NN3" SelloCFD="V1cULko9bjPwFcWBsjJbPDHo92KXkK2VT12bxm9F+9XiiD4oNDE3mpLaf4L1iKndhotlcx14MphlBAfRBRm/ue+eR6YAR+v+t3ZLXpD0QzhJzKCF0WSIkt7kDMhJmroYluMs+D2GwELC9t/LxhmjY5k5OyEBoQm75hfD1EpfN+j1MzZrRj/DuLLp4oVnb64/wfwKmJ0BxtsR7Dwpe7Q/SvuR7W3GnuRIqL/gFKBfsH7qW9fP+4owoX2iERCX5RWIt+yVOejOGMPlMzE7pdihEuulq32aGV1AlyZNqKG9FukbOnSqRJnZdqmz/VqufWEC1h7C8S105tCuDGfldyDy4Q==" NoCertificadoSAT="00001000000504465028" SelloSAT="U09+TX0gGO45iDdPi0gN9CttScMvfj5G7OF8biKdijrPIWSNO7PzYdoGauKvOP6UCgW/x8MpRN+TfoVvdVEmpFrQC1jD7dpbAqWTeh+q1Qsb+5dm3lbgHxp3ImHACR7DORIxOadF/1oj6s0t69UGkTmsDOs90uVDsLL8RWf/yKTwRN+PpSdqy3FCHLMMOfZKZM76xjIVPQT6Hl2n8HhtaBTL/CiKb095wHTl/mXfX5u7UNlOoUUsG2wMeo+lJOqf5e0M0cJ4V3t5Cqr8ZhZu6atLDBqTSDpDSbJh1f3H9OLqoOTMgzSLkmU0jA+Q0TdknP7ujhkZPK2c/gJaJO91Cw==" />
        </cfdi:Complemento>
    </cfdi:Comprobante>');
-- DDL and sample data population, end


这是我当前的postgres代码:

WITH
    XMLNAMESPACES AS (
        SELECT 
            'http://www.sat.gob.mx/cfd/3' AS cfdi, 
            'http://www.sat.gob.mx/Pagos' AS pago10, 
            'http://www.sat.gob.mx/TimbreFiscalDigital' AS tfd,
            'http://www.sat.gob.mx/sitio_internet/cfd/cfdiregistrofiscal/cfdiregistrofiscal.xsd' AS registrofiscal)
            
     SELECT 
        "UUID"
        , unnest(xpath('/cfdi:Comprobante/@Serie',"XML"::xml , '{{cfdi, http://www.sat.gob.mx/cfd/3}}')::varchar[]) AS cfd_serie
    from public."Pago_XML";


这是我想要执行查询时得到的错误:

SQL Error [2200M]: ERROR: could not parse XML document¶  Detail: line 1: xmlns:schemaLocation: 'http://www.sat.gob.mx/registrofiscal http://www.sat.gob.mx/sitio_internet/cfd/cfdiregistrofiscal/cfdiregistrofiscal.xsd' is not a valid URI¶p://www.sat.gob.mx/sitio_internet/cfd/cfdiregistrofiscal/cfdiregistrofiscal.xsd"¶


我已经调查了我的表已经在T-SQL中生成,它不给我给予这个错误,它是不可能的,我做一个“URI”的替代,因为该表是从一个提供者.我将非常感谢任何帮助,如果你需要更多的信息,XML,表或查询我可以提供它.
这是我在T-SQL上的实际表,它也是我期望的postgres查询的输出
| UUID| FePago| DoctoRelacionado| NumParcialidad|因帕加多|
| --|--|--|--|--|
| 0009034a-3feb-4b2e-88fa-4605e5c6a7d4| 2023-01-20 12:00:00.000| EE98EEDA-915B-B34D-8FFF-DD7FA49E2490| 1 |287124.3700000|
| 0010D6C2-AB5E-45F5-B8AB-5EE57C79BAE8| 2022-12-28 12:00:00.000| FADF8224-0D47-48E6-B8A4-362861D9EB00| 1 |16923.240万|
| 00157E99-984B-42A0-BA55-D57D76E9155E| 2023-04-26 12:00:00.000| D912107F-C1E9-4078-8F8D-7D954446CF8A| 1 |14160.7000000|
T-SQL版本(SELECT @@VERSION)

version                                                   |
----------------------------------------------------------|
Microsoft SQL Server 2019 (RTM-GDR) (KB5029377) - 15.0.2104.1 (X64)   Aug 16 2023 00:09:21   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19045: ) (Hypervisor)|


Postgres version(SELECT version();)

version                                                   |
----------------------------------------------------------|
PostgreSQL 15.3, compiled by Visual C++ build 1914, 64-bit|

ufj5ltwl

ufj5ltwl1#

XML中的xsi:schemaLocation值不正确。
我不得不把它们从XML中删除。
PostgreSQL XML分解类似于Oracle实现。
dbfiddle

Postres SQL

-- DDL and sample data population, start
CREATE TABLE tbl (ID UUID PRIMARY KEY, xmldata VARCHAR(8192));
INSERT INTO tbl (ID, xmldata) VALUES
('AAA1ADA1-9151-4C90-AA62-43590DCC7C81', 
  '<cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  LugarExpedicion="37480" TipoDeComprobante="P" Total="0"
                  Moneda="XXX" Certificado="MIIG" SubTotal="0"
                  NoCertificado="00001000000504465028" Sello="V1"
                  Fecha="2023-01-09T17:09:53" Version="3.3"
                  xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                  xmlns:pago10="http://www.sat.gob.mx/Pagos">
    <cfdi:Emisor Rfc="CARE891026810" Nombre="MARIA ELIZABETH CHAVEZ RAMIREZ"
                 RegimenFiscal="621"></cfdi:Emisor>
    <cfdi:Receptor Rfc="SON990511MI0" Nombre="SONIGAS SA DE CV" UsoCFDI="P01"></cfdi:Receptor>
    <cfdi:Conceptos>
        <cfdi:Concepto ClaveProdServ="84111506" Cantidad="1" ClaveUnidad="ACT"
                       Descripcion="Pago" ValorUnitario="0" Importe="0"></cfdi:Concepto>
    </cfdi:Conceptos>
    <cfdi:Complemento>
        <pago10:Pagos Version="1.0">
            <pago10:Pago FechaPago="2022-12-27T00:00:00" FormaDePagoP="03"
                         MonedaP="MXN" Monto="31508.65">
                <pago10:DoctoRelacionado IdDocumento="AAA1D7E6-23AD-44FC-A544-9CB47D9CFCCD"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1" ImpSaldoAnt="999.99"
                                         ImpPagado="999.99" ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA124C5-48FC-4409-BB76-8A23BF6318F3"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="6904.91"
                                         ImpPagado="6904.91"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA17CA8-222A-4146-A943-58AAFD62C7F3"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="2284.99"
                                         ImpPagado="2284.99"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA111BC-4CE8-4572-8C75-2D673F1ED9F4"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="1800.00"
                                         ImpPagado="1800.00"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA1686A-7605-423D-809F-A6EE240E9587"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="3229.99"
                                         ImpPagado="3229.99"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA1783C-A24A-4DC6-8A87-54591E555CCE"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="2599.99"
                                         ImpPagado="2599.99"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA17618-B009-4A80-8C12-CF7F697A512E"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="3167.95"
                                         ImpPagado="3167.95"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA1DBB5-B99E-4BFB-AD27-FC249EDEEBCE"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="2972.86"
                                         ImpPagado="2972.86"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA19C00-65FB-4E83-9AD7-2EF660694ECF"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="4629.99"
                                         ImpPagado="4629.99"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
                <pago10:DoctoRelacionado IdDocumento="AAA1CD78-9581-4F43-8741-8C9506E26B2C"
                                         MonedaDR="MXN" MetodoDePagoDR="PPD"
                                         NumParcialidad="1"
                                         ImpSaldoAnt="2739.99"
                                         ImpPagado="2739.99"
                                         ImpSaldoInsoluto="0"></pago10:DoctoRelacionado>
            </pago10:Pago>
        </pago10:Pagos>
        <registrofiscal:CFDIRegistroFiscal Version="1.0"
                                           Folio="2301200000009898"
                                           xmlns:registrofiscal="http://www.sat.gob.mx/registrofiscal">
        </registrofiscal:CFDIRegistroFiscal>
        <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital"
                                 Version="1.1"
                                 UUID="AAA1ADA1-9151-4C90-AA62-43590DCC7C81"
                                 FechaTimbrado="2023-01-09T17:20:57"
                                 RfcProvCertif="SAT970701NN3"
                                 SelloCFD="V1cULko9bjPwFcWBsjJbPDHo92KXkK2VT12bxm9F+9XiiD4oNDE3mpLaf4L1iKndhotlcx14MphlBAfRBRm/ue+eR6YAR+v+t3ZLXpD0QzhJzKCF0WSIkt7kDMhJmroYluMs+D2GwELC9t/LxhmjY5k5OyEBoQm75hfD1EpfN+j1MzZrRj/DuLLp4oVnb64/wfwKmJ0BxtsR7Dwpe7Q/SvuR7W3GnuRIqL/gFKBfsH7qW9fP+4owoX2iERCX5RWIt+yVOejOGMPlMzE7pdihEuulq32aGV1AlyZNqKG9FukbOnSqRJnZdqmz/VqufWEC1h7C8S105tCuDGfldyDy4Q=="
                                 NoCertificadoSAT="00001000000504465028"
                                 SelloSAT="U09+TX0gGO45iDdPi0gN9CttScMvfj5G7OF8biKdijrPIWSNO7PzYdoGauKvOP6UCgW/x8MpRN+TfoVvdVEmpFrQC1jD7dpbAqWTeh+q1Qsb+5dm3lbgHxp3ImHACR7DORIxOadF/1oj6s0t69UGkTmsDOs90uVDsLL8RWf/yKTwRN+PpSdqy3FCHLMMOfZKZM76xjIVPQT6Hl2n8HhtaBTL/CiKb095wHTl/mXfX5u7UNlOoUUsG2wMeo+lJOqf5e0M0cJ4V3t5Cqr8ZhZu6atLDBqTSDpDSbJh1f3H9OLqoOTMgzSLkmU0jA+Q0TdknP7ujhkZPK2c/gJaJO91Cw=="/>
    </cfdi:Complemento>
</cfdi:Comprobante>');
-- DDL and sample data population, end

SELECT ID, t.* 
FROM tbl
  , XMLTABLE(
        xmlnamespaces('http://www.sat.gob.mx/cfd/3' as "cfdi",
            'http://www.sat.gob.mx/Pagos' as "pago10"),
       '/cfdi:Comprobante/cfdi:Complemento/pago10:Pagos/pago10:Pago/pago10:DoctoRelacionado'
       PASSING XMLPARSE(DOCUMENT tbl.xmldata)
       COLUMNS 
               IdDocumento varchar(64) PATH '@IdDocumento',
             NumParcialida int         PATH '@NumParcialidad'
) as t;

字符串

输出

| ID|识别文件|纽帕恰利达|
| --|--|--|
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA1D7E6-23AD-44FC-A544-9CB47D9CFCCD| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA124C5-48FC-4409-BB76-8A23BF6318F3| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA17CA8-222A-4146-A943-58AAFD62C7F3| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA111BC-4CE8-4572-8C75-2D673F1ED9F4| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA1686A-7605-423D-809F-A6EE240E9587| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA1783C-A24A-4DC6-8A87-54591E555CCE| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA17618-B009-4A80-8C12-CF7F697A512E| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA1DBB5-B99E-4BFB-AD27-FC249EDEEBCE| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA19C00-65FB-4E83-9AD7-2EF660694ECF| 1 |
| aaa1ada1-9151-4c90-aa62-43590dcc7c81| AAA1CD78-9581-4F43-8741-8C9506E26B2C| 1 |

相关问题