Uso do Merge SQL Server

Standard

Segue abaixo uma dica do meu amigo Jord Johnsons, sobre o uso do recurso MERGE do SQL server, ele fez um exemplo bem didático para que fosse simples de entender e ver na prática funcionando, eu acrescentei os comentários explicativos ao lado dos comandos para facilitar a compreensão deste interessante recurso:

/*
UTILIZANDO O RECURSO DE MERGE COM O T-SQL
*/
-- Criando as tabelas temporárias
CREATE TABLE ##TBL_A
(
ID INT,
DESCRICAO VARCHAR(100)
)
GO
CREATE TABLE ##TBL_B
(
ID INT,
DESCRICAO VARCHAR(100)
)
--------------------------------------
-- Populando as tabelas
INSERT INTO ##TBL_A VALUES
(1,'TESTE1'),
(2,'TESTE2'),
(3,'TESTE3'),
(4,'TESTE4'),
(5,'TESTE5')
GO
INSERT INTO ##TBL_B VALUES
(1,'TESTE1'),
(2,'TESTE'),
(8,'TESTE8')
GO
--------------------------------------
-- Selecionando os dados no MERGE
SELECT * FROM ##TBL_A
SELECT * FROM ##TBL_B

Resultado da tabela A:
ID DESCRICAO
———– —————————————————————————————————-
1 TESTE1
2 TESTE2
3 TESTE3
4 TESTE4
5 TESTE5

Resultado da tabela B:
ID DESCRICAO
———– —————————————————————————————————-
1 TESTE1
2 TESTE
8 TESTE8


--------------------------------------
-- Realizando o MERGE
MERGE ##TBL_B AS TARGET -- Tabela de destino
USING ##TBL_A AS SOURCE -- Tabela de origem
ON TARGET.ID = SOURCE.ID -- Condição para considerar o registro como igual
WHEN MATCHED AND TARGET.DESCRICAO <> SOURCE.DESCRICAO -- Quando a descrição do destino for diferente da origem
THEN UPDATE SET TARGET.DESCRICAO = SOURCE.DESCRICAO -- Faça o update no destino com o valor da origem
WHEN NOT MATCHED BY TARGET THEN -- Quando não encontrar o registro no destino
INSERT (ID,DESCRICAO) VALUES(SOURCE.ID,SOURCE.DESCRICAO) -- faça o insert no destino com os valores da origem
WHEN NOT MATCHED BY SOURCE THEN -- Quando existir no destino mas não existir na origem
DELETE -- delete do destino
OUTPUT $action; -- Exiba no resultado as ações realizadas pelo macth
--------------------------------------
-- Consulta das tabelas após o merge
SELECT * FROM ##TBL_A
SELECT * FROM ##TBL_B

Resultado da Tabela A:
ID DESCRICAO
———– —————————————————————————————————-
1 TESTE1
2 TESTE2
3 TESTE3
4 TESTE4
5 TESTE5
Resultado da Tabela B:
ID DESCRICAO
———– —————————————————————————————————-
1 TESTE1
2 TESTE2
3 TESTE3
4 TESTE4
5 TESTE5


--------------------------------------
-- Dropando as tabelas temporárias
DROP TABLE ##TBL_A
DROP TABLE ##TBL_B

View atualizável SQL SERVER

Standard

Segue abaixo um exemplo de views atualizáveis, onde é apresentada a criação da mesma, alteração de estrutura e manipulação de dados de uma tabela através desta view, este exemplo foi criado pelo meu amigo Jord, achei o exemplo muito interessante e didático.

