none
Inserção em Lote de um SELECT para um Store Procedure RRS feed

  • Pergunta

  • Pessoal,

    Preciso criar um job agendado no SQL onde faço um SELECT de um banco que usarei  de parâmetros para uma Store Proceadure, onde será feito insert e update em outra tabela de outro banco.

    Já tenho a PROC pronta mais não sei como faço isso para fazer esta inserção em lote automatizada.

    Exemplo:

    Terei esta query de select:

     SELECT userName, pode_sair_com FROM v_Tipo_saida_JOIN

    Que me retorna 2 campos que usarei como parâmetro para inserir em uma proc.

    Esta é minha PROC

    CREATE PROCEDURE [dbo].[st_Update_TipoSaida]
    /*	''===============================================================
    	''   NAME:                	[[st_Update_TipoSaida]]
    	''   DATE CREATED:       	18 de Março de 2019
    	''   CREATED BY:          	Moizés Cerqueira
    	''   CREATED FOR:         	CMS
    	''   FUNCTION:            	Update na tabela [School].[TypeOutput]
    	''   IN:                  
    	''   OUT:                 	
    	''   VERSION: 1           
    	''   EXAMPLE:             
    	''   COMMENTS:            
    	''   MODIFIED ON:         
    	''   MODIFIED BY:         
    	''   REASON MODIFICATION: 
    	''===============================================================*/
    
         @UserName varchar(50),
         @TypeOutputDesc varchar(250),
         @Amount int,
         @LastDate datetime
    
       
    
    	AS
    	
    	IF EXISTS( SELECT userName, pode_sair_com FROM v_Tipo_saida_JOIN WHERE UserName = @UserName)
    	BEGIN
    		UPDATE School.TypeOutput SET			
    			
    			TypeOutputDesc = @TypeOutputDesc
    		
    			
    
    		WHERE 
    			 UserName = @UserName  
    	END
    	ELSE
    	BEGIN
    			INSERT INTO School.TypeOutput
    			(
    				UserName,
    				TypeOutputDesc,
    				Amount,
    				LastDate
    			)
    			VALUES
    			(
    				@UserName,
    				@TypeOutputDesc,
    				1,
    				GETDATE()
    			)
    	END
    


    Só preciso chamar o select acima e usa-lo em lote como parâmero para inserir usando a proc.

    Alguém consegue me dar uma luz como faço isso?



    Moizés Cerqueira | MCP / MCTS SQL SERVER


    terça-feira, 19 de março de 2019 12:15

Respostas

  • Deleted
    terça-feira, 19 de março de 2019 13:59
  • José Diz

    obrigado ajudou bastante fiz umas pequenas alterações e consegui rodar criei um job que fara a função diariamente.

    Ficou assim:

    USE CMS
    
    -- código #1 
    -- Autor: José Diz/BH
    
    -- carrega tabela temporária com os valores
    CREATE TABLE #tbID (Seq int identity primary key, userName varchar(50), pode_sair_com varchar(250));
    
    INSERT into #tbId (userName, pode_sair_com) 
       SELECT userName, pode_sair_com 
         from v_Tipo_saida_JOIN
    	-- WHERE userName = '452070'
    	 ;
    
    --
    declare @S int, @t_userName varchar(50),  @t_pode_sair_com varchar(250);
    
    -- lê primeiro
    SELECT top (1) @t_userName= userName, @t_pode_sair_com= pode_sair_com, @S= Seq
      from #tbID 
      order by Seq;
    
    while @@rowcount > 0
      begin
      EXECUTE [dbo].[st_Update_TipoSaida] 
              @UserName= @t_userName,
              @TypeOutputDesc= @t_pode_sair_com,
              @Amount= 1,
              @LastDate= NULL;
    
      -- lê próximo
      SELECT top (1) @t_userName= userName, @t_pode_sair_com= pode_sair_com, @S= Seq
        from #tbID 
        where Seq > @S
        order by Seq;
      end;
    
    --
    DROP TABLE #tbID;
    
    --
    --Select UserName, TypeOutputDesc, Amount, LastDate From School.TypeOutput
    -- WHERE UserName = '452070'
    
    --SELECT userName, pode_sair_com 
    --     from v_Tipo_saida_JOIN
    --	 WHERE userName = '452070'

    Obrigado a todos!


    Moizés Cerqueira | MCP / MCTS SQL SERVER

    terça-feira, 19 de março de 2019 17:24

Todas as Respostas

  • Moizés,

    Basta você colocar no Step do seu Job, o comando de execução da sua Stored Procedure acompanhada logo abaixo do comando Select.

    Exemplo:

    Exec dbo.st_Update_TipoSaida (@UserName, @TypeOutDesc, @Amount, @LastDate)
    SELECT userName, pode_sair_com, '','' FROM v_Tipo_saida_JOIN


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    terça-feira, 19 de março de 2019 12:19
  • Pedro,

    Desculpe mas não entendi porque os parâmetros são chamados antes do SELECT e não estou dizendo de onde é a origem dos paramétrios.


    Moizés Cerqueira | MCP / MCTS SQL SERVER

    terça-feira, 19 de março de 2019 13:09
  • Moízes,

    Desculpe-me você tem razão, acabou me confundindo, primeiro é o Select repassando os valores para seus parâmetros, posteriormente o Exec da Stored Procedure.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    terça-feira, 19 de março de 2019 13:20
  • Desculpe minha ignorancia mas não ficou cara para mim, estou tentando ir poor este caminho:

    USE CMS_Test
    
    declare rscursor cursor read_only
    
    FOR 
    
    SELECT userName, pode_sair_com, 1, GETDATE() FROM v_Tipo_saida_JOIN
    
    
    declare  @UserName varchar(50)
    declare     @TypeOutputDesc varchar(250)
    --declare     @Amount int
    --declare   @LastDate datetime
    
    open rscursor
    fetch next from rscursor into @UserName,@TypeOutputDesc
    while @@fetch_status=0
        begin
    
    	
    
    	Exec dbo.st_Update_TipoSaida
    	@UserName = userName,
    	@TypeOutputDesc = pode_sair_com,
    	@Amount = 1,
    	@LastDate = GETDATE;
    
    
           
    
        fetch next from rscursor into @UserName,@TypeOutputDesc
    end
    
    --close rscursor
    
    --deallocate rscursor


    Moizés Cerqueira | MCP / MCTS SQL SERVER

    terça-feira, 19 de março de 2019 13:37
  • Deleted
    terça-feira, 19 de março de 2019 13:59
  • José Diz

    obrigado ajudou bastante fiz umas pequenas alterações e consegui rodar criei um job que fara a função diariamente.

    Ficou assim:

    USE CMS
    
    -- código #1 
    -- Autor: José Diz/BH
    
    -- carrega tabela temporária com os valores
    CREATE TABLE #tbID (Seq int identity primary key, userName varchar(50), pode_sair_com varchar(250));
    
    INSERT into #tbId (userName, pode_sair_com) 
       SELECT userName, pode_sair_com 
         from v_Tipo_saida_JOIN
    	-- WHERE userName = '452070'
    	 ;
    
    --
    declare @S int, @t_userName varchar(50),  @t_pode_sair_com varchar(250);
    
    -- lê primeiro
    SELECT top (1) @t_userName= userName, @t_pode_sair_com= pode_sair_com, @S= Seq
      from #tbID 
      order by Seq;
    
    while @@rowcount > 0
      begin
      EXECUTE [dbo].[st_Update_TipoSaida] 
              @UserName= @t_userName,
              @TypeOutputDesc= @t_pode_sair_com,
              @Amount= 1,
              @LastDate= NULL;
    
      -- lê próximo
      SELECT top (1) @t_userName= userName, @t_pode_sair_com= pode_sair_com, @S= Seq
        from #tbID 
        where Seq > @S
        order by Seq;
      end;
    
    --
    DROP TABLE #tbID;
    
    --
    --Select UserName, TypeOutputDesc, Amount, LastDate From School.TypeOutput
    -- WHERE UserName = '452070'
    
    --SELECT userName, pode_sair_com 
    --     from v_Tipo_saida_JOIN
    --	 WHERE userName = '452070'

    Obrigado a todos!


    Moizés Cerqueira | MCP / MCTS SQL SERVER

    terça-feira, 19 de março de 2019 17:24
  • Deleted
    terça-feira, 19 de março de 2019 18:01
  • Pedro,

    Desculpe mas não entendi porque os parâmetros são chamados antes do SELECT e não estou dizendo de onde é a origem dos paramétrios.


    Moizés Cerqueira | MCP / MCTS SQL SERVER

    Moizés,

    Foi uma falha minha acabei me confundindo na resposta.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 19 de março de 2019 18:34
  • Moizés,

    Com base neste último post do José Diz, tenho uma solução que utilizei em alguns cenários, fazendo uso de cursor sendo processado através de uma analise condicional e no final chamando uma outro Stored Procedure, para ser processada levando-se em consideração os resultados manipulados:

    Create Procedure [dbo].[P_RegistroHistorico_PesquisaMovimentacaoParcial] @NUMPVM CHAR(7)
    AS
    Begin
    
    Set NoCount ON
    
    Truncate Table CTProducao_RegistroHistoricoParcial
    Truncate Table ResumoResultadosMP
    Truncate Table ResumoResultadosMO
    
    Declare  @NumControle Char(7),
                @Contador Int,
                @CodSigla Char(2)
    
    Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
    Select @NUMPVM, 
             NULL,
             CTPVMI.NUMCONTROLE, 
             MO.DescricaoProduto, 
             'MO' As Sigla
    from CTProducao_PVM_Items CTPVMI Inner Join CTProducao_Moinho MO
                                                        ON CTPVMI.NUMCONTROLE = MO.NUMMO
    Where CTPVMI.NUMPVM = @NumPVM
    And     CTPVMI.CodSigla = 'MO'
    Union
    Select @NUMPVM,
             NULL, 
             CTPVMI.NUMCONTROLE, 
             MP.Descricao, 
             'MP' As Sigla
    from CTProducao_PVM_Items CTPVMI Inner Join CTEntrada_PQC MP
                                                        ON CTPVMI.NUMCONTROLE = MP.NUMMP
    Where CTPVMI.NUMPVM = @NumPVM
    And     CTPVMI.CodSigla = 'MP'
    Order By CTPVMI.NumControle DESC
    
    Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NumControle, DescricaoProduto, CodSigla)
    Select  @NumPVM, NumRecebimento, DescricaoProduto, 'LT' From CTProducao_PVM
    Where NUMPVM=@NUMPVM
    
    If (Select Segundo_NumRecebimento From CTProducao_PVM Where NUMPVM = @NUMPVM) <> Null
     Begin
      Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NumControle, DescricaoProduto, CodSigla)
      Select  @NumPVM, NumRecebimento, DescricaoProduto, 'LT' From CTProducao_PVM
      Where NUMPVM=@NUMPVM 
     End
    
    Declare CTProducao_PVM_Itens_Cursor Cursor For
    Select NUMCONTROLE, CodSigla from CTProducao_PVM_Items
    Where NUMPVM = @NUMPVM
     
    Open CTProducao_PVM_Itens_Cursor
     
    Set @Contador = 0
    
     While @Contador < (Select Count(NUMPVM) From CTProducao_PVM_Items Where NumPVM = @NumPVM)
       Begin
        Fetch Next From CTProducao_PVM_Itens_Cursor
        Into @NumControle, @CodSigla
       
         If @CodSigla = 'MO'
          Begin             
            Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
            Select @NUMPVM, 
                     CTPMOI.NUMMO,
                     CTPMOI.Numcontrole, 
                     CTPMOI.DescricaoProduto,
                     CTPMOI.CodSigla
            From CTProducao_Moinho CTPMoinho Inner Join CTProducao_Moinho_Items CTPMOI
                                                               On CTPMoinho.NumMO = CTPMOI.NumMO
            Where CTPMoinho.NumMO = @NumControle
           End        
    
          If @CodSigla = 'MP'
           Begin
            Insert Into CTProducao_RegistroHistoricoParcial(NUMPVM, NUMMO, NumControle, DescricaoProduto, CodSigla)
            Select @NUMPVM, 
                      CTPMOI.NUMMO,
                      CTPMOI.NumControle, 
                      CTPMOI.DescricaoProduto, 
                      CTPMOI.CodSigla
             From CTEntrada_PQC CTEPQC Inner Join CTProducao_Moinho_Items CTPMOI 
                                                       On CTEPQC.NumMP = CTPMOI.NumControle
             Where CTPMOI.NumMO = @NumControle
            End
    
        Set @Contador = @Contador + 1
       End
    
     CLOSE CTProducao_PVM_Itens_Cursor
     DEALLOCATE CTProducao_PVM_Itens_Cursor
    
     Execute dbo.P_RegistroHistorico_ResumoResultadosPVMxMOxMP 
    End
    


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 19 de março de 2019 18:40