• Imprimir

Todos os scripts aqui são divulgados com a finalidade a dar apoio as aulas que ministro.

Hoje veremos um script que gera o código para realização do comando MERGE.

Alem do conceito do comando MERGE temos os conceitos :

@@CURSOR_ROWS;

 

BEGIN IF @Number < 10 PRINT 'xxxx'; ELSE PRINT 'yyyy.'; END ;

Entre outros.

Espero poder ajudar aos que precisam qualquer duvida é só entra em contato 

 

/****** Script Para gerar rotina deMERGE ******/

PRINT 'use <<< SEU BANCO >>>

DECLARE @TABELA_ORIGEM varchar(50)

DECLARE @TABELA_DESTINO varchar(50)

DECLARE @countador int;

DECLARE @chave_primaria varchar(50)

DECLARE @campo varchar(50)

 

-- MUDA AS VARIAVEIS AQUI AQUI AQUI AQUI AQUI AQUI 

SET @TABELA_ORIGEM='<<< TABELA ORIGEM >>>'

SET @TABELA_DESTINO='<<< TABELA DESTINO >>>'

SET @countador=0

 

DECLARE lista_00 CURSOR SCROLL FOR  SELECT column_name as PRIMARYKEYCOLUMN

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC

INNER JOIN

    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU

          ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND

             TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND 

             KU.table_name=@TABELA_ORIGEM

ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION;

 

PRINT 'IF (SELECT COUNT(*) FROM '+@TABELA_DESTINO+') >0'

PRINT 'BEGIN

MERGE '+@TABELA_ORIGEM+' as destino

USING  '+@TABELA_DESTINO+' as origem

ON 

'

 

OPEN lista_00

-- deleção de todos os bancos 

FETCH FIRST FROM lista_00 INTO @chave_primaria

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT 'destino.'+@chave_primaria+' = origem.'+@chave_primaria

 

-- controle se estamos no ultimo registro do laco SE for o ultimo nao imprimo o and

SET @countador=@countador+1

if @countador < @@CURSOR_ROWS

begin

print 'and'

end

 

FETCH NEXT FROM lista_00 INTO @chave_primaria

END

CLOSE lista_00

DEALLOCATE lista_00

 

-- ----------------------------------------- SEGUNDA PARTE 

 

PRINT '

-- Há registro no destino e na origem'

PRINT 'WHEN MATCHED THEN'

PRINT '    UPDATE SET'

SET @countador=0

DECLARE lista_01 CURSOR SCROLL FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS where table_name=@TABELA_DESTINO

OPEN lista_01

-- deleção de todos os bancos 

FETCH FIRST FROM lista_01 INTO @campo

WHILE @@FETCH_STATUS = 0

BEGIN

 

-- controle se estamos no ultimo registro do laco SE for o ultimo nao imprimo o and

SET @countador=@countador+1

IF @countador < @@CURSOR_ROWS PRINT 'destino.'+@campo+'=origem.'+@campo+','  

ELSE  PRINT 'destino.'+@campo+'=origem.'+@campo ; 

 

FETCH NEXT FROM lista_01 INTO @campo

END

CLOSE lista_01

DEALLOCATE lista_01

 

 

-- ----------------------------------------- TERCEIRA PARTE 

PRINT '

--Quando não há registro no destino e há na origem'

PRINT 'WHEN NOT MATCHED THEN'

PRINT 'INSERT ( '

SET @countador=0

DECLARE lista_03 CURSOR SCROLL FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS where table_name=@TABELA_DESTINO

OPEN lista_03

-- deleção de todos os bancos 

FETCH FIRST FROM lista_03 INTO @campo

WHILE @@FETCH_STATUS = 0

BEGIN

-- controle se estamos no ultimo registro do laco SE for o ultimo nao imprimo o and

SET @countador=@countador+1

IF @countador < @@CURSOR_ROWS 

PRINT @campo+','  

ELSE  

PRINT @campo+')'  

FETCH NEXT FROM lista_03 INTO @campo

END

CLOSE lista_03

DEALLOCATE lista_03

 

 

 

PRINT 'VALUES

 ( '

SET @countador=0

DECLARE lista_03_1 CURSOR SCROLL FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS where table_name=@TABELA_DESTINO

OPEN lista_03_1

-- deleção de todos os bancos 

FETCH FIRST FROM lista_03_1 INTO @campo

WHILE @@FETCH_STATUS = 0

BEGIN

-- controle se estamos no ultimo registro do laco SE for o ultimo nao imprimo o and

SET @countador=@countador+1

IF @countador < @@CURSOR_ROWS 

PRINT 'origem.'+@campo+','  

ELSE  

PRINT 'origem.'+@campo+')

'  

FETCH NEXT FROM lista_03_1 INTO @campo

END

CLOSE lista_03_1

DEALLOCATE lista_03_1

 

 

-- ----------------------------------------- QUARTA PARTE 

 

 

PRINT '

----------------------------------------------- ( CUIDADO ANALISE BEM A REGRA E SEMPRE ANTES UTILIZE O AMBIENTE DE HOMOLOGACAO ) ----

 

--Quando há registro no destino e não existe na origem 

 

-- WHEN NOT MATCHED BY SOURCE

   --  THEN DELETE

;'

 

 

 

print 'END'