SQL- Juntar múltiplos SELECT de tabelas diferentes em um único resultado.
11/07/2014
0
Preciso juntar o resultado de 3 tabelas em uma nova VIEW, porem não todo o conteúdo das tabelas, apenas algumas colunas onde apliquei uma condição CASE.
Aqui tenho a VIEW com a primeira tabela já com a condição CASE.
CREATE VIEW Auditar01 AS SELECT name AS DatabaseName, (size*8) / 1024 AS SizeMB, --Coloca Size em MB (growth*8) / 1024 AS GrowthMB, is_percent_growth AS GrowPercent, physical_name AS PhysicalName, CASE WHEN is_percent_growth=1 THEN '1' WHEN size>25600 and growth<1920 THEN '1' --Quando a taxa de for baixa para tamanho do banco = 1 WHEN Size>640000 and growth<500 THEN '1' --Quando a taxa de for baixa para tamanho do banco = 1 ELSE '0' END AS Caso FROM sys.master_files GO
[img]http://arquivo.devmedia.com.br/forum/imagem/376980-20140711-153859.jpg[/img]
Agora quero acrescentar mais 2 SELECT de duas outras tabelas na mesma VIEW Com colunas especificas.
Da tabela (msdb.dbo.backupset) quero acrescentar a coluna (backup_finish_date) e (backupset.recovery_model),
Da tabela (msdb.dbo.restorehistory) quero acrescentar a coluna (restore_date)
Então eu tentei assim:
ALTER VIEW Auditar01 AS SELECT sys.master_files.name AS DatabaseName, (sys.master_files.size*8) / 1024 AS SizeMB, (sys.master_files.growth*8) / 1024 AS GrowthMB, sys.master_files.is_percent_growth AS GrowPercent, sys.master_files.physical_name AS PhysicalName, msdb.dbo.backupset.backup_finish_date AS UltimoBackup, msdb.dbo.backupset.recovery_model AS TipoDeBackup, msdb.dbo.restorehistory.restore_date AS UltimoRestore, CASE WHEN is_percent_growth=1 THEN '1' WHEN size>25600 and growth<1920 THEN '1' WHEN Size>640000 and growth<500 THEN '1' ELSE '0' END AS Caso FROM sys.master_files, msdb.dbo.backupset, msdb.dbo.restorehistory GO
Nesse caso ele funciona porem quando aplico em um servidor que nunca tenha feito um backup ou restore, as tabelas de msdb.dbo.backupset e msdb.dbo.restorehistory estão vazias e quando acontece isso minha VIEW retorna com todos os campos em branco, mesmo os campos do SELECT na tabela sys.master_files onde deveria voltar pelo monos os nomes dos bancos.
Quando o servidor já realizou um bkp e restore tudo funciona corretamente.
[img]http://arquivo.devmedia.com.br/forum/imagem/376980-20140711-160348.jpg[/img]
Já tentei usar UNION e JOIN. Mas não consigo com q ele retorne a consulta SELECT apenas com as colunas que preciso.
Preciso que retorne os 3 SELECT com apenas as colunas especificas, unindo resultados duplicados e sem afetar minha condição CASE!!
Alguém pode dar uma ajudinha? vlz!!
Chipp Seven
Post mais votado
17/07/2014
Compreendi o que vc esta querendo, mas vc ja chegou a dar uma procurada na internet?
tem um cara que disponibilizou os script ja pronto que faz uma monitoria praticamente completa dos bancos de dados, dependendo a solucao ja esta pronta, vc so precisara pegar as colunas que vc quer.
Eu por exemplo, usei parte para receber e-mails diários dos backups que foram feitos e as datas, no meu caso extremamente simples.
Se interessar, segue codigo:
USE msdb; --Enviando um e-mail simples EXECUTE AS USER = 'dbo' EXEC sp_send_dbmail @profile_name = 'DBA SQL Server', @recipients = 'suporte@suporte.com.br', @body = 'Monitoria do Ultimo BackUp realizado e usuario informado na Rotina de BackUp. ', @subject = 'Monitoria de Backup', @query = 'SELECT T1.Name As [Nome da Base] ,Coalesce(Convert(varchar(12), MAX(T2.Backup_Finish_Date), 103),''Nao Feito BackUp'') As [Data do Ultimo BackUp] ,Coalesce(Convert(varchar(12), MAX(T2.User_Name), 103), ''NA'') As [Nome do Usuario] FROM sys.sysdatabases T1 LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.Database_Name = T1.Name GROUP BY T1.Name ORDER BY T1.Name', @attach_query_result_as_file = 0--, -- @query_result_separator=';', -- @query_result_header=1, -- @query_attachment_filename='Planilha de Produtos Atualizada.csv'
Dependendo do que vc esta fazendo, tera que utilizar subselects, assim vc ja cria as colunas.
Agora preciso acrescentar mais 3 colunas:
Da tabela (msdb.dbo.backupset) quero acrescentar a coluna (backup_finish_date) e (backupset.recovery_model),
Da tabela (msdb.dbo.restorehistory) quero acrescentar a coluna (restore_date)
Agora vem o pior, rsrs!!
Estou querendo essas informações sem repetir os nomes das bases.
Espero ter ajudado.
Abraco.
P.S.: Qqr coisa me manda e-mail e tal que seu eu souber de algo mais posso ir te ajudando por email que pode ser mais facil, ou por skype.
alex_linhares_es@yahoo.com.br
Alex Lekao
Mais Posts
17/07/2014
Alex Lekao
Desculpe, mas nao entendi muito bem.
Sugiro vc fazer o seguinte para ver se ajuda.
SELECT CAMPO1, CAMPO2, CASO FROM ( COLOQUE AGORA OS SEUS SELECTS COM UNION OU JOIN ETC. ) AS REL(AQUI PODE SER QQR NOME) DAQUI PARA BAIXO VC PODE USAR GROUP BY, ORDER BY, O QUE VC QUISER.
teste e me diga se deu certo ou se atendeu a sua necessidade.
Abraco.
17/07/2014
Chipp Seven
Ficou meio confuso mesmo, vou tentar explicar melhor,
Preciso fazer um relatório dos bancos de um servidor contendo informações especificas,
Essas informações eu encontrei em três tabelas do SQL
SELECT * FROM sys.master_files SELECT * FROM msdb.dbo.backupset SELECT * FROM msdb.dbo.restorehistory
Preciso criar uma unica view contendo colunas especificas destas 3 tabelas, para importar por um outro programa posteriormente.
Criei uma view que está funcionando direitinho: (Auditar01) que aparece na primeira imagem.
Ela contem 5 colunas da tabela sys.master_files. (name, size, growth, is_percent_growth e physical_name)
Agora preciso acrescentar mais 3 colunas:
Da tabela (msdb.dbo.backupset) quero acrescentar a coluna (backup_finish_date) e (backupset.recovery_model),
Da tabela (msdb.dbo.restorehistory) quero acrescentar a coluna (restore_date)
Agora vem o pior, rsrs!!
Estou querendo essas informações sem repetir os nomes das bases.
Tive algum progresso.
A primeira view eu mantive com estava só mudei o nome. (TamanhoDatabases1)
create VIEW TamanhoDatabases1 AS SELECT name AS DatabaseName, (size*8) / 1024 AS SizeMB, (growth*8) / 1024 AS GrowthMB, is_percent_growth AS GrowPercent, physical_name AS PhysicalName, CASE WHEN is_percent_growth=1 THEN '1' WHEN size>25600 and growth<1920 THEN '1' WHEN Size>640000 and growth<500 THEN '1' ELSE '0' END AS Caso FROM sys.master_files GO
---------
Então criei uma segunda view p/ remover os nomes duplicados das bases (TamanhoDatabases2)
CREATE VIEW TamanhoDatabases2 AS SELECT backup_set_id, media_set_id, database_name, backup_finish_date, recovery_model FROM msdb.dbo.backupset WHERE backup_set_id IN (select max(backup_set_id) FROM msdb.dbo.backupset group by all database_name) GO
----------
E uma terceira view p/ unir as duas (TamanhoDatabases3)
create view TamanhoDatabases3 AS SELECT * FROM TamanhoDatabases1 INNER JOIN TamanhoDatabases2 ON TamanhoDatabases1.DatabaseName = TamanhoDatabases2.database_name GO
Agora preciso adicionar a coluna (restore_date da tabela) da tabela (msdb.dbo.restorehistory) nessa view: (TamanhoDatabases3)
Estou tentando usar a referencia da coluna (backup_set_id) que tem nas duas tabelas mas como sou novato no sql estou tendo muitaaa dificuldades!! :(
18/07/2014
Chipp Seven
Cara eu tinha procurado na net sim! mas não encontrei o que precisava, talvez por não usar as palavras corretas na pesquisa do google.
As que encontrei não consegui fazer funcionar corretamente.
A minha maior dificuldade é pq preciso um resultado único e bem limbo sem outros campos desnecessários pois esse resultado será importado por um programa sem opções de filtro.
Essa query que vc postou é Muitoooo boa!!! Vou adequar ela p/ usar aqui!!
Muito obrigado cara!! :)
18/07/2014
Alex Lekao
Mas vc vai continuar tentando montar a estrutura que vc mencionou acima ou vai substituir pelo que te passei?
Da uma olhada neste link que tem algumas informacoes sobre monitoria de banco de dados e resultado por email.
[url]http://certificacaobd.com.br/2012/08/07/script-relatrio-dirio-via-e-mail-de-instncias-sql-server/[/url]
Se nao me engano o script que te passei usei uma parte do que tem neste link, faz bastante tempo que usei. rsrsr
Espero que ajude.
Se precisar de mais alguma coisa da um toque para vermos o que conseguimos.
Abraco.
Clique aqui para fazer login e interagir na Comunidade :)