none
Executar Query após criação de um arquivo de texto Externo RRS feed

  • Pergunta

  • Boa tarde, sou novato aqui e com sql e estou criando uma rotina semelhante ao do post acima, vamos lá, tenho um diretório vazio que às vezes nele é criado sempre o mesmo arquivo mas com o conteúdo diferente chamado: "arquivo.txt"  e dentro deste arquivo tem somente 3 linhas com informações abaixo:

    cStat=01
    xMotivo=Convertido com sucesso. Foi(ram) convertida(s) 1 nota(s) fiscal(is)
    Nota fiscal: 000004172 Série: 001 - ChaveNFe: 35130901394193000175550010000041721314770008

    Minha necessidade é a seguinte, assim que criado esse arquivo neste diretório o banco de dados do SQL SERVER 2005 armazenasse automáticamente em duas variáveis somente duas informações que são os números que estão na frente do texto "Nota fiscal" e "ChaveNFE" e posteriormente renomearia esse arquivo conforme o numero que esta na frente da "Nota Fiscal" e assim por diante com os novos arquivos que fossem criados neste diretório, exemplo:

    Seria armazenado em uma coluna: 000004172

    Seria armazenado em uma coluna: 35130901394193000175550010000041721314770008

    Seria renomeado o arquivo para: 000004172.txt

    Será que consegui explicar.....

    sábado, 7 de setembro de 2013 14:09

Respostas

  • Olá,

    Segue um exemplo com atender a sua demanda:

    -- este block deve ser executado 1 vez para habilitar a procedure extendida xp_cmdshell
    -- opções avançadas do sql SQL Sevrer : http://bobgalvao.wordpress.com/2013/08/27/consultando-e-alterando-opcoes-avancadas-no-sql-server/
    
    exec sp_configure 'show advanced options', 1
    go
    reconfigure
    go
    exec sp_configure 'xp_cmdshell', 1
    go
    reconfigure
    go
    
    --_______________________________________________________
    
    -- ler linhas do arquivo txt.
    declare @linha table (id int identity (1,1), strLinha nvarchar(max))
    declare @nota varchar(100)
    declare @chave varchar(1000)
    insert into @linha
    exec xp_cmdshell 'FOR /F "tokens=3" %i IN (C:\arq_teste.txt) DO @echo %i'
    
    select @nota = strLinha
    from @linha
    where id = 2
    
    delete from @linha
    
    insert into @linha
    exec xp_cmdshell 'FOR /F "tokens=8" %i IN (C:\arq_teste.txt) DO @echo %i '
    
    select @chave = strLinha
    from @linha
    where id = 5
    
    --_________________________________________________
    --renomear o arquivo
    declare @cmd nvarchar(max) 
    set @cmd = 'exec xp_cmdshell ''RENAME C:\arq_teste.txt ' + cast(@nota as varchar(100)) + '.txt'''
    
    exec sp_executesql @cmd
    
    select @nota as nota, @chave as chaveNFE
    
    

    Arquivo renomeado:

    Também é possível ler arquivo txt utilizando o comando OPENROWSET: http://technet.microsoft.com/pt-br/library/ms190312.aspx

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012
    Blog: http://bobgalvao.wordpress.com


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    sábado, 7 de setembro de 2013 22:59
  • Olá, Você pode utilizar o SQL AGENT para agendar trabalhos no SQL Server. Neste link você vai ver como se realiza este procedimento: http://fabrizziocaputo.wordpress.com/2011/09/01/sql-server-basico-4-agendando-um-job-no-sql-server/ Link MSDN com a documentação referente a job: http://technet.microsoft.com/en-us/library/ms190268.aspx Exemplo para a sua atividade: você pode criar um job para rodar seu script a cada minuto. "Se a resposta foi útil, não esqueça de marcar a resposta." Roberto Galvão MCITP - Administration SQL Server 2008 MCITP - Developer SQL Server 2008 MCSA - SQL Server 2012 Blog: http://bobgalvao.wordpress.com
    domingo, 8 de setembro de 2013 01:40

Todas as Respostas

  • Olá,

    Segue um exemplo com atender a sua demanda:

    -- este block deve ser executado 1 vez para habilitar a procedure extendida xp_cmdshell
    -- opções avançadas do sql SQL Sevrer : http://bobgalvao.wordpress.com/2013/08/27/consultando-e-alterando-opcoes-avancadas-no-sql-server/
    
    exec sp_configure 'show advanced options', 1
    go
    reconfigure
    go
    exec sp_configure 'xp_cmdshell', 1
    go
    reconfigure
    go
    
    --_______________________________________________________
    
    -- ler linhas do arquivo txt.
    declare @linha table (id int identity (1,1), strLinha nvarchar(max))
    declare @nota varchar(100)
    declare @chave varchar(1000)
    insert into @linha
    exec xp_cmdshell 'FOR /F "tokens=3" %i IN (C:\arq_teste.txt) DO @echo %i'
    
    select @nota = strLinha
    from @linha
    where id = 2
    
    delete from @linha
    
    insert into @linha
    exec xp_cmdshell 'FOR /F "tokens=8" %i IN (C:\arq_teste.txt) DO @echo %i '
    
    select @chave = strLinha
    from @linha
    where id = 5
    
    --_________________________________________________
    --renomear o arquivo
    declare @cmd nvarchar(max) 
    set @cmd = 'exec xp_cmdshell ''RENAME C:\arq_teste.txt ' + cast(@nota as varchar(100)) + '.txt'''
    
    exec sp_executesql @cmd
    
    select @nota as nota, @chave as chaveNFE
    
    

    Arquivo renomeado:

    Também é possível ler arquivo txt utilizando o comando OPENROWSET: http://technet.microsoft.com/pt-br/library/ms190312.aspx

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012
    Blog: http://bobgalvao.wordpress.com


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    sábado, 7 de setembro de 2013 22:59
  • Nem acredito que deu certo, não ia conseguir tão cedo executar tantos comandos, muito obrigado mesmo, hein Roberto se não for pedir de demais, se é que tem como, que ao cair o arquivo "arq_teste.txt" no diretório "C:\" o query seje executado automaticamente, sozinho, sem ter que eu clicar Execute ????

    domingo, 8 de setembro de 2013 00:54
  • Olá, Você pode utilizar o SQL AGENT para agendar trabalhos no SQL Server. Neste link você vai ver como se realiza este procedimento: http://fabrizziocaputo.wordpress.com/2011/09/01/sql-server-basico-4-agendando-um-job-no-sql-server/ Link MSDN com a documentação referente a job: http://technet.microsoft.com/en-us/library/ms190268.aspx Exemplo para a sua atividade: você pode criar um job para rodar seu script a cada minuto. "Se a resposta foi útil, não esqueça de marcar a resposta." Roberto Galvão MCITP - Administration SQL Server 2008 MCITP - Developer SQL Server 2008 MCSA - SQL Server 2012 Blog: http://bobgalvao.wordpress.com
    domingo, 8 de setembro de 2013 01:40