Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lilian Butkevicis

Rotina de Expurgo

Recommended Posts

Boa tarde!

 

Tenho o seguinte problema:

 

Preciso fazer uma rotina de expurgo de dados.

São algumas dezenas de tabelas que devem ser limpas.

 

A idéia inicial era fazer vários deletes, mas preciso que eles sejam 'melhorados'

 

Meu código é o seguinte:

 

Delete * from AA133T Where

(select * from AA133T

inner join mcrt_bg_contratos on AA133T.mcega = mcrt_bg_contratos.nr_lse

where

(mcrt_bg_contratos.st_contrato_ms = 'ALÇADA'

OR mcrt_bg_contratos.st_contrato_ms = 'APROVADO'

OR mcrt_bg_contratos.st_contrato_ms = 'ATIVO'

OR mcrt_bg_contratos.st_contrato_ms = 'COMITE'

OR mcrt_bg_contratos.st_contrato_ms = 'EXCLUIDO'

OR mcrt_bg_contratos.st_contrato_ms = 'INATIVO'

OR mcrt_bg_contratos.st_contrato_ms = 'PEDENCIA'

OR mcrt_bg_contratos.st_contrato_ms = 'PROCESSO'

OR mcrt_bg_contratos.st_contrato_ms = 'RECUSADO'

OR mcrt_bg_contratos.st_contrato_ms = 'SOLICITADO'

OR mcrt_bg_contratos.st_contrato_ms = ' '

AND mcrt_bg_contratos.DT_INI_HIST <= '2004-12-31') OR

(mcrt_bg_contratos.st_contrato_ms = 'INATIVO'

AND DT_INI_HIST BETWEEN '2005-01-01' AND '2006-04-30') OR

(mcrt_bg_contratos.st_contrato_ms = 'ATIVO'

AND mcrt_bg_contratos.st_contrato_se = 'PREJUIZO'

AND DT_INI_HIST BETWEEN '2005-01-01' AND '2006-04-30'))

 

 

Meu problema é:

O que muda de um delete para o outro é apenas a tabela e o inner join, a condição do where é sempre a mesma.

Para não ter que fazer uma cópia do trecho a cada delete gostaria de saber se tem algum jeito de melhorar.

 

Algo do tipo, uma função, uma variável que eu possa armazenar o que eu quero no "wherer" para não ter que repetir esse trecho enorme em cada delete.

 

Valeu pela atenção galera!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Princesa,Este procedimento fará parte da rotina de sua sistema ou será usado exporadicamente?Pq você simplesmente não repete a expressão em um sp?Dá pra fazer utilzando um variável onde será passado a tabela e INNER JOIN e executar em um EXEC.Porém se você passa o JOIN errado vai dar erro e a string para rodar no EXEC vai ficar enorme. Posso cria um exemplo para tú ver e avaliar se vale a pena.Talvez alguém aqui possa ter outras idéias. Vamos aguardar!t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Princesa,Vou bolar algo e post.Ai você avalia!!t+

Fará parte do sistema... :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Princesa,

 

Fiz um exemplo utilizando um variável e EXEC:

DECLARE @COMANDO VARCHAR(4000), @INNER VARCHAR(200), @TABELA VARCHAR(60), @IN VARCHAR(200)SET @INNER	= ' INNER JOIN MCRT_BG_CONTRATOS ON AA133T.MCEGA = MCRT_BG_CONTRATOS.NR_LSE 'SET @TABELA = ' AA133T 'SET @IN = '(''ALÇADA'',''APROVADO'',''ATIVO'',''COMITE'',''EXCLUIDO'',''INATIVO'',''PEDENCIA'',''PROCESSO'',''RECUSADO'',''SOLICITADO'','' '')'SET @COMANDO = 'DELETE * FROM ' + @TABELA + ' WHERE  (SELECT * FROM ' +  @TABELA + ' ' + @INNER + 								'WHERE (	mcrt_bg_contratos.st_contrato_ms IN ' + @IN + 'AND MCRT_BG_CONTRATOS.DT_INI_HIST <= ''2004-12-31'')' SET @COMANDO =  @COMANDO + ' OR 	(MCRT_BG_CONTRATOS.ST_CONTRATO_MS = ''INATIVO''	AND DT_INI_HIST BETWEEN ''2005-01-01'' AND ''2006-04-30'') 'SET @COMANDO =  @COMANDO + ' OR 	(MCRT_BG_CONTRATOS.ST_CONTRATO_MS = ''ATIVO''	AND MCRT_BG_CONTRATOS.ST_CONTRATO_SE = ''PREJUIZO''	AND DT_INI_HIST BETWEEN ''2005-01-01'' AND ''2006-04-30''))'PRINT @COMANDO --EXEC (@COMANDO)

você pode transformar este exemplo em uma stored procedure ou ms function dependendo de sua necessidade.

 

O PRINT @COMANDO irá imprimir o comando montado dinâmicamente verifique se o comando gerado no final esta ok.

 

O --EXEC (@COMANDO) esta comentado pois primeiro valide a expressão criada para depois executá-la. É só descomentar e rodar.

 

Bom único problema que vejo é que se você passar o conteúdo da variável @INNER errado irá retornar erro. No mais a @TABELA pode ser passada por parâmetro assim como o @INNER.

 

Fiz uma alteração na sua expressão para simplificar. Utilizei o IN a principio mas se houver algum problema como o uso do IN (aqui onde trabalho o pessoal do AD quase nunca aprova o uso de IN) usaremos NOT EXISTS.

 

Bom acho que já dá uma luz.

 

t+

 

Ok, muito obrigada pela atenção http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qq desbeiço post ai. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Só lembre-se como estamos criando um string delimitado por ' e dentro dela teremos outros ' então em alguns lugares tive de repetir:

'(''ALÇADA'',''APROVADO''

Então cuidado só com isto pq o resto é simples.

 

Faça por partes para facilitar e dê um print para ver a string do comando que você esta montando.

 

E lembre-se eu alterei par utilizar IN talvez não seja a melhor de fazer mas o a expressão fica mais simples.

 

t+

 

 

Uma luz?

Isso dá um big clarão!

 

Agora só vou ajustar aqui...

 

Muito Obrigada! http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.