sql-server - 在 SQL Server 中使用 XML 数据插入表时出错
问题描述
我将 XML 中的数据插入表 CCobro 的存储过程不起作用,也不会引发任何错误。我认为这是因为在表中我有列 Activo,它不为空,而在 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)
我没有输入 Activivo 列,因为 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>
解决方案
Microsoft 专有OPENXML
及其伙伴sp_xml_preparedocument
,sp_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
推荐阅读
- java - 为 Spring 指定 log4j appender
- google-apps-script - 如何使用带有事件的谷歌应用脚本将单个行中的特定列从一个谷歌电子表格复制到另一个谷歌电子表格?
- html - Hover image is much larger than original image
- python-3.x - FailedPreconditionError:从容器读取资源变量dense_95/kernel时出错:localhost
- jenkins - 如何以及在哪里使用 Jenkins 在 VPS 上部署 nodejs 代码?
- java - 刷新活动后未调用 onProgressUpdate
- c++ - C ++迭代类
- docker - Docker 在运行命令中挂载 CIFS
- discord - 如何从数字中创建包含一定数量字段的嵌入?
- python - 为什么我的代码只返回“退出状态:0”?