–CRIANDO O BANCO DE DADOS DE TESTE
CREATE DATABASE DB_TESTE
GO
–SETANDO O CONTEXTO PARA DB_TESTE
USE DB_TESTE
GO
–CRIANDO A TABELA TESTE
CREATE TABLE TESTE (OBS VARCHAR(10));
GO
—————————————
–CRIANDO A VIEW A PARTIR DA CONSULTA NA TABELA TESTE
CREATE VIEW VW_TESTE
AS
SELECT * FROM TESTE;
GO
—————————————
–CONSULTANDO A VIEW PARA VER QUE NÃO HÁ REGISTRO
SELECT * FROM VW_TESTE;
–INSERINDO O REGISTRO ATRAVES DA VIEW
INSERT INTO VW_TESTE VALUES(‘TESTE’);
—————————————
–CONSULTANDO A VIEW PARA VER O REGISTRO INSERIDO
SELECT * FROM VW_TESTE;
–UPDATE PELA VIEW
UPDATE VW_TESTE SET OBS = ‘ABCDEF’;
–CONSULTANDO A VIEW PARA VER O REGISTRO MODIFICADO
SELECT * FROM VW_TESTE;
—————————————
–DELETANDO PELA VIEW
DELETE FROM VW_TESTE;
–CONSULTANDO A VIEW PARA VER QUE O REGISTRO FOI APAGADO
SELECT * FROM VW_TESTE;
GO
—————————————
–ADICIONANDO NO CAMPO NA TABELA TESTE
ALTER TABLE TESTE ADD DATA DATETIME DEFAULT GETDATE();
GO
–DANDO O REFRESH NA VIEW PARA QUE A MESMA SEJA ATUALIZADA COM O NOVO CAMPO
EXEC SP_REFRESHVIEW VW_TESTE;
GO
–CONSULTANDO A VIEW PARA VER QUE O NOVO CAMPO ADICIONADO NA TABELA JÁ APARECE NA VIEW
SELECT * FROM VW_TESTE;
GO
—————————————
–SETANDO O CONTEXTO PARA O BANCO MASTER
USE MASTER;
GO
–DROPANDO O BANCO DE DADOS DB_TESTE
DROP DATABASE DB_TESTE;
GO

Verificar o valor do identity atual de uma tabela no SQL SERVER

Standard
Tomando como exemplo uma tabela chamada tbl_clientes
1) Abaixo segue o comando para descobrir o valor do identity atual desta tabela
DBCC CHECKIDENT (‘tbl_clientes’, NORESEED);
2) Abaixo segue a mensagem de retorno informando qual o valor do identity atual, no caso do nosso exemplo é o 14.
Checking identity information: current identity value ’14’, current column value ’14’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Indice Parcial no Postgresql

Standard

Segue abaixo um exemplo de como trabalhar com índices parciais no postgresql, para saber mais sobre o assunto clique no link que segue:

http://pgdocptbr.sourceforge.net/pg80/indexes-partial.html

EXEMPLO:

-- Criar Table: contato

CREATE TABLE contato
(
id bigserial NOT NULL,
datanascimento date,
email character varying(255),
nome character varying(255),
CONSTRAINT contato_pkey PRIMARY KEY (id),
CONSTRAINT contato_email_key UNIQUE (email)
)
WITH (
OIDS=FALSE
);
ALTER TABLE contato OWNER TO postgres;

-- Criando indice parcial (só valida a unicidade do campo e-mail se o mesmo for diferente de null)
CREATE INDEX email_ix ON contato (email)
WHERE email IS NOT NULL;

-- O Comando abaixo pode ser executada várias vezes sem gerar erro 
INSERT INTO contato (datanascimento,email,nome) values (now(),null,'nome')

-- O Comando abaixo gera o seguinte erro quando executado mais de uma vez:
-- ERRO:  duplicar valor da chave viola a restrição de unicidade "contato_email_key"
INSERT INTO contato (datanascimento,email,nome) values (now(),'teste@teste.com.br','nome')

-- Ver resultado
SELECT * FROM contato

1 2010-12-15 null nome
2 2010-12-15 null nome
3 2010-12-15 teste@teste.com.br nome

Exemplo de Criação de Indice filtrado no Sql Server 2008

