我对之前的问题表示歉意;我希望现在好多了。这是我在 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;
基于 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 任务,以确保未知成员存在,并且它将运行如上所述的幂等语句。