Neste caso precisei verificar em apenas uma tabela que é a pessoa, vc pode adaptar conforme a necessidade, essa consulta nos ajudou muito pois realizamos uma importação de milhares de registros e estes após a importação deveriam ser corrigidos
o interessante é a consulta passando pelas tabelas
RDB$RELATIONS TABELAS,
RDB$RELATION_FIELDS CAMPOS,
RDB$FIELDS DADOSCAMPO,
RDB$TYPES TIPOS
CREATE PROCEDURE SP_PESSOA_INCONSISTENCIA
RETURNS (
OPQTD INTEGER,
OPQTDFINAL INTEGER,
OPTABELA VARCHAR(100),
OPCAMPO VARCHAR(100))
AS
DECLARE VARIABLE VTABELA VARCHAR(100);
DECLARE VARIABLE VCAMPO VARCHAR(100);
DECLARE VARIABLE STRINGSQL VARCHAR(1000);
begin
OPQTD = 0;
OPQTDFINAL = 0;
FOR
SELECT CAMPOS.RDB$RELATION_NAME, CAMPOS.RDB$FIELD_NAME
FROM RDB$RELATIONS TABELAS, RDB$RELATION_FIELDS CAMPOS, RDB$FIELDS DADOSCAMPO, RDB$TYPES TIPOS
WHERE TABELAS.RDB$RELATION_NAME = CAMPOS.RDB$RELATION_NAME AND CAMPOS.RDB$FIELD_SOURCE = DADOSCAMPO.RDB$FIELD_NAME AND
DADOSCAMPO.RDB$FIELD_TYPE = TIPOS.RDB$TYPE AND TIPOS.RDB$FIELD_NAME = ‘RDB$FIELD_TYPE’ AND
TIPOS.RDB$TYPE_NAME = ‘VARYING’ AND TABELAS.RDB$SYSTEM_FLAG = 0
AND CAMPOS.RDB$RELATION_NAME = ‘PESSOA’
ORDER BY CAMPOS.RDB$RELATION_NAME, CAMPOS.RDB$FIELD_NAME
INTO :VTABELA, :VCAMPO
DO
BEGIN
STRINGSQL = ”;
STRINGSQL = ‘ SELECT COUNT(*) FROM ‘ || lTRIM(rtrim(VTABELA));
STRINGSQL = STRINGSQL || ‘ WHERE ( ‘ || lTRIM(rtrim(VCAMPO)) || ‘ LIKE ”” OR ‘ || lTRIM(rtrim(VCAMPO)) || ‘ IS NULL )’;
EXECUTE STATEMENT STRINGSQL INTO :OPQTD;
OPQTDFINAL = OPQTDFINAL + OPQTD;
OPTABELA = LTRIM(RTRIM(VTABELA));
OPCAMPO = LTRIM(RTRIM(VCAMPO));
SUSPEND;
END
end