我正在SQL Server 2008中工作。在将数据移入我们的星型模式数据之前,我一直负责编写存储过程以对外部数据执行一些数据验证仓库环境。请求的一种类型的测试是从我们的外部事实数据表到我们的维度表的域完整性/引用查找。要做到这一点,我用了以下技术:如何在星型模式中为数据验证设计错误表
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子句将匹配错误的表,我将最终通过SSIS输出移动到列定义。因此,SELECT子句实际上看起来像:
SELECT
primary_key,
'some_column' AS Offending_Column,
'not found in lookup' AS Error_Message,
some_column AS Offending_Value
但是,因为事实表是非常大的,我们要尽量减少,我们必须从中选择的次数。因此,我对每个事实表只是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列将始终为静态,这意味着我不能仅仅通过查看来判断是否有任何列失败。
所以,实际上,我的错误表有一些设计问题。在这种情况下,有没有一种标准的输出到错误表的方法?或者,如果不是,我需要修复哪些内容以使输出可读和有用?