SQL- Juntar múltiplos SELECT de tabelas diferentes em um único resultado.

11/07/2014

0

Boa tarde,
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

Chipp Seven

Responder

Post mais votado

17/07/2014

Ok.

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

Alex Lekao
Responder

Mais Posts

17/07/2014

Alex Lekao

Ola Boa tarde!!!

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.
Responder

17/07/2014

Chipp Seven

Ola Alex,
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!! :(
Responder

18/07/2014

Chipp Seven

Alex,
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!! :)
Responder

18/07/2014

Alex Lekao

Blz.

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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar