none
Stored Procedures Duvidas RRS feed

  • 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]

    terça-feira, 19 de maio de 2020 19:36

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
    sexta-feira, 29 de maio de 2020 18:49

Todas as Respostas

  • O que voce precisa fazer exatamente? Consegue detalhar sua necessidade?

    Voce consegue fazer isso com cursor ou while. Mas para dar uma resposta mais assertiva, me informe o que voce precisa fazer exatamente.


    Fabiano Carvalho

    quarta-feira, 20 de maio de 2020 13:28
  • 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]

    quarta-feira, 20 de maio de 2020 21:42
  • na verdade eu preciso criar arquivos em csv para cada select, pensei em usar o SP pq ja usei para outras tarefas,

    por isso pensei em usar o SP

    sexta-feira, 22 de maio de 2020 18:34
  • 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]

    sexta-feira, 22 de maio de 2020 21:40
  • o select é esse:

    select coluna1,coluna2,coluna3,coluna4,coluna5,coluna6, from tabela1
    
    where coluna8 = 'produto'

    dai eu preciso fazer um csv para cada produto....

    quarta-feira, 27 de maio de 2020 18:26
  • 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?

    https://docs.microsoft.com/en-us/sql/relational-databases/import-export/bulk-import-and-export-of-data-sql-server


    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]

    quarta-feira, 27 de maio de 2020 22:52
  • 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:

    quinta-feira, 28 de maio de 2020 18:55
  • 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]

    quinta-feira, 28 de maio de 2020 19:18
  • 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.

    quinta-feira, 28 de maio de 2020 19:45
  • 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]

    quinta-feira, 28 de maio de 2020 19:59
  • acabei de ver aqui nos logons e nao havia o login da maquina (usuario local windows)

    acabei de criar e dar permissão para o banco, agora meu script esta assim:

    quinta-feira, 28 de maio de 2020 20:05
  • 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]

    quinta-feira, 28 de maio de 2020 20:16
  • Certo!

    consegui dar permissao ao banco e a SP e foi executado! agora eu nao sei onde eu declaro o ";" como delimitador para os campos 

    pq sem isso o arquivo vira uma salada



    • Editado Djacy quinta-feira, 28 de maio de 2020 20:52 correção
    quinta-feira, 28 de maio de 2020 20:31
  • Djacy,

    Você já pensou em utilizar a opção -r?

    https://docs.microsoft.com/pt-br/sql/relational-databases/import-export/specify-field-and-row-terminators-sql-server?view=sql-server-ver15

    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]


    quinta-feira, 28 de maio de 2020 22:50
  • 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?

    sexta-feira, 29 de maio de 2020 13:32
  • 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

    sexta-feira, 29 de maio de 2020 14:30
  • 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
    sexta-feira, 29 de maio de 2020 18:49
  • 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

    sexta-feira, 29 de maio de 2020 20:50
  • 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]

    sábado, 30 de maio de 2020 14:31
  • 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!!!


    segunda-feira, 1 de junho de 2020 15:00
  • 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]

    segunda-feira, 1 de junho de 2020 21:48
  • aproveitando o contato, 

    como faz para que o arquivo tenha o cabeçalho das colunas?

    segunda-feira, 1 de junho de 2020 22:35
  • 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"\"

    https://docs.microsoft.com/pt-br/sql/relational-databases/import-export/specify-field-and-row-terminators-sql-server?view=sql-server-ver15


    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]

    segunda-feira, 1 de junho de 2020 23:13