none
merge incremental RRS feed

  • 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

    segunda-feira, 27 de outubro de 2014 12:42

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"

    segunda-feira, 27 de outubro de 2014 19:23
    Moderador

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"

    segunda-feira, 27 de outubro de 2014 17:08
    Moderador
  • Muito Obrigado pela sugestão!

    Mas estou com o SQL SERVER 2008.

    Como posso reproduzir no SQL 2008?

    Grato,

    Maurício

    segunda-feira, 27 de outubro de 2014 18:52
  • 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"

    segunda-feira, 27 de outubro de 2014 19:23
    Moderador