none
duvida com codigo dentro de stored procedure RRS feed

  • Pergunta

  • bom dia!
    eu não entendo muito de string em sql e estou precisando de ajuda.

    Eu estou fazendo um select (esse está funcionando) em que me retorne um valor referente a diferença entre 2 horário, baseado nessa informação, dependendo do valor retornado, preciso chamar uma outra stored procedure

    eu tenho o seguinte codigo, mas com certeza está com erro, o que me importa mais foi a logica para que vcs pudesse entender o que eu preciso

    Declare @diferenca as varchar(100)
    Declare @id as int
    
    select @id = id, @diferenca=DATEDIFF(hour, data_abertura, GETDATE())
    from chamados
    
    if @diferenca <=2
    exec sla_4_email_50
    else
    if @diferenca >2 and @diferenca <=3
    exec sla_4_email_70
    else
    if @diferenca >3 and @diferenca <=3.6
    exec sla_4_email_90
    else
    if @diferenca >=4
    exec sla_4_email_100

    outra dúvida seria,  no meu select, eu preciso recuperar o ID daquela string e conseguir manda esse valor para a outra procedure, sla_4_email_50 por exemplo e como recuperar ela lá

    obrigado


    Darth Tsurth

    quarta-feira, 17 de abril de 2013 12:31

