quinta-feira, 3 de novembro de 2016

Como excluir itens duplicados em bases de dados Firebird.

Neste exemplo vamos usar uma tabela chamada "duplicado".


DDL para criação da tabela:


CREATE TABLE duplicado(
  id      INTEGER,
  codigo  INTEGER,
  senha   INTEGER,
  nome    VARCHAR(100)
);


Inserção de dados na tabela


INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(1,1,1,'Lucas');

INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(2,2,2,'Yudi');

INSERT INTO duplicado (id, codigo, senha, nome)
   VALUES(3,1,2,'João');


Verificar os dados que foram inseridos:


SELECT * FROM duplicado;



Os códigos dos registros 1 e 3 estão duplicados(valor = 1), abaixo temos uma consulta para verificar os dados que estão duplicados:


SELECT codigo, Count(*) FROM duplicado
  GROUP BY codigo
  HAVING Count(*) > 1;



Encontramos o código 1 por duas vezes.




Bloco de execução para encontrar e deletar os dados duplicados:


EXECUTE block AS

     DECLARE variable var_id int;

     DECLARE variable var_codigo int;

  BEGIN
    for
    SELECT max(id) AS id, codigo
      FROM duplicado
         GROUP BY codigo
      HAVING count(*) > 1
      INTO :var_id,:var_codigo

         do DELETE FROM duplicado
      WHERE id = :var_id
        AND codigo = :var_codigo;
      end


Novamente a consulta para encontrar os dados duplicados:


SELECT codigo, Count(*) FROM duplicado
   GROUP BY codigo
   HAVING Count(*) > 1;



O retorno da consulta agora é nulo.



Consulta em todos os registros da tabela:


SELECT * FROM duplicado;





O registro com o "id" 3 que tinha o mesmo código do registro com "id" 1 foi deletado, para excluir itens com chaves mais complexas basta adicionar novas variáveis ao bloco de execução.

quinta-feira, 18 de agosto de 2016

Analisando discos do servidor

Como descobrir o tamanho do disco, quanto está sendo usado e quanto temos ainda disponível? Abaixo segue uma consulta que nos entrega todas estas informações e qual a porcentagem disponível para cada uma das unidades:

SELECT DISTINCT

SUBSTRING(volume_mount_point, 1, 1) AS [Unidade]

,cast((cast(total_bytes as float)/1024/1024/1024) as numeric(20,2)) AS [Tamanho(GB)]

,cast((cast(available_bytes as float)/1024/1024/1024) as numeric(20,2)) AS [Disponível(GB)]

,ISNULL(ROUND(available_bytes / CAST(NULLIF(total_bytes, 0) AS FLOAT) * 100, 2), 0) as [Porcentagem disponível]

FROM

sys.master_files AS f

CROSS APPLY

sys.dm_os_volume_stats(f.database_id, f.file_id)

order by 1


Resultado


terça-feira, 2 de agosto de 2016

Alterando tipos de dados


Como alterar um tipo de dado definido pelo usuário(UDT):


  1. Adicionar o novo tipo

  2. Alterar as colunas para o novo tipo

  3. Excluir o tipo antigo

  4. Renomear o novo tipo criado.



/* Adiciona um novo UDT com a nova definição */

exec sp_addtype NOVO_TIPO_tmp, 'float', 'NOT NULL'


/* Execute a consulta abaixo copie, cole e execute */

select 'alter table dbo.' + TABLE_NAME +

' alter column ' + COLUMN_NAME + ' NOVO_TIPO_tmp'

from INFORMATION_SCHEMA.COLUMNS

where DOMAIN_NAME = 'MEU_TIPO'


/* Remove o UDDT antigo */

exec sp_droptype MEU_TIPO


/* Altera o nome UDT temporario para o correto */

exec sp_rename 'NOVO_TIPO_tmp', 'MEU_TIPO', 'USERDATATYPE'

sexta-feira, 17 de junho de 2016

Como encontra uma coluna em um banco de dados?

  Como encontrar uma coluna em várias tabelas do banco de dados? No exemplo abaixo buscamos a coluna em todas as tabelas do banco de dados.

Consulta:

SELECT t.name AS Tabela, c.name AS Coluna

FROM sys.sysobjects t with (NOLOCK)

JOIN sys.all_columns c with (NOLOCK) ON t.id = c.object_id AND t.xtype = 'U'

WHERE

c.name LIKE '%Person%'

ORDER BY

t.name ASC


Saída:



  Notamos que tivemos como resultado colunas que tem em parte do seu nome a palavra "Person" oriundas de cinco tabelas diferentes.

Os teste foram realizados utilizando o banco de dados de exemplo "AdventureWorks2014".