将错误插入SQL Server中XML数据的表中

问题描述 投票:0回答:1

我用于将XML数据插入表CCobro的存储过程不起作用,也不会引发任何错误。我认为这是因为在表中我有Activo列,该列不为null,并且在XML文件中没有该属性。所以也许是问题所在。我不知道如何将XML数据与自己的数据结合在一起。

必须在其中插入数据的表:

CREATE TABLE [dbo].[CCobro](
    [ID] [int] NOT NULL,
    [Nombre] [varchar](100) NOT NULL,
    [TasaInteresMoratorio] [real] NOT NULL,
    [DiaEmisionRecibo] [tinyint] NOT NULL,
    [QDiasVencimiento] [tinyint] NOT NULL,
    [EsImpuesto] [varchar](10) NULL,
    [EsRecurrente] [varchar](10) NULL,
    [EsFijo] [varchar](10) NULL,
    [TipoCC] [varchar](30) NOT NULL,
    [Activo] [bit] NOT NULL,
    CONSTRAINT [PK_Concepto Cobro] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

要插入到CCobro表中的存储过程:

CREATE OR ALTER PROCEDURE [dbo].[spCargarDatosCC]

AS
BEGIN
    SET NOCOUNT ON;

    -- VARIABLES --
    DECLARE @DocHandle int, @temp xml, @CCobro xml

    BEGIN TRY
        --Insercion de los tipos de documentos de identificacion
        SELECT @CCobro = CC
        FROM OPENROWSET (Bulk 'D:\Base de datos\FacturacionMunicipal_BD\Base de Datos\XML\Concepto_de_Cobro.xml', Single_BLOB) AS CCobro(CC)
        EXEC sp_xml_preparedocument @DocHandle OUTPUT, @CCobro

        INSERT INTO CCobro (ID, Nombre, TasaInteresMoratorio, DiaEmisionRecibo, QDiasVencimiento, EsImpuesto, EsRecurrente, EsFijo, TipoCC)
        SELECT *
        FROM OPENXML(@DocHandle, '/Conceptos_de_Cobro/conceptocobro', 1) 
        WITH
        (
            ID int '@id' ,
            Nombre VARCHAR(100) '@Nombre',
            TasaInteresMoratorio real '@TasaInteresMoratoria',
            DiaEmisionRecibo tinyint '@DiaCobro',
            QDiasVencimiento tinyint '@QDiasVencimiento',
            EsImpuesto varchar(10) '@EsImpuesto',
            EsRecurrente varchar(10) '@EsRecurrente',
            EsFijo varchar(10) '@EsFijo',
            TipoCC varchar(30) '@TipoCC'
        )


        EXEC sp_xml_removedocument @DocHandle


    END TRY

    BEGIN CATCH
        return @@ERROR * -1
    END CATCH
 END

在此行中

INSERT INTO CCobro (ID, Nombre, TasaInteresMoratorio, DiaEmisionRecibo, QDiasVencimiento, EsImpuesto, EsRecurrente, EsFijo, TipoCC)

我没有输入Activo列,因为xml没有此属性。但是我想在每次插入新数据时插入1。

xml文件:

<Conceptos_de_Cobro>
    <conceptocobro id="1" Nombre="Agua" DiaCobro="25" QDiasVencimiento="4" EsImpuesto="No" EsRecurrente="Si" EsFijo="No" TasaInteresMoratoria="5.2" TipoCC="CC Consumo" Monto="" ValorM3="500" ValorPorcentaje="" />
    <conceptocobro id="2" Nombre="Patente Licores" DiaCobro="8" QDiasVencimiento="12" EsImpuesto="Si" EsRecurrente="No" EsFijo="No" TasaInteresMoratoria="2.6" TipoCC="CC Fijo" Monto="50000" ValorM3="" ValorPorcentaje="" />
    <conceptocobro id="3" Nombre="impuesto Propiedad" DiaCobro="8" QDiasVencimiento="12" EsImpuesto="Si" EsRecurrente="No" EsFijo="Si" TasaInteresMoratoria="1.5" TipoCC="CC Porcentual" Monto="" ValorM3="" ValorPorcentaje="0.25" />
    <conceptocobro id="4" Nombre="Recolectar Basura" DiaCobro="4" QDiasVencimiento="5" EsImpuesto="No" EsRecurrente="Si" EsFijo="Si" TasaInteresMoratoria="2.2" TipoCC="CC Fijo" Monto="3000" ValorM3="" ValorPorcentaje="" />
    <conceptocobro id="5" Nombre="Mantenimiento de Parques" DiaCobro="3" QDiasVencimiento="7" EsImpuesto="Si" EsRecurrente="Si" EsFijo="Si" TasaInteresMoratoria="0.87" TipoCC="CC Fijo" Monto="970" ValorM3="" ValorPorcentaje="" />
    <conceptocobro id="6" Nombre="Reconexion de Agua" DiaCobro="15" QDiasVencimiento="10" EsImpuesto="No" EsRecurrente="No" EsFijo="Si" TasaInteresMoratoria="3.8" TipoCC="CC Fijo" Monto="780" ValorM3="" ValorPorcentaje="" />
    <conceptocobro id="7" Nombre="Impuesto a la Renta" DiaCobro="5" QDiasVencimiento="15" EsImpuesto="Si" EsRecurrente="Si" EsFijo="No" TasaInteresMoratoria="12.6" TipoCC="CC Porcentual" Monto="" ValorM3="" ValorPorcentaje="0.15" />
    <conceptocobro id="8" Nombre="Mantenimiento de Parques" DiaCobro="7" QDiasVencimiento="6" EsImpuesto="No" EsRecurrente="Si" EsFijo="Si" TasaInteresMoratoria="0.32" TipoCC="CC Fijo" Monto="7850" ValorM3="" ValorPorcentaje="" />
   <conceptocobro id="9" Nombre="Aseo de sitios Publico" DiaCobro="1" QDiasVencimiento="10" EsImpuesto="No" EsRecurrente="Si" EsFijo="Si" TasaInteresMoratoria="7.8" TipoCC="CC Fijo" Monto="580" ValorM3="" ValorPorcentaje="" />
</Conceptos_de_Cobro>
sql-server xml tsql stored-procedures xquery
1个回答
0
投票

保留Microsoft专有OPENXML及其配套文件sp_xml_preparedocumentsp_xml_removedocument只是为了与过时的SQL Server 2000向后兼容。

从SQL Server 2005开始,最好开始使用SQL Server XML数据类型方法和XQuery。因此,存储过程如下:

SQL

CREATE OR ALTER PROCEDURE [dbo].[spCargarDatosCC]
AS
BEGIN
    SET NOCOUNT ON;

    -- VARIABLES --
    DECLARE @CCobro xml

    BEGIN TRY
        --Insercion de los tipos de documentos de identificacion
        SELECT @CCobro = CC
        FROM OPENROWSET (Bulk 'D:\Base de datos\FacturacionMunicipal_BD\Base de Datos\XML\Concepto_de_Cobro.xml', Single_BLOB) AS CCobro(CC)

        INSERT INTO CCobro (ID, Nombre, TasaInteresMoratorio, DiaEmisionRecibo, QDiasVencimiento, EsImpuesto, EsRecurrente, EsFijo, TipoCC, Activo)
        SELECT c.value('@id','INT') AS ID
            , c.value('@Nombre','VARCHAR(100)') AS Nombre
            , c.value('@TasaInteresMoratoria','DECIMAL(10,2)') AS TasaInteresMoratorio
            , c.value('@DiaCobro','TINYINT') AS DiaEmisionRecibo
            , c.value('@QDiasVencimiento','TINYINT') AS QDiasVencimiento
            , c.value('@EsImpuesto','VARCHAR(10)') AS EsImpuesto 
            , c.value('@EsRecurrente','VARCHAR(10)') AS EsRecurrente  
            , c.value('@EsFijo','VARCHAR(10)') AS EsFijo  
            , c.value('@TipoCC','VARCHAR(10)') AS TipoCC
            , 1 AS Activo
        FROM @CCobro.nodes('/Conceptos_de_Cobro/conceptocobro') AS t(c);

    END TRY

    BEGIN CATCH
        return @@ERROR * -1
    END CATCH
 END
© www.soinside.com 2019 - 2024. All rights reserved.