Standard
--CRIANDO TABELA PARA TESTAR O INDICE FILTRADO
CREATE TABLE TXY(ID INT IDENTITY(1,1) PRIMARY KEY, NOME VARCHAR(10), CPF VARCHAR(11))
GO
--CRIANDO O INDICE UNIQUE FILTRADO
CREATE UNIQUE NONCLUSTERED INDEX IDX_TXY_CPF 
	ON TXY(CPF) 
		WHERE CPF IS NOT NULL
GO
----------------------------------------------------------------------
--INSERINDO DADOS DE NOME E CPF
INSERT INTO TXY VALUES('JOAO','11111111111'),('MARIA','22222222222')
--RESULT SET: (2 row(s) affected)
----------------------------------------------------------------------
--INSERINDO DADOS DE NOME, PORÉM COM CPF NULL
INSERT INTO TXY VALUES('JOSE',NULL),('MARIANA',NULL)
--RESULT SET: (2 row(s) affected)
----------------------------------------------------------------------
--INSERINDO DADOS DE NOME E CPF FORÇANDO A DUPLICAÇÃO DOS DOIS PRIMEIROS REGISTROS INSERIDOS
--PARA TESTAR O ÍNDICE UNIQUE FILTRADO.
INSERT INTO TXY VALUES('JOAO','11111111111'),('MARIA','22222222222')
--RESULT SET: 
/*
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.TXY' with unique index 'IDX_TXY_CPF'. The duplicate key value is (11111111111).
The statement has been terminated.
*/
----------------------------------------------------------------------
--DUPLICANDO OS REGISTROS COM CPF NULL
INSERT INTO TXY VALUES('JOSE',NULL),('MARIANA',NULL)
--RESULT SET: (2 row(s) affected)
----------------------------------------------------------------------
--VERIFICANDO OS REGISTROS NA TABELA
SELECT * FROM TXY

Link do Books OnLine sobre o Índice Filtrado: 

 msdn.microsoft.com/pt-br/library/cc280372.aspx

Clonar tabela com comando SQL

Standard

Abaixo segue comandos SQL para clonar uma tabela de duas formas, apenas a estrutura e a estrutura + os dados

-- Clona apenas a estrutura
select * into NEW_TABLE from TABLE_ORIGEM limit 0 

-- Clona a estrutura + dados 
select * into NEW_TABLE from TABLE_ORIGEM

10 motivos para usar o SQuirreL SQL

Standard

SQuirreL SQL Client é um aplicativo gráfico cliente SQL desenvolvido em Java que lhe permitirá visualizar a estrutura, procurar os dados em tabelas, executar comandos SQL,e gerar diagramas de ER utilizando engenharia reversa em banco de dados compatíveis com JDBC. Segue abaixo um link que lista 10 motivos para se utilizar esta ferramenta.

http://www.boaglio.com/index.php/2010/04/28/10-motivos-para-usar-o-squirrel-sql/

Verificar Bloqueios no SQL Server

Standard

Segue abaixo alguns comandos para se verificar a existência ou não de bloqueios no Sql Server:

-- Executando essa stored procedure é listado todos os processos no master, para vermos se há algum processo
-- bloqueado devemos atentar para a coluna BlkBy, se nessa coluna tiver algum processo é  por que existe bloqueio. 
SP_WHO2

--Com essa consulta voce ja vai direto no processo que esta gerando o bloqueio
select * from master..sysprocesses where blocked !=0 and blocked <> spid

 

Obs. : Como em ambos os procedimentos mencionados acima mostram a coluna hostname você pode consultar o usuário, para que o mesmo finalize o que estiver fazendo para liberar os processos, caso nao tenha como contactar o usuário você pode usar o comando dbcc inputbuffer(spid) para ver o que está sendo executado pelo processo que esta gerando o bloqueio, dessa forma você pode avaliar se pode executar um kill spid ou não para liberar os processos.