Todas as Respostas

  • Darth,

    Veja abaixo, como seus valores do if não se intercalam voce não precisa do else, apenas uma sequencia de IFs seria o sulficiente. Alem de que os valores da diferença e do ID que voce precisa recuperar ja estão nas variaveis @id e @diferenca, fiz um script passando-os como parametro para suas procedures.

    DECLARE @diferenca AS VARCHAR(100)
    DECLARE @id AS INT
    
    SELECT @id = id, @diferenca=DATEDIFF(hour, data_abertura, GETDATE())
    FROM chamados
    
    IF @diferenca <=2
    	EXEC sla_4_email_50 @Id, @diferenca
    
    IF @diferenca >2 and @diferenca <=3
    	EXEC sla_4_email_70 @Id, @diferenca
    
    IF @diferenca >3 and @diferenca <=3.6
    	EXEC sla_4_email_90 @Id, @diferenca
    
    IF @diferenca >=4
    	EXEC sla_4_email_100 @Id, @diferenca


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 17 de abril de 2013 12:35
    Moderador
  • show!

    e como eu recupero esse @id nas outras procedures?


    Darth Tsurth

    quarta-feira, 17 de abril de 2013 12:36
  • Darth,

    Pense assim, esse @id esta neste seu contexto de execução, ao chamar uma procedure sla_4_email_100 por exemplo essa variavel esta entrando como parametro para ela, dentro dessa procedure voce deve ter N outras ações, alguma dessa ação te gerará um ID e voce quer te-lo como retorno é isso?


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 17 de abril de 2013 12:37
    Moderador
  • na outra procedure é um disparo de email na verdade...

    e quero enviar esse email passando esse ID no corpo do email


    Darth Tsurth

    quarta-feira, 17 de abril de 2013 12:40
  • Darth,

    Da forma que esta o ID ja esta sendo passado para dentro da procedure como parametro, ou seja, sua procedure deve estar preparada para receber esse ID e a mesma estara usual em seu contexto de execução.

    Segue um exemplo simples:

    --Procedure para receber o id
    CREATE PROCEDURE dbo.ReceberId
    @Id INT
    AS
    BEGIN
    	SELECT @Id + 5
    END
    
    --Chamando a proc e passando o parametro
    DECLARE @Id INT
    SET @Id = 1
    
    EXEC dbo.ReceberId @Id


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 17 de abril de 2013 12:44
    Moderador
  • nao entendi,

    se eu colocar esse + 5 não vai alterar o valor?

    e depois set @id = 1

    isso nao altera o valor original da id vinda lá da primeira procedure?


    Darth Tsurth

    quarta-feira, 17 de abril de 2013 12:48
  • Sim,

    Mas ai é a proc que eu fiz apenas para demonstrar que pode usar o valor passado como parametro dentro da procedure, ai no caso voce tem que programar a sua para fazer o que voce quiser, como enviar um email por exemplo.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 17 de abril de 2013 12:50
    Moderador
  • kra, ainda no primeiro codigo que vc me passou, ele ta me retornando um erro,

    Msg 8115, Level 16, State 8, Procedure sla_4_verifica, Line 23
    Arithmetic overflow error converting varchar to data type numeric.


    Darth Tsurth

    quarta-feira, 17 de abril de 2013 13:30
  • Darth,

    Agora é um erro de conversão, altere a primeira linha para:

    Declare @diferenca as int

    Isso deve ser uma variavel numerica e não alfanumerica.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 17 de abril de 2013 13:36
    Moderador
  • kra, vamos la..

    na minha primeira procedure, ta exatamente como vc me mandou o codigo e realmente, mas o estranho que independente do resultado, ele ta sempre disparando para a stored procedure: sla_4_email_100

    DECLARE @diferenca AS INT
    DECLARE @id AS INT
    
    SELECT @id = id, @diferenca=DATEDIFF(hour, data_abertura, GETDATE())
    FROM chamados
    where (status <> 'Fechado')
    
    IF @diferenca <=2
        EXEC sla_4_email_50 @id
    
    IF @diferenca >2 and @diferenca <=3
        EXEC sla_4_email_75 @id
    
    IF @diferenca >3 and @diferenca <=3.6
        EXEC sla_4_email_90 @id
    
    IF @diferenca >=4
        EXEC sla_4_email_100 @id



    ===============================================

    aqui esta a procedure sla_4_email_100:

    @id int,
        @FROM_ADDRESS VARCHAR(100) = 'email@mail.com',    
        @TO_ADDRESS VARCHAR(1000) = 'email@mail.com',    
        @CC_ADDRESS VARCHAR(1000) = '',    
        @BCC_ADDRESS VARCHAR(1000) = '',    
        @ASSUNTO_EMAIL VARCHAR(200) = 'Notificação SLA - Alta - 100% @id',    
        @MENSAGEM_EMAIL TEXT = 'Existem chamados abertos com Prioridade Alta - 100%',    
        @TIPO_EMAIL INT = 0    
    AS        
        
    SET NOCOUNT ON    
        
        DECLARE @OMAIL        INT -- OBJETO CDONTS    
        DECLARE @RESULTADO    INT -- RESULTADO DAS CHAMADAS DO OBJETO    
        
        -- CORRIGINDO OS ENDEREÇOS DE EMAILS     
        SET @FROM_ADDRESS = REPLACE(@FROM_ADDRESS, ' ', '')    
        SET @FROM_ADDRESS = REPLACE(@FROM_ADDRESS, ';', ',')    
            
        SET @TO_ADDRESS = REPLACE(@TO_ADDRESS, ' ', '')    
        SET @TO_ADDRESS = REPLACE(@TO_ADDRESS, ';', ',')    
            
        SET @CC_ADDRESS = REPLACE(@CC_ADDRESS, ' ', '')    
        SET @CC_ADDRESS = REPLACE(@CC_ADDRESS, ';', ',')    
            
        SET @BCC_ADDRESS = REPLACE(@BCC_ADDRESS, ' ', '')    
        SET @BCC_ADDRESS = REPLACE(@BCC_ADDRESS, ';', ',')    
            
        EXEC @RESULTADO = SP_OACREATE 'CDONTS.NEWMAIL', @OMAIL OUT -- INSTANCIANDO O OBJETO CDONTS    
        
        IF @RESULTADO = 0 -- VERIFICANDO SE FOI POSSÍVEL CRIAR O OBJETO    
        BEGIN     
    
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'FROM'    , @FROM_ADDRESS -- ENDEREÇO DE EMAIL FROM    
        
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'TO'        ,    @TO_ADDRESS    -- ENDEREÇO DE EMAIL TO    
                
            -- VERIFICANDO SE O ENDEREÇO CC NÃO ESTÁ VAZIO    
            IF @CC_ADDRESS <> ''    
            BEGIN    
                EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'CC',  @CC_ADDRESS    -- ENDEREÇO DE EMAIL CC    
            END    
                    
            -- VERIFICANDO SE O ENDEREÇO BCC NÃO ESTÁ VAZIO    
            IF @BCC_ADDRESS <> ''    
            BEGIN    
                EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'BCC',  @BCC_ADDRESS    -- ENDEREÇO DE EMAIL BCC    
            END    
        
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'SUBJECT', @ASSUNTO_EMAIL    -- ASSUNTO    
            select @id
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'BODY', @MENSAGEM_EMAIL, @id  -- CORPO DO EMAIL    
                
            -- TIPO DE EMAIL (TEXTO/HTML)    
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'BODYFORMAT', @TIPO_EMAIL     
            EXEC @RESULTADO = SP_OASETPROPERTY @OMAIL, 'MAILFORMAT', @TIPO_EMAIL    
        
            -- ENVIANDO O EMAIL            
            EXEC @RESULTADO = SP_OAMETHOD @OMAIL, 'SEND', NULL    
                
            EXEC SP_OADESTROY @OMAIL -- DESTRUINDO A INSTANCIA DO OBJETO CDONTS    
        END    
    SET NOCOUNT OFF


    com certeza eu recuperar o @id errado, pode me ajudar?

    Darth Tsurth


    • Editado Dudú segunda-feira, 22 de abril de 2013 16:02 correcao
    sexta-feira, 19 de abril de 2013 13:05
  • ninguem?

    Darth Tsurth

    segunda-feira, 22 de abril de 2013 20:39
  • continuo com problema nesse assunto, alguem pode me ajudar?

    Darth Tsurth

    sexta-feira, 10 de maio de 2013 13:31