none
Exemplo de uma procedore que executa automaticamente dando um insert e updata RRS feed

Respostas

  • José,

    Concordo com o Durval, uma opção seria por exemplo criar um Trigger que executa uma Stored Procedure de acordo com a necessidade.

    Veja este exemplo:

    Create TRIGGER [dbo].[T_Formatar_Numero]
    On [dbo].[CTPRODUCAO]
    AFTER INSERT
    AS
    SET NOCOUNT ON
    
    Exec P_Formatar_Numero
    Exec P_Inserir_Analise_Resultados
    
    


    CREATE PROCEDURE [dbo].[P_Formatar_Numero]
    As
    SET NOCOUNT ON
     UPDATE CTPRODUCAO
     SET NUMPVM=(SELECT 
                 CASE LEN(CODSEQUENCIAL)
                  WHEN 1 THEN REPLICATE('0',3)+CONVERT(CHAR(1),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 2 THEN REPLICATE('0',2)+CONVERT(CHAR(2),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 3 THEN REPLICATE('0',1)+CONVERT(CHAR(3),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 4 THEN CONVERT(CHAR(4),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                 END
                 From CTPRODUCAO WHERE NUM='0')
    WHERE NUM='0'
    Create PROCEDURE [dbo].[P_Inserir_Analise_Resultados]
    AS
     SET NOCOUNT ON
     DECLARE @NUMMP CHAR(7)
     SET @NUMMP=(SELECT ISNULL(MAX(NUMMP),1) FROM CTENTRADA_PQC WHERE YEAR(DATAALMOX)=YEAR(GETDATE()))
     
      INSERT INTO CTENTRADA_PQC_RESULTADOS(NUMMP, CODRELACIONAMENTO, CODSEQUENCIALPRODUTO, CODSEQUENCIALMETODO, AMOSTRA)
        SELECT PQC.NUMMP, 
                   PQCx.CODRELACIONAMENTO,
                   PQCx.CODSEQUENCIALPRODUTO,
                   PQCx.CODSEQUENCIALMETODO,
                   ''
        FROM CTENTRADA_PQC PQC INNER JOIN PQCxME PQCx
                                                ON PQC.NUMMP = @NUMMP
                    		                   INNER JOIN PRODUTOSQUIMICOS PQ 
                                                ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                AND PQC.NUMCADASTRO = PQ.NUMCADASTRO  
                                                AND PQCx.CODRELACIONAMENTO = (SELECT MAX(PQCx.CODRELACIONAMENTO) FROM PQCxME PQCx INNER JOIN PRODUTOSQUIMICOS PQ
    																																													ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                                                                 WHERE PQ.NUMCADASTRO = PQC.NUMCADASTRO)
           GROUP BY PQC.NUMMP, PQCx.CODSEQUENCIALPRODUTO, PQCx.CODRELACIONAMENTO, PQCx.CODSEQUENCIALMETODO, PQCx.CODSEQUENCIAL
           ORDER BY PQCx.CODSEQUENCIAL
    
    
    

    Todas as vezes que CTProducao for manipulada durante um Insert serão executadas as Stored Procedures responsáveis em Formatar a Numeração e a outra para Inserir os resutados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    • Marcado como Resposta Xarp2 quarta-feira, 20 de agosto de 2014 20:03
    quarta-feira, 20 de agosto de 2014 15:45
  • José,

    Como o Flávio indicou, o funcionamento de uma procedure é diferente de uma trigger.

    A Trigger é executada "automaticamente" antes ou após uma ação disparada para uma determinada tabela.

    Já a procedure precisa de uma ação manual ou através de um ação externa (como indicado pelo Flávio).

    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"
    • Marcado como Resposta Xarp2 quarta-feira, 20 de agosto de 2014 20:03
    quarta-feira, 20 de agosto de 2014 14:27
    Moderador

Todas as Respostas

  • José,

    O que você quer talvez seja uma trigger, ela sim é acionada automaticamente após uma determinada ação na tabela, seja um insert, um delete ou um update...

    Uma procedure só é acionada por um job ou usando o SQLCMD através do agendador de tarefas do windows ou chamada por alguma outra rotina...



    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 20 de agosto de 2014 14:12
  • José,

    Como o Flávio indicou, o funcionamento de uma procedure é diferente de uma trigger.

    A Trigger é executada "automaticamente" antes ou após uma ação disparada para uma determinada tabela.

    Já a procedure precisa de uma ação manual ou através de um ação externa (como indicado pelo Flávio).

    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"
    • Marcado como Resposta Xarp2 quarta-feira, 20 de agosto de 2014 20:03
    quarta-feira, 20 de agosto de 2014 14:27
    Moderador
  • José,

    Concordo com o Durval, uma opção seria por exemplo criar um Trigger que executa uma Stored Procedure de acordo com a necessidade.

    Veja este exemplo:

    Create TRIGGER [dbo].[T_Formatar_Numero]
    On [dbo].[CTPRODUCAO]
    AFTER INSERT
    AS
    SET NOCOUNT ON
    
    Exec P_Formatar_Numero
    Exec P_Inserir_Analise_Resultados
    
    


    CREATE PROCEDURE [dbo].[P_Formatar_Numero]
    As
    SET NOCOUNT ON
     UPDATE CTPRODUCAO
     SET NUMPVM=(SELECT 
                 CASE LEN(CODSEQUENCIAL)
                  WHEN 1 THEN REPLICATE('0',3)+CONVERT(CHAR(1),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 2 THEN REPLICATE('0',2)+CONVERT(CHAR(2),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 3 THEN REPLICATE('0',1)+CONVERT(CHAR(3),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                  WHEN 4 THEN CONVERT(CHAR(4),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)
                 END
                 From CTPRODUCAO WHERE NUM='0')
    WHERE NUM='0'
    Create PROCEDURE [dbo].[P_Inserir_Analise_Resultados]
    AS
     SET NOCOUNT ON
     DECLARE @NUMMP CHAR(7)
     SET @NUMMP=(SELECT ISNULL(MAX(NUMMP),1) FROM CTENTRADA_PQC WHERE YEAR(DATAALMOX)=YEAR(GETDATE()))
     
      INSERT INTO CTENTRADA_PQC_RESULTADOS(NUMMP, CODRELACIONAMENTO, CODSEQUENCIALPRODUTO, CODSEQUENCIALMETODO, AMOSTRA)
        SELECT PQC.NUMMP, 
                   PQCx.CODRELACIONAMENTO,
                   PQCx.CODSEQUENCIALPRODUTO,
                   PQCx.CODSEQUENCIALMETODO,
                   ''
        FROM CTENTRADA_PQC PQC INNER JOIN PQCxME PQCx
                                                ON PQC.NUMMP = @NUMMP
                    		                   INNER JOIN PRODUTOSQUIMICOS PQ 
                                                ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                AND PQC.NUMCADASTRO = PQ.NUMCADASTRO  
                                                AND PQCx.CODRELACIONAMENTO = (SELECT MAX(PQCx.CODRELACIONAMENTO) FROM PQCxME PQCx INNER JOIN PRODUTOSQUIMICOS PQ
    																																													ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                                                                 WHERE PQ.NUMCADASTRO = PQC.NUMCADASTRO)
           GROUP BY PQC.NUMMP, PQCx.CODSEQUENCIALPRODUTO, PQCx.CODRELACIONAMENTO, PQCx.CODSEQUENCIALMETODO, PQCx.CODSEQUENCIAL
           ORDER BY PQCx.CODSEQUENCIAL
    
    
    

    Todas as vezes que CTProducao for manipulada durante um Insert serão executadas as Stored Procedures responsáveis em Formatar a Numeração e a outra para Inserir os resutados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    • Marcado como Resposta Xarp2 quarta-feira, 20 de agosto de 2014 20:03
    quarta-feira, 20 de agosto de 2014 15:45