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'