如何为星型模式中的数据验证设计错误 table

How to design an errors table for data validations in a star schema

我在 SQL Server 2008 中工作。我的任务是编写一个存储过程,以便在将外部数据移入我们的星型模式数据仓库环境之前对外部数据进行一些数据验证。请求的一种类型的测试是从我们的外部事实数据 tables 到我们的维度 tables 的域完整性/参考查找。为此,我使用了以下技术:

SELECT
some_column
FROM some_fact_table
LEFT JOIN some_dimension_table
ON
some_fact_table.some_column = some_dimension_table.lookup_column
WHERE
some_fact_table.some_column IS NOT NULL
AND
some_dimension_table.lookup_column IS NULL

SELECT 子句将匹配错误 table 的列定义,我最终将通过 SSIS 将输出移动到该错误中。所以,SELECT 子句实际上看起来像:

SELECT
primary_key,
'some_column' AS Offending_Column,
'not found in lookup' AS Error_Message,
some_column AS Offending_Value

但是,由于 table 非常大,我们希望尽量减少从中 select 的次数。因此,我对每个事实 table 只有 1 个查询来检查有问题的每一列,它看起来像:

SELECT
primary_key,
'col1|col2|col3' AS Potentially_Offending_Columns,
'not found in lookup|not found in lookup|not found in lookup' AS Error_Messages,
col1 + '|' + col2 + '|' + col3 AS Potentially_Offending_Values
FROM fact_table
LEFT JOIN dim_table1
ON
fact_table.col1 = dim_table1.lookup_column
LEFT JOIN dim_table2
ON
fact_table.col2 = dim_table2.lookup_column
LEFT JOIN dim_table3
ON
fact_table.col2 = dim_table3.lookup_column
WHERE
dim_table1.lookup_column IS NULL
OR
dim_table2.lookup_column IS NULL
OR
dim_table3.lookup_column IS NULL

这有一些问题。 (1) 如果任何源列行为空,则 Offending_Values 中的字符串连接将导致 NULL。如果我用 ISNULL 包装每一列(并将空值换成类似空字符串的东西),那么我将无法判断测试失败是因为源中的真正空字符串还是被换成空字符串细绳。 (2) 如果只有其中一列在查找中失败,则错误消息仍将显示为 'not found in lookup|not found in lookup|not found in lookup',即,我无法判断哪一列实际上失败了。 (3) 输出中的 Potentially_offending_Columns 列将始终是静态的,这意味着我无法仅通过查看来判断是否有任何列失败。

因此,实际上,我的错误存在一些设计问题 table。在这种情况下是否有输出错误 table 的标准方法?或者,如果不是,我需要修复什么才能使输出可读且有用?

我不知道您的数据是什么样的,但是您不能使用带 ISNULL 的空字符串,而是 return 单词 FAIL 或对您有意义的内容。您可以为 'not found in lookup' 列做一个 CASE WHEN。

CASE WHEN Col1 IS NULL THEN 'not found in lookup' ELSE '' END + '|' +
CASE WHEN Col2 IS NULL THEN 'not found in lookup' ELSE '' END + '|' +
CASE WHEN Col3 IS NULL THEN 'not found in lookup' ELSE '' END  AS Error_Messages,
ISNULL(col1,'FAIL') + '|' + ISNULL(col2,'FAIL') + '|' + ISNULL(col3,'FAIL')  AS Potentially_Offending_Values