2015-07-20 71 views
0

我正在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列将始终为静态,这意味着我不能仅仅通过查看来判断是否有任何列失败。

所以,实际上,我的错误表有一些设计问题。在这种情况下,有没有一种标准的输出到错误表的方法?或者,如果不是,我需要修复哪些内容以使输出可读和有用?

回答

0

我不知道你的数据是什么样子的,但是不是用ISNULL使用空字符串,而是不能返回单词FAIL或对你有意义的东西。你可以做一个案例,当你的'查找'找不到'。

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