none
Abrir Ficheiro Guardado num BD Sql Server 2005 RRS feed

  • Pergunta

  • Boas pessoal,

    Eu tenho uma tabela de ficheiros que contem um campos do tipo varbinary(max) e nesse campo contem os ficheiro de qualquer tipo .txt, .jpg, .pdf, .doc, ...

    A inserção é feita do seguinte modo:

    CREATE TABLE t_Ficheiro (ft_Nome varchar(100), ft_Extensao varchar(10), fo_File varbinary(max)) GO INSERT INTO t_Ficheiro (ft_Nome, ft_Extencao, fo_File) SELECT 'filename' AS ft_Nome, '.pdf' AS ft_Extencao, * FROM OPENROWSET(BULK N'C:\filename.pdf', SINGLE_BLOB) AS fo_File


    A questão é da mesma forma que com esta syntax INSERT e dizendo o caminho do ficheiro ele grava o ficheiro no campo do tipo varbinary(max),
    com um SELECT conseguiria que fazer o inverso.
    Dando um caminho ele pega-se o campo e criasse um ficheiro numa pasta?

    Nao sei se foi muito exclarecedor, mas agradecia algum tempo disponibilizado e alguma ajuda.

    Cumprimentos Tiago Araújo
    sexta-feira, 6 de novembro de 2009 12:24

Todas as Respostas

  • Olá Tiago,

    Veja se os links a seguir te ajudam!

    Como importar e exportar imagens entre o SQL Server e o File System ? – Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!601.entry

    Como importar e exportar imagens entre o SQL Server e o File System ? – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!612.entry

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados


    Blog: http://heberton-melo.spaces.live.com

    sexta-feira, 6 de novembro de 2009 12:49
  • Tiago,

    Uma maneira é o BCP

    bcp "SELECT cast(Document as varchar) FROM myTable WHERE [FileName] = 'Text1.txt' " queryout C:\Text1-1.txt -c -T


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 6 de novembro de 2009 12:51
  • Marcelo,

    Nao sei porquê mas ao executar o codigo que você sugeriu dá um erro!!


    Incorrect syntax near 'queryout'.


    Saberá qual a razão?
    Eu tenho que substituir por alguma coisa o -c -t?

    Eu neste contexto do Sql inda é muito novo para mim. E na realidade nao sei por onde pegar para resolver isto.

    Cumprimentos Tiago Araújo.
    sexta-feira, 6 de novembro de 2009 15:37
  • Tiago

    neste exemplo o BCP deve ser executado na linha de comando (DOS)
    se vc quiser executar pelo Management Studio deve usar o xp_cmdshell

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 6 de novembro de 2009 16:24

  • Marcelo,

    Ok, mas eu queria poder executar no Management Studio.

    Consegue-me arranjar um exemplo?

    Já tive a procura de algumas coisas tive que configurar e habilitar o xp_cmdSell. Mas resultados inda nao consegui obter.

    Cumprimentos Tiago Araújo
    sexta-feira, 6 de novembro de 2009 17:05
  • Tiago,

    Existem diversas maneiras p/ vc gerar estes arquivos, BCP, SSIS, OLE AUtomation etc...

    segue um link com os OLE automation que acho uma boa solucao e segura.

    http://www.simple-talk.com/sql/t-sql-programming/reading-and-writing-files-in-sql-server-using-t-sql/


    Segue um exemplo do xp_cmdshell  (nao é muito seguro)

    Exec master..xp_cmdshell 'bcp "select name from sysobjects"  queryout "C:\Text1-1.txt" -c -T'
    


    OBS: Por seguranca o xp_cmdshell vem desabilitado, portanto avalie bem antes de decidir por usar o xp_cmdshell

     


    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 6 de novembro de 2009 18:01
  • Marcelo,

    Nao sei porque mas nao esta a funcionar pelo xp_cmdshell. Ja configurei pelo SQL Server Surface Area Configuration.

    Eu tentei pelo BCP mas esta a dar uma série de erros.
    Tive a ver alguns artigos sobre OLE Automation mas obtive nenhum resultado esperado.
    Vou fazer isso por codigo no meu projecto em vb.net.

    Abaixo esta o exemplo que usei mas ao fim de 18seg dá os segintes erros:

    Exec

     

    indoc..xp_cmdshell 'bcp "select ft_nome from t_ficheiro where fn_id=1" queryout "D:\123.txt" -c -T'

    SQLState = 08001, NativeError = 2
    Error = [Microsoft][SQL Native Client]Named Pipes Provider: Could not open a connection to SQL Server [2].
    SQLState = 08001, NativeError = 2
    Error = [Microsoft][SQL Native Client]An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connecti
    ons.
    SQLState = S1T00, NativeError = 0
    Error = [Microsoft][SQL Native Client]Login timeout expired
    NULL

    Cumprimentos Tiago Araújo

    segunda-feira, 9 de novembro de 2009 10:23
  • Thiago

    o server esta na mesma maquina que vc esta rodando sua aplicacao? caso nao envie o parametro do servidor.

    xp_cmdshell 'bcp "select ft_nome from t_ficheiro where fn_id=1" queryout "D:\123.txt" -c -T -Sserversql'


    segue um link do bol com os parametros do BCP
    ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/sqlcmpt9/html/c0af54f5-ca4a-4995-a3a4-0ce39c30ec38.htm


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    segunda-feira, 9 de novembro de 2009 12:15
  • Marcelo

    Neste momento o servidor está na mesma máquina da aplicação. Mas mais tarde a BD estará num servidor. E a minha aplicacao em PC's clientes que vam aceder ao BD do servidor.
    Eu para já arranjei uma solucao para este problema via codigo mas nao vai durar muito. E queria ver isto resolvido por BCP.

    Esperimentei com o mais o parametro do servidor mas continua a dar erro que nao se consegue ligar ao servidor de SQLserver. E erro: Login timeout expired.

    Uma questão para isso nao deviamos dar os parametros de utilizador e PW? Exemplo "-SServersql -UserID -UserPW".

    Eu estou testando isto num StoredProcedures no SQLServer Management Studio, nao sei que impacto é que isso tem no sucesso da string sql.

    Cumprimentos Tiago Araújo

    quinta-feira, 12 de novembro de 2009 12:39