Revisão 7 postado em artigos TechNet por Durval Ramos em 26/6/2014 12:19:20
Para evitar perdas de dados ou arquivos, é recomendado o procedimento de armazenamento de uma imagem em um banco de dados no SQL Server. Esta é uma tarefa relativamente simples que pode tornar todo o processo de utilização de dados e arquivos muito mais eficiente e com menor possibilidade de perda de conteúdo (arquivos ou registros).
Incluir uma imagem em uma tabela exige que o arquivo seja convertido e uma alternativa muito útil para esta tarefa é utilizar o método OPENROWSET.
Para esta tarefa, vamos criar uma tabela simples, apenas com os campos que possam servir para a demonstração (Imagem 1).
Então adicionamos um campo para identificação do arquivo, chamado "NM_FILE" e outro para armazenar os dados binários do arquivo, chamado "CD_BYTES".
O nome do arquivo serve para ajudar na identificação do conteúdo que está sendo armazenado no banco de dados.
Imagem 1 - See this output SQL script in the image below
![]()
Script 1 - See this SQL script in the below
Com a tabela criada em seu banco de dados, é importante identificar quais são as imagens que serão adicionadas e se o usuário de sua instância SQL possui às permissões de acesso ao diretório do Windows onde sua imagem está armazenada.
Preferencialmente, para evitar lentidão e falhas de permissão é recomendado que os arquivos para inclusão em tabelas SQL estejam armazenadas em diretórios no mesmo servidor de sua instância SQL (Imagem 2).
Abaixo selecionamos uma imagem para teste, chamada "MyPhoto.jpg". Saber o formato do arquivo (identificado pela sua extensão, que neste caso é "image/jpg") é fundamental para reconstruir o arquivo binário, uma vez que o processo de leitura de dados através do método OPENROWSET, utilizando o argumento SINGLE_BLOB não obtém os dados binários do arquivo de forma otimizada para um determinado tipo de arquivo.
Isso facilita a inclusão de diferentes tipos de arquivos, porém obriga que o tipo do arquivo seja conhecido e definido na aplicação destino para qualquer exibição ou conversão de dados.
Imagem 2 - See the file sample in the image below
![]()
Para inserir uma imagem em seu banco de dados é necessário obter os dados binários deste arquivo. O modo mais simples para realizar esta tarefa é utilizando o método OPENROWSET, adicionando o argumento SINGLE_BLOB.
Este recurso possibilita obter os dados binários de qualquer arquivo, porque oferece suporte à todos os tipos de conversões de codificação do Windows (ASCII e UNICODE).
Com o usuário do seu serviço SQL com acesso ao diretório onde a imagem está armazenada, é possível utilizar o comando INSERT para incluir esta imagem em uma determinada tabela(Imagem 3), com outras informações que possam auxiliar na sua identificação se torna mais fácil, sendo necessário apenas a declaração de um BULKCOLUMN para obter os dados do arquivo.
Imagem 3 - See this output SQL script in the image below
![]()
Script 2 - See this SQL script in the below
Os dados binários armazenados na tabela de exemplo já estão prontos para uso. Para verificar que o arquivo foi armazenado corretamente, a melhor forma é visualizando a imagem.
Para isso podemos utilizar o objeto "Image" através de um Windows Form(.exe), um ASP.Net(.aspx) ou de um relatório "Report Data"(.rdl). Como estamos trabalhando com SQL Server, vamos validar se os dados binários não foram corrompidos consultando este registro através de um relatório.
Este artigo não pretende ensinar como você pode criar um relatório para o SQL Server Reporting Services (SSRS), mas apenas vamos demonstrar como consultar esta informação de demonstração.
Para obter os dados nesta validação, vamos definir um DataSet com os campos desejados e vincular os campos da tabela no corpo do Relatório (Imagem 4) usando dois objetos: um objeto TextBox para o nome do arquivo e um objeto Image para ler os dados binários e disponibilizar para exibição.
Imagem 4 - See this Design Report in the image below
![]()
No objeto Image é necessário definir alguns detalhes para a correta exibição (Imagem 5):
1 - Definir a origem dos dados como "Database";
2 - No campo "Use this field", clique no botão "Fx". A janela "Expression" se abrirá e assim podemos selecionar o campo "CD_BYTES" do nosso DataSet. Como vamos apenas obter o primeiro registro, utilizamos o método "First". Veja o código desta expressão abaixo:
=First(Fields!CD_BYTES.Value, "DataSet2")
3 - No campo "Use this MIME type", selecione o tipo de imagem esperado. No nosso exemplo vamos selecionar"image/jpeg".
Imagem 5 - See this windows in the image below (click to enlarge)
![]()
Para verificar rapidamente se o Relatório está exibindo os dados corretamente, vamos clicar na aba "Preview" e então a consulta será realizada para exibição dos dados (Imagem 6).
Como esperado, o nome do arquivo armazenado na nossa tabela de exemplo foi exibido junto com a imagem armazenada.
Imagem 6 - See this windows in the image below (click to enlarge)
![]()
É importante saber que é possível manter os dados binários de um arquivo armazenado diretamente em seu banco de dados, reduzindo ao máximo a vulnerabilidade de seu ambiente com a perda de um arquivo por um motivo qualquer, como a mudança de local de armazenamento dos arquivos no servidor Windows.
Introdução
Em algumas situações, obter uma imagem diretamente de um HD, consultando uma tabela para retornar um determinado diretório pode tornar o processo de replicação de dados e backup muito complexos, uma vez que a informação no banco de dados e a imagem armazenada no diretório não possuem um vínculo que "amarre" este relacionamento, semelhante à uma CONSTRAINT.Para evitar perdas de dados ou arquivos, é recomendado o procedimento de armazenamento de uma imagem em um banco de dados no SQL Server. Esta é uma tarefa relativamente simples que pode tornar todo o processo de utilização de dados e arquivos muito mais eficiente e com menor possibilidade de perda de conteúdo (arquivos ou registros).
Incluir uma imagem em uma tabela exige que o arquivo seja convertido e uma alternativa muito útil para esta tarefa é utilizar o método OPENROWSET.
Construindo o ambiente para Teste
Para que possamos reproduzir todo o processo de inclusão de um arquivo para uma tabela precisamos:- Saber onde o arquivo está armazenado;
- Possuir acesso de leitura no diretório onde o arquivo está localizado;
- Configurar às permissões necessárias na instância SQL para que seja possível obter estes dados;
- Validar se binário deste arquivo está armazenado corretamente (através de um objeto "Image" de um Relatório).
Criando uma Tabela para Teste
Para esta tarefa, vamos criar uma tabela simples, apenas com os campos que possam servir para a demonstração (Imagem 1).
Então adicionamos um campo para identificação do arquivo, chamado "NM_FILE" e outro para armazenar os dados binários do arquivo, chamado "CD_BYTES".
O nome do arquivo serve para ajudar na identificação do conteúdo que está sendo armazenado no banco de dados.
Imagem 1 - See this output SQL script in the image below

Script 1 - See this SQL script in the below
CREATETABLETB_IMAGE
(
NM_FILE varchar(25) NOTNULL,
CD_BYTES varbinary(MAX) NOTNULL
)
GO
Acessando uma Imagem
Com a tabela criada em seu banco de dados, é importante identificar quais são as imagens que serão adicionadas e se o usuário de sua instância SQL possui às permissões de acesso ao diretório do Windows onde sua imagem está armazenada.
Preferencialmente, para evitar lentidão e falhas de permissão é recomendado que os arquivos para inclusão em tabelas SQL estejam armazenadas em diretórios no mesmo servidor de sua instância SQL (Imagem 2).
Abaixo selecionamos uma imagem para teste, chamada "MyPhoto.jpg". Saber o formato do arquivo (identificado pela sua extensão, que neste caso é "image/jpg") é fundamental para reconstruir o arquivo binário, uma vez que o processo de leitura de dados através do método OPENROWSET, utilizando o argumento SINGLE_BLOB não obtém os dados binários do arquivo de forma otimizada para um determinado tipo de arquivo.
Isso facilita a inclusão de diferentes tipos de arquivos, porém obriga que o tipo do arquivo seja conhecido e definido na aplicação destino para qualquer exibição ou conversão de dados.
Imagem 2 - See the file sample in the image below

Inserindo uma Imagem
Para inserir uma imagem em seu banco de dados é necessário obter os dados binários deste arquivo. O modo mais simples para realizar esta tarefa é utilizando o método OPENROWSET, adicionando o argumento SINGLE_BLOB.
Este recurso possibilita obter os dados binários de qualquer arquivo, porque oferece suporte à todos os tipos de conversões de codificação do Windows (ASCII e UNICODE).
Com o usuário do seu serviço SQL com acesso ao diretório onde a imagem está armazenada, é possível utilizar o comando INSERT para incluir esta imagem em uma determinada tabela(Imagem 3), com outras informações que possam auxiliar na sua identificação se torna mais fácil, sendo necessário apenas a declaração de um BULKCOLUMN para obter os dados do arquivo.
Imagem 3 - See this output SQL script in the image below

Script 2 - See this SQL script in the below
INSERTINTOTB_IMAGE
(NM_FILE,
CD_BYTES)
SELECT
'MyPhoto.jpg',IMG.BulkColumnASBytes
FROM
OPENROWSET(BULKN'C:\images\MyPhoto.jpg',SINGLE_BLOB)ASIMG
GO
SELECT*FROM
TB_IMAGE
GO
Lendo os dados binários
Os dados binários armazenados na tabela de exemplo já estão prontos para uso. Para verificar que o arquivo foi armazenado corretamente, a melhor forma é visualizando a imagem.
Para isso podemos utilizar o objeto "Image" através de um Windows Form(.exe), um ASP.Net(.aspx) ou de um relatório "Report Data"(.rdl). Como estamos trabalhando com SQL Server, vamos validar se os dados binários não foram corrompidos consultando este registro através de um relatório.
Este artigo não pretende ensinar como você pode criar um relatório para o SQL Server Reporting Services (SSRS), mas apenas vamos demonstrar como consultar esta informação de demonstração.
Para obter os dados nesta validação, vamos definir um DataSet com os campos desejados e vincular os campos da tabela no corpo do Relatório (Imagem 4) usando dois objetos: um objeto TextBox para o nome do arquivo e um objeto Image para ler os dados binários e disponibilizar para exibição.
Imagem 4 - See this Design Report in the image below

No objeto Image é necessário definir alguns detalhes para a correta exibição (Imagem 5):
1 - Definir a origem dos dados como "Database";
2 - No campo "Use this field", clique no botão "Fx". A janela "Expression" se abrirá e assim podemos selecionar o campo "CD_BYTES" do nosso DataSet. Como vamos apenas obter o primeiro registro, utilizamos o método "First". Veja o código desta expressão abaixo:
=First(Fields!CD_BYTES.Value, "DataSet2")
3 - No campo "Use this MIME type", selecione o tipo de imagem esperado. No nosso exemplo vamos selecionar"image/jpeg".
Imagem 5 - See this windows in the image below (click to enlarge)

Para verificar rapidamente se o Relatório está exibindo os dados corretamente, vamos clicar na aba "Preview" e então a consulta será realizada para exibição dos dados (Imagem 6).
Como esperado, o nome do arquivo armazenado na nossa tabela de exemplo foi exibido junto com a imagem armazenada.
Imagem 6 - See this windows in the image below (click to enlarge)

Conclusão
Possuir um recurso alternativo e rápido para manipulação de dados e imagens através de T-SQL é extremamente útil, principalmente quando existe a necessidade de vincular uma determinada imagem a um registro de uma tabela em seu banco de dados SQL Server.É importante saber que é possível manter os dados binários de um arquivo armazenado diretamente em seu banco de dados, reduzindo ao máximo a vulnerabilidade de seu ambiente com a perda de um arquivo por um motivo qualquer, como a mudança de local de armazenamento dos arquivos no servidor Windows.
Referências
- OPENROWSET (Transact-SQL)
- binary e varbinary (Transact-SQL)
- Blog TechNet - SINGLE_BLOB Size Limit: An Affirmation for Bert
Veja Também
- SQL Server: How to Find the First Available Timeslot for Scheduling
- Transact-SQL Portal
- Wiki: Portal of TechNet Wiki Portals
Outros Idiomas
Tags: SQL Server, Image, ssrs, has code, T-SQL, Has TOC, Multi Language Wiki Articles, Transact-SQL, has See Also, has Other Languages, has Images, has References, Durval, OPENROWSET, SINGLE_BLOB, BulkColumn, dados binários