Passando dados binários para um procedimento armazenado no SQL Server 2008
-
20-09-2019 - |
Pergunta
Estou tentando descobrir uma maneira de armazenar arquivos em um banco de dados. Sei que é recomendável armazenar arquivos no sistema de arquivos, em vez do banco de dados, mas o trabalho em que estou trabalhando prefere usar o banco de dados para armazenar essas imagens (arquivos).
Existem também algumas restrições. Não sou um usuário administrador e tenho que fazer procedimentos armazenados para executar todos os comandos. Até agora, isso não foi de muita dificuldade, mas não posso, para a vida de mim, estabelecer uma maneira de armazenar um arquivo (imagem) no banco de dados.
Quando tento usar o comando em massa, recebo um erro dizendo "Você não tem permissão para usar a instrução de carga em massa". O utilitário em massa parecia a maneira mais fácil de fazer upload de arquivos para o banco de dados, mas sem permissões, tenho que descobrir uma rodada de trabalho.
Decidi usar um formulário HTML com um tipo de entrada de upload de arquivo e lidar com PHP. O PHP chama o procedimento armazenado e passa no conteúdo do arquivo. O problema é que agora está dizendo que o comprimento máximo de um parâmetro pode ter apenas 128 caracteres.
Agora estou completamente preso. Não tenho permissões para usar o comando em massa e parece que o comprimento máximo de um parâmetro que posso passar para o SP é de 128 caracteres.
Eu esperava ter problemas porque personagens binários e personagens ASCII não se misturam bem, mas estou em um beco sem saída ...
Obrigado
Solução
Aqui está um exemplo que encontrei no blog de David Hayden.
É um exemplo AC#, mas as etapas devem ser semelhantes no PHP:
- Converta seu arquivo carregado em uma matriz de bytes
- Executar o TSQL dinâmico no servidor
Outras dicas
Em geral, não passamos dados binários no SQL. Nós carregamos o arquivo no servidor e, em seguida, carregamos a imagem do servidor no banco de dados.
Carregue a imagem no banco de dados de um arquivo:
UPDATE images
SET image = LOAD_FILE('images/myimage.jpg')
WHERE image_id = 1234
Retire a imagem de volta a um arquivo:
SELECT image
INTO DUMPFILE 'images/myimage.jpg'
FROM images
WHERE image_id = 1234