Usuário com melhor resposta
Inserção em Lote de um SELECT para um Store Procedure

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
Respostas
-
Deleted
- Marcado como Resposta Moizés Cerqueira terça-feira, 19 de março de 2019 17:22
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
- Marcado como Resposta Moizés Cerqueira 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]
- Editado Junior Galvão - MVPMVP terça-feira, 19 de março de 2019 13:23
-
-
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]
- Editado Junior Galvão - MVPMVP terça-feira, 19 de março de 2019 18:32
-
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
-
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
- Marcado como Resposta Moizés Cerqueira terça-feira, 19 de março de 2019 17:24
-
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]
-
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]