Carregando ...
Desculpe, ocorreu um erro ao carregar o conteúdo.

33212Melhores práticas - melhorando o script

Expandir mensagens
  • Vitor Bueno
    5 de dez de 2016
      Olá Pessoal, 

      gostaria da opinião de vocês sobre uma maneira mais elegante de se fazer duas operações no SQL Server, sempre visando a questão do desempenho e também de manutenção futura:  



      1. validação de INSERT em tabela com chave composta :

      o seguinte insert em uma tabela de detalhe na qual a chave é composta de 3 colunas:


      TProposta (CodProposta, Cliente, ...)
      TPropostaDT (CodProposta, CodProduto, CodLocal, ...)

      A operação em questão é para a movimentação de itens de dentro de uma proposta para outra  (usada para criar cenários de vendas), de maneira a permitir alterações posteriores na confecção de orçamento, porém, ao inserir itens dentro da proposta destino, este não pode existir dentro da mesma. A solução abaixo está em operação, mas me parece uma enorme engenharia alternativa. 


      Estive analisando algo referente a trocar esta validação para o uso do WHERE NOT EXISTS mas não cheguei num consenso.





      2. Registro de Log:

      Esta operação foi concebida desta forma devido a alguns problemas com triggers no passado e foi ficando, ficando e está assim até hoje (é do tempo do SQL 6.5). Que opção mais interessante pode ser usada para registros de logs destas operações? Como vocês fazem isto atualmente?




      Segue abaixo a rotina em questão, negritado as partes referenciadas nos itens acima.

      Versão atual do banco: Microsoft SQL Server 2012 - 11.0.2100.60 (X64)

      Grato pela atenção.


      Att











      CREATE PROCEDURE spPropostaCenario 
      @CodPropostaOrigem int,
      @CodPropostaDestino int,
      @ID int,
      @Retorno varchar(500) output
      AS
      BEGIN

              DECLARE @QtdeColunas int
              SET QtdeColunas = 0

      INSERT INTO TPropostaDT (
      CodProposta, 
      CodProduto, 
      CodLocal, 
      QtdeIncluso, 
      Renovar, 
      VrBase, 
      VrIncluso, 
      VrExtra, 
      QtdeParcelas, 
      DescricaoProduto, 
      Precificador, 
      ID, 
      GrupoConsumo, 
      VrPrecificador, 
      InstrucaoOperacional
      SELECT 
      @CodPropostaDestino, 
      CodProduto, 
      CodLocal, 
      QtdeIncluso, 
      Renovar, 
      VrBase, 
      VrIncluso, 
      VrExtra, 
      QtdeParcelas, 
      DescricaoProduto, 
      Precificador, 
      @ID, 
      GrupoConsumo, 
      VrPrecificador, 
      InstrucaoOperacional
      FROM TPropostaDT 
      WHERE 
      CodProposta = @CodPropostaOrigem
      AND CONVERT(varchar, CodProduto) + '|' + convert(varchar, CodLocal) NOT IN (
      SELECT 
      CONVERT(varchar, CodProduto) + '|' + convert(varchar, CodLocal)
      FROM TPropostaDT
      WHERE 
      CodProposta = @CodPropostaDestino
      )

              SET QtdeColunas = @@ROWCOUNT


      -- Registro de Log
      INSRT INTO TLog (ID, Modulo, Obs)
      VALUES (
      @ID,
      'PropostaCenario',
      convert(varchar, ISNULL(@CodPropostaOrigem,0) )         
      +'|'+ convert(varchar, ISNULL(@CodPropostaDestino,0) )
      +'|'+ convert(varchar, ISNULL(@QtdeColunas,0) )
      )

      SET @Retorno = '[' + convert(varchar, @QtdeColunas) + '] Operação realizada com sucesso.'

      END
      GO



    • Mostrar todas as 6 mensagens neste tópico