Usuário com melhor resposta
merge incremental

Pergunta
-
Bom Dia
Fiz um Script de Merge que busca de uma origem que pode ter N valores, gostaria de saber se é possível fazer com que o Script de Merge seja incremental, notei que ele le todos as linhas a cada vez que o merge é executado, receio que com o tempo terei problemas de performance.
Grato,
Maurício
Respostas
-
Muito Obrigado pela sugestão!
Mas estou com o SQL SERVER 2008.
Como posso reproduzir no SQL 2008?
Grato,
Maurício
Mauricio,
Neste caso eu sugiro que você crie em sua tabela uma coluna IDENTITY e deixe ela trabalhar a inclusão. Não é uma solução flexível como usando SEQUENCE mas funciona com uma lógica semelhante.
Segue abaixo o script para você adaptar às suas necessidades:
CREATE TABLE TB_ALVO ( CD_PESSOA int IDENTITY(1, 1), NM_PESSOA varchar(30), CONSTRAINT PK_ALVO PRIMARY KEY(CD_PESSOA) ); CREATE TABLE TB_ORIGEM ( CD_PESSOA int, NM_PESSOA varchar(30), CONSTRAINT PK_ORIGEM PRIMARY KEY(CD_PESSOA)); GO INSERT TB_ALVO(NM_PESSOA) VALUES('Jose'); INSERT TB_ALVO(NM_PESSOA) VALUES('João'); INSERT TB_ALVO(NM_PESSOA) VALUES('Durval'); GO INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(103, 'Miguel'); INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(104, 'Sandro'); GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM MERGE TB_ALVO AS A USING TB_ORIGEM AS O ON (A.CD_PESSOA = O.CD_PESSOA) WHEN NOT MATCHED BY TARGET AND O.NM_PESSOA LIKE 'S%' THEN INSERT(NM_PESSOA) VALUES(O.NM_PESSOA) WHEN MATCHED THEN UPDATE SET A.NM_PESSOA = O.NM_PESSOA WHEN NOT MATCHED BY SOURCE AND A.NM_PESSOA LIKE 'S%' THEN DELETE; GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM GO DROP TABLE TB_ALVO DROP TABLE TB_ORIGEM GO
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 28 de outubro de 2014 13:27
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 28 de outubro de 2014 17:42
Todas as Respostas
-
Maumauboy,
Se você utilizar a coluna a ser incrementada com um SEQUENCE criado dinamicamente é possível adicionar os novos registros e alterar o valor do próximo registro à ser adicionado sem problemas.
Segue abaixo um exemplo para você adaptar às suas necessidades:
CREATE TABLE TB_ALVO ( CD_PESSOA int, NM_PESSOA varchar(30), CONSTRAINT PK_ALVO PRIMARY KEY(CD_PESSOA) ); CREATE TABLE TB_ORIGEM ( CD_PESSOA int, NM_PESSOA varchar(30), CONSTRAINT PK_ORIGEM PRIMARY KEY(CD_PESSOA)); GO INSERT TB_ALVO(CD_PESSOA, NM_PESSOA) VALUES(100, 'Jose'); INSERT TB_ALVO(CD_PESSOA, NM_PESSOA) VALUES(101, 'João'); INSERT TB_ALVO(CD_PESSOA, NM_PESSOA) VALUES(102, 'Durval'); GO INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(103, 'Miguel'); INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(104, 'Sandro'); GO --CREATE SEQUENCE SQ_ALVO START WITH 1 INCREMENT BY 1 ; --GO DECLARE @VALOR int SELECT @VALOR = (MAX(CD_PESSOA) + 1) FROM TB_ALVO DECLARE @NOVASEQ varchar(200) SET @NOVASEQ = 'CREATE SEQUENCE SQ_ALVO START WITH ' + CONVERT(varchar, @VALOR) + ' INCREMENT BY 1;' EXEC (@NOVASEQ) GO ALTER TABLE TB_ALVO ADD DEFAULT NEXT value FOR dbo.SQ_ALVO FOR CD_PESSOA; GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM GO
--ADICIONA APENAS O USUÁRIO COM "S" MERGE TB_ALVO AS A USING TB_ORIGEM AS O ON (A.CD_PESSOA = O.CD_PESSOA) WHEN NOT MATCHED BY TARGET AND O.NM_PESSOA LIKE 'S%' THEN INSERT(CD_PESSOA, NM_PESSOA) VALUES(DEFAULT, O.NM_PESSOA) WHEN MATCHED THEN UPDATE SET A.NM_PESSOA = O.NM_PESSOA WHEN NOT MATCHED BY SOURCE AND A.NM_PESSOA LIKE 'S%' THEN DELETE; GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM GO DROP TABLE TB_ALVO DROP TABLE TB_ORIGEM DROP SEQUENCE SQ_ALVO GO
Para maiores informações veja:
http://msdn.microsoft.com/pt-br/library/bb510625.aspx
http://msdn.microsoft.com/pt-br/library/ff878091.aspx
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
-
Muito Obrigado pela sugestão!
Mas estou com o SQL SERVER 2008.
Como posso reproduzir no SQL 2008?
Grato,
Maurício
Mauricio,
Neste caso eu sugiro que você crie em sua tabela uma coluna IDENTITY e deixe ela trabalhar a inclusão. Não é uma solução flexível como usando SEQUENCE mas funciona com uma lógica semelhante.
Segue abaixo o script para você adaptar às suas necessidades:
CREATE TABLE TB_ALVO ( CD_PESSOA int IDENTITY(1, 1), NM_PESSOA varchar(30), CONSTRAINT PK_ALVO PRIMARY KEY(CD_PESSOA) ); CREATE TABLE TB_ORIGEM ( CD_PESSOA int, NM_PESSOA varchar(30), CONSTRAINT PK_ORIGEM PRIMARY KEY(CD_PESSOA)); GO INSERT TB_ALVO(NM_PESSOA) VALUES('Jose'); INSERT TB_ALVO(NM_PESSOA) VALUES('João'); INSERT TB_ALVO(NM_PESSOA) VALUES('Durval'); GO INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(103, 'Miguel'); INSERT TB_ORIGEM(CD_PESSOA, NM_PESSOA) Values(104, 'Sandro'); GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM MERGE TB_ALVO AS A USING TB_ORIGEM AS O ON (A.CD_PESSOA = O.CD_PESSOA) WHEN NOT MATCHED BY TARGET AND O.NM_PESSOA LIKE 'S%' THEN INSERT(NM_PESSOA) VALUES(O.NM_PESSOA) WHEN MATCHED THEN UPDATE SET A.NM_PESSOA = O.NM_PESSOA WHEN NOT MATCHED BY SOURCE AND A.NM_PESSOA LIKE 'S%' THEN DELETE; GO SELECT * FROM TB_ALVO SELECT * FROM TB_ORIGEM GO DROP TABLE TB_ALVO DROP TABLE TB_ORIGEM GO
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 28 de outubro de 2014 13:27
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 28 de outubro de 2014 17:42