Cenário
Eu tenho um banco de dados que contém todos os dados de nossos clientes, que são separados por Esquemas. Por exemplo:
Customer1 = Schema1,
Customer2 = Schema2,
Customer3 = Schema3,
etc...
Às vezes, temos um problema em que um valor de data em uma tabela às vezes é NULL. Esta tabela está contida em cada Schema, mas às vezes pode ser chamada de 'Tasks', 'Tasks_NEW' ou 'Task_NEW' (tem que amar consistência).
Estou procurando uma maneira de executar dinamicamente uma instrução SELECT que retornará uma contagem de todos os valores de data NULL, em todas as tabelas e todos os esquemas.
Até agora, fiz isso para colocar o Schema, mais a Tabela em uma TempTable;
CREATE TABLE #TASK_TABLES
( ID INT IDENTITY(1,1),
TenantID INT,
TableName NVARCHAR(255) )
INSERT INTO #TASK_TABLES
SELECT TABLE_SCHEMA, TABLE_NAME
FROM [Dynamic].INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME IN ('Tasks', 'Task_NEW', 'Tasks_NEW')
ORDER BY TABLE_SCHEMA
Agora que tenho essas informações, quero percorrê-las com um SELECT como este;
SELECT Schema, COUNT(Date)
FROM [Dynamic].[Schema].[Table] (NOLOCK)
WHERE DATE IS NULL
Infelizmente, não sei como escrever SQL dinâmico, pois ainda estou aprendendo, mas esperava que alguém pudesse me indicar a direção certa?
Abaixo segue o código autoexplicativo. Alternativamente, você pode usar sp_ineachdb (escrito por Aaron Bertrand) .
Eu tenho uma abordagem um pouco diferente para esse tipo de seleção dinâmica.
Primeiro, crie todas as instruções SELECT que você deseja fazer e coloque-as em uma variável de tabela temporária / tabela temporária
Em seguida, concatene todos os comandos em uma string, colocando UNION ou UNION ALL entre cada comando, assim:
Por fim, execute o comando:
Isso remove cursores e outras construções de loop de seu SQL.