Digamos que eu tenha três tabelas ou quatro tabelas que desejo verificar se há valores presentes e não quero que nenhuma delas seja nula. SE forem nulos, enviarei uma notificação por e-mail por linha. Qual seria a melhor maneira de fazer isso? Devo fazer um procedimento armazenado com instruções IF separadamente?
Digo isso porque todas essas tabelas não têm restrições, apenas extraem dados de uma planilha do Excel. Portanto, criar uma variável de tipo de tabela e união ou junção interna não retorna nada, pois até mesmo os nomes das colunas são diferentes, mas as informações que elas armazenam são o mesmo tipo de informação. Assim, por exemplo, se em uma tabela existe uma coluna chamada 'DueDate', na outra tabela, esse mesmo tipo de informação é chamada 'PaymentDate'. Como eu executaria tal verificação em todas essas tabelas?
Atualização: aqui está o que pensei até agora: digamos que as duas tabelas sejam A e B, então
DECLARE @messageBody NVARCHAR(MAX)
DECLARE @iterator int
DECLARE @Rowcount int
DECLARE @varTableA TABLE(tablecounter int IDENTITY(1,1), DueDate date, Account NVARCHAR(20), Retailer NVARCHAR(20), Interest float)
INSERT INTO @varTableA (DueDate, Account, Retailer, Interest)
SELECT DueDate, Account, Retailer, Interest
FROM TableA
WHERE DueDate IS NULL OR Account IS NULL OR Retailer IS NULL OR Interest IS NULL
SET @Rowcount = @@ROWCOUNT
SET @iterator = 1
WHILE(@iterator <= @Rowcount)
BEGIN
SET @messageBody = (SELECT 'No values in following columns' + 'Duedate: ' + ISNULL(Duedate, 'No value') + CHAR(10) + CHAR(13)
+ 'Account: ' + ISNULL(Account, 'No value') + CHAR(10) + CHAR(13)
+ 'Retailer: ' + ISNULL(Retailer, 'No Value') + CHAR(10) + CHAR(13)
+ 'Interest: ' + ISNULL(Interest, 'No Value') + CHAR(10) + CHAR(13)
FROM @varTableA
WHERE @tablecounter = @iterator)
EXEC msdb.dbo.sp_send_dbmail @profilename = [name], @recipients = [reclist], @subject = [sub], @body = @messageBody
SET @iterator = @iterator + 1
END
E para repetir isso no mesmo ou em um procedimento armazenado separado para TableB e Table C. Existe uma maneira melhor de fazer isso ou você acha que estou fazendo isso da maneira certa?
Para a parte 1 da sua pergunta , criei essas três tabelas em um banco de dados vazio:
Então eu escrevi este código para extrair vários bits de
NULL
informação:Agora um pouco de SQL dinâmico derivado de metadados:
Resultados:
Vou deixar como exercício para o leitor como enviar um e-mail com base nesses resultados - essa não parece ser exatamente a parte mais difícil.
Para a parte 2 da sua pergunta , como eu disse em um comentário:
Eu diria que esta é uma pergunta diferente e sem resposta.
A maioria das operações em um NULL retornará NULL. Você pode usar isso para recolher todos os valores de coluna em um único valor que é NULL se uma ou mais colunas forem NULL.
Esta solução executará uma única verificação de tabela em cada tabela uma vez por execução. A saída será uma lista dos IDs de linha que possuem um ou mais valores NULL. Presumo que você deva ter uma coluna de chave primária não anulável. Caso contrário, como você indicaria ao destinatário do e-mail qual linha estava com problemas?
Veja a resposta de Aaron sobre como você pode construir isso dinamicamente em tempo de execução nas tabelas do sistema.
Seu e-mail de amostra informa ao destinatário exatamente quais colunas são NULL. Eu sacrifico isso por uma consulta mais compacta. Depois que o usuário abre os dados em um editor e navega até a chave indicada, deve ficar claro quais colunas contêm NULL.