Я работаю в 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 на выходе всегда будет статичным, что означает, что я не могу сказать, не удался ли какой-либо из столбцов, посмотрев на него.
Итак, у меня есть некоторые проблемы с дизайном с моей таблицей ошибок. Существует ли стандартный способ вывода в таблицу ошибок в этой ситуации? Или, если нет, что мне нужно исправить, чтобы сделать вывод понятным и полезным?