2015-07-20 12 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 
primary_key, 
'some_column' AS Offending_Column, 
'not found in lookup' AS Error_Message, 
some_column AS Offending_Value 

Но поскольку таблицы фактов очень большие, мы хотим, чтобы свести к минимуму количество раз, что мы должны выбрать из него. Таким образом, у меня есть только один запрос для каждой таблицы фактов, чтобы проверить каждый столбец в вопросе, который выглядит примерно так:

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) Если какая-либо из строк исходного столбца равна null, то конкатенация строк в 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 КОГДА для столбца «не найден в поиске».

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