Usuário com melhor resposta
Stored Procedures Duvidas

Pergunta
-
preciso fazer uma extração em lote, eu consigo criar o SP com condição?
essa é a tarefa que eu preciso executar, mais preciso que ela seja repetida para cada fornecedor (sao 85 no total)
eu preciso criar os SP gerar arquivos, nesse caso eu preciso criar 85 SP ou consigo criar um unico SP colocando um where para cada fornecedor?
o SP criado foi:
create procedure layout_test2 AS select CPF,ID_CONVENIO,MATRICULA,ID_BANCO,PMT,MODO_CALC,TAXA,TERMINO,CONTRATO FROM [base_siape].[dbo].[TB_04_ABRIL_D8]
Respostas
-
Junior,
bom dia!
deu certo usando o <-T "-t ;" -c -C ACP>
agora que consigo enviar um SP via BCP volto p inicio do post, pq eu fiz um SP para criar um select e salvar como arquivo.
eu preciso gerar um select de acordo com fornecedor, sao 89 fornecedores
eu preciso criar um SP para cada ou eu consigo fazer um select gravar no SP e na execução por um where para cada ref da coluna fornecedor?
Djacy,
Que bom, conseguimos avançar!!!
Em relação a sua outra dúvida, você pode fazer das duas formas, agora é questão de analisar o que seria melhor, ao meu ver o mais indicado seria criar uma Stored Procedure que vai lendo fornecedor por fornecedor, chamando o BCP e enviando os arquivos.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Djacy sexta-feira, 29 de maio de 2020 23:04
Todas as Respostas
-
-
preciso fazer uma extração em lote, eu consigo criar o SP com condição?
essa é a tarefa que eu preciso executar, mais preciso que ela seja repetida para cada fornecedor (sao 85 no total)
eu preciso criar os SP gerar arquivos, nesse caso eu preciso criar 85 SP ou consigo criar um unico SP colocando um where para cada fornecedor?
o SP criado foi:
create procedure layout_test2 AS select CPF,ID_CONVENIO,MATRICULA,ID_BANCO,PMT,MODO_CALC,TAXA,TERMINO,CONTRATO FROM [base_siape].[dbo].[TB_04_ABRIL_D8]
Djacy,
Você tem certeza que deseja usar uma Stored Procedure, não seria uma View?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Djacy,
Certo, por esta caminho é uma ótima possibilidade.
Mas para cada Select? Acredito que seja algo mais específico.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Djacy,
Este export do CSV você deseja fazer diretamente via query?
Já pensou em utilizar a ferramenta de linha de comando BCP ou até mesmo o comando Bulk Insert?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
eu ja tentei pelo bcp mais ai eu tenho problemas de conexao, eu nao sei dizer o que acontece.
@echo off echo INICIO DO BCP...%TIME% ECHO ARQUIVO CARREGANDO DADOS, AGUARDE... BCP "EXECUTE dbo.layout_test2" queryout modelo.csv -S DSK-AKRK-9822\SQLEXPRESS -U sa -P Akrk@001 -d BASE_SIAPE -T -c -C ACP PAUSE END
esse foi o script o banco esta instalado na propria maquina. e esse é o erro:
-
Djacy,
Notei que você esta utilizando o usuário SA!!!
Mas esta note que a falha de login estão ocorrendo para o usuário Djacy.Neto.
Acredito que seria necessário verificar qual é a forma de autenticação que você esta utilizando neste SQL Server.
Ao realizar o login via Management Studio, você utiliza qual conta de usuário ou login?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
certo, no ssms eu tenho a autenticação pelo usuario sa, mais tambem posso usar a autenticação do windows.
eu tentei usando o usuario que eu criei "sa" e tambem tentei pelo usuario do windows, e ambos apresentaram este erro...
eu tenho sqldbx e consigo acessar ao banco com mesmo usuario e senha que coloquei no script e deu certo.
-
Djacy,
Ok, note que o erro 18456 se relaciona com dados incorretos fornecidos no Logon, a senha esta correta?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Djacy,
Certo, perfeito, você esta entendendo as questões de permissão.
Faça o seguinte, remova o nome do schema dbo. antes do nome da Stored Procedure!!!! Veja se assim você consegui executar via BCP....
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Djacy,
Você já pensou em utilizar a opção -r?
Veja se este exemplo te ajuda:
DECLARE @raw_sql nvarchar (4000) SELECT @raw_sql = 'bcp "SELECT * FROM user" queryout '+' "D:\RPM\SSIS\Database_User_Information\user_information.txt" -c -t";" -T' EXEC xp_cmdshell @raw_sql
@echo off echo INICIO DO BCP...%TIME% ECHO ARQUIVO CARREGANDO DADOS, AGUARDE... BCP "EXECUTE dbo.layout_test2" queryout modelo.csv -S DSK-AKRK-9822\SQLEXPRESS -U sa -P Akrk@001 -d BASE_SIAPE -T -t";" -c -C ACP PAUSE END
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | 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 quinta-feira, 28 de maio de 2020 22:53
-
Junior,
bom dia!
deu certo usando o <-T "-t ;" -c -C ACP>
agora que consigo enviar um SP via BCP volto p inicio do post, pq eu fiz um SP para criar um select e salvar como arquivo.
eu preciso gerar um select de acordo com fornecedor, sao 89 fornecedores
eu preciso criar um SP para cada ou eu consigo fazer um select gravar no SP e na execução por um where para cada ref da coluna fornecedor?
-
Você pode fazer um serviço que faz essa chamada pra você repetidamente.
Passando os parâmetros que você necessita.
Pode ser um trigger também.
Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.
Mauricio Junior - Comunidade www.ecode10.com -
Junior,
bom dia!
deu certo usando o <-T "-t ;" -c -C ACP>
agora que consigo enviar um SP via BCP volto p inicio do post, pq eu fiz um SP para criar um select e salvar como arquivo.
eu preciso gerar um select de acordo com fornecedor, sao 89 fornecedores
eu preciso criar um SP para cada ou eu consigo fazer um select gravar no SP e na execução por um where para cada ref da coluna fornecedor?
Djacy,
Que bom, conseguimos avançar!!!
Em relação a sua outra dúvida, você pode fazer das duas formas, agora é questão de analisar o que seria melhor, ao meu ver o mais indicado seria criar uma Stored Procedure que vai lendo fornecedor por fornecedor, chamando o BCP e enviando os arquivos.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Djacy sexta-feira, 29 de maio de 2020 23:04
-
isso mesmo!
eu deixei o SP assim:
CREATE PROCEDURE layout_test @fornecedor as varchar(50) as select coluna1,coluna2,coluna3,coluna4,coluna5,coluna6 FROM tabela_Raiz
agora para executar eu nao estou sabendo como declarar o fornecedor
exec layout_test, 'fornecedor' -> ele da erro na ","
exec layout_test 'fornecedor' -> ele nao entende e processa a tabela toda
exec layout_test, forncededor -> ele da erro na ","
exec layout_test fornecedor -> ele nao entende e processa a tabela toda
-
Djacy,
Você esta fazendo uma ligeira confusão.... Na hora de executar a Stored Procedure não se utiliza vírgula antes dos parâmetros, por isso, esta tendo erros quando executou passando a vírgula.
Na código fonte da sua Stored Procedure você vai ter que alterar a estrutura do mesmo, adaptando para que seja feita a leitura do cada fornecedor e assim vai gerando os arquivos.
Sendo assim, vai ser necessário alterar o código fonte, e não fazer a passagem na hora de executar, pois você lendo uma tabela em específico.
Declare dentro do código fonte uma variável para servir de controle, a qual você vai utilizar para ir passando durante um loop de execução através de um While, If ou até mesmo CTE Recursiva os números dos fornecedores, o valor que vai sendo passado para variável, vai ser aproveitado no Select que você já elaborou para pegar os dados na tabela de fornecedores.
Conforme os fornecedores e seus respectivos dados vão sendo identificados, você execute o processo de geração dos arquivos dentro da própria Stored Procedure.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Junior,
sim, eu não estava sabendo declarar os critérios, por isso o erro.
marquei sua ultima resposta como solução porque fez eu enxergar o que estava errado. e ficou assim:
create PROCEDURE [dbo].[layout_output] @fornecedor as varchar(50) as select Coluna1,Coluna2,Coluna3,Coluna4,Coluna5,Coluna6, FROM BASES.dbo.TB_05_MAIO_D8 where id_fornecedor=@fornecedor
e o meu bcp assim:
@echo off echo INICIO DO BCP...%TIME% ECHO ARQUIVO CARREGANDO DADOS, AGUARDE... BCP "EXEC layout_output 'fornecedor1'" queryout fornecedor1.csv -S DSK-AKRK-9822\SQLEXPRESS -U djacy.neto -P 001 -d BASES -T -c -t ; -C ACP PAUSE END
tudo certo! agora vou somente aumentar o script com as linhas para cada fornecedor,
muito obrigado mesmo!!!
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 1 de junho de 2020 21:48
-
Junior,
sim, eu não estava sabendo declarar os critérios, por isso o erro.
marquei sua ultima resposta como solução porque fez eu enxergar o que estava errado. e ficou assim:
create PROCEDURE [dbo].[layout_output] @fornecedor as varchar(50) as select Coluna1,Coluna2,Coluna3,Coluna4,Coluna5,Coluna6, FROM BASES.dbo.TB_05_MAIO_D8 where id_fornecedor=@fornecedor
e o meu bcp assim:
@echo off echo INICIO DO BCP...%TIME% ECHO ARQUIVO CARREGANDO DADOS, AGUARDE... BCP "EXEC layout_output 'fornecedor1'" queryout fornecedor1.csv -S DSK-AKRK-9822\SQLEXPRESS -U djacy.neto -P 001 -d BASES -T -c -t ; -C ACP PAUSE END
tudo certo! agora vou somente aumentar o script com as linhas para cada fornecedor,
muito obrigado mesmo!!!
Djacy,
Ok, que bom, obrigado pelo retorno.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
aproveitando o contato,
como faz para que o arquivo tenha o cabeçalho das colunas?
Djacy,
Então ele deveria levar o nome das colunas, pois as mesmas estão sendo declaradas no Select.
Mas uma alternativa caso isso não esteja acontecendo será adicionar a opção -r"\"
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]