错误:Carga Tabla Hecho 处的 0xC0209029,OLE DB 目标 [2]:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “OLE DB 目标。In

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

我对之前的问题表示歉意;我希望现在好多了。这是我在 ETL 项目中面临的问题:在表中,当使用 isnull 并将其设置为 0 时,它给了我这个问题。显然,如果我使用任何其他数字,例如 1(这是现有示例),则在激活“检查约束”选项的情况下运行不会出现问题。

这是日志提供的错误。

错误:Carga Tabla Hecho 处的 0xC0202009,OLE DB 目标 [2]:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。

OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“该语句已终止。”。

OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“INSERT 语句与 FOREIGN KEY 约束“fk_facventas_dimempleados”冲突。冲突发生在数据库“BikeZ_DW”、表“dbo.dimempleados”、列“iddimempleado”中。 ”.

查询代码。

SELECT 
    temp.DetalleVentaID, t.iddimtiempo, c.iddimcliente,  
    ISNULL(iddimempleado,0) AS iddimempleado, te.iddimterritorio, 
    p.iddimproducto, temp.Cantidad, temp.PrecioUnitario 
FROM 
    (SELECT
         d.DetalleVentaID, cantidad, precioUnitario, fecha, 
         clienteID, COALESCE(vendedorID,0) AS vendedor_ID, 
         v.territorioID, ProductoID       
     FROM 
         ventas v 
     JOIN 
         DetalleVentas d ON (v.ventaid = d.ventaid)) temp          
JOIN 
    BikeZ_DW.dbo.dimtiempo t ON (temp.fecha = t.fecha)       
JOIN 
    BikeZ_DW.dbo.dimcliente c ON (temp.clienteID = c.idcliente)       
LEFT JOIN 
    BikeZ_DW.dbo.dimempleados e ON (temp.vendedor_ID = e.idempleado)       
JOIN 
    BikeZ_DW.dbo.dimterritorio te ON (temp.territorioID = te.idterritorio)       
JOIN 
    BikeZ_DW.dbo.dimproducto p ON (temp.productoID = P.IDPRODUCTO) 

DW数据库的部分代码。

CREATE TABLE dimempleados (
    iddimempleado   INT IDENTITY(1,1) NOT NULL,
    idempleado      INT NOT NULL,
    genero          VARCHAR(1) NULL
    PRIMARY KEY (iddimempleado) );

CREATE TABLE facventas (
    idfactventas                    INT IDENTITY(1,1) NOT NULL,
    monto                           Money NULL,
    cantidad                        INT NULL,
    dimtiempo_iddimtiempo           INT NOT NULL,
    dimempleados_iddimempleado      INT NOT NULL,
    dimproducto_iddimproducto       INT NOT NULL,
    dimterritorio_iddimterritorio   INT NOT NULL,
    dimcliente_iddimcliente         INT NOT NULL,
    PRIMARY KEY (idfactventas,dimempleados_iddimempleado,dimterritorio_iddimterritorio, dimcliente_iddimcliente, dimproducto_iddimproducto, dimtiempo_iddimtiempo)
);

ALTER TABLE facventas
ADD CONSTRAINT fk_facventas_dimempleados
    FOREIGN KEY (dimempleados_iddimempleado)
    REFERENCES dimempleados(iddimempleado)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;
sql-server ssis etl
1个回答
0
投票

基于 AlwaysLearning 观察,当未找到员工 ID 时,您的 ISNULL 检查将生成零。您的事实表 (ventas) 和维度 (empleados) 之间有一个外键引用。

员工维度的定义指定它是一种以一为种子的身份。因此,您需要确保您有一个未知的成员。类似的东西

-- Add our unknown member if it does not already exist
SET IDENTITY_INSERT dbo.dimempleados ON;
INSERT INTO 
    dbo.dimempleados(iddimempleado, idempleado, genero) 
SELECT X.* 
FROM 
    (
        VALUES(0, 0, 'U') 
    )AS X(iddimempleado, idempleado, genero) 
WHERE 
    NOT EXISTS 
    (
        SELECT * 
        FROM dbo.dimempleados AS D 
        WHERE D.idempleados = X.idempleados
    );

SET IDENTITY_INSERT dbo.dimepleados OFF;

我会在包的开头有一个执行 SQL 任务,以确保未知成员存在,并且它将运行如上所述的幂等语句。

© www.soinside.com 2019 - 2024. All rights reserved.