Para finalizar este série de artigos sobre técnicas de como trabalhar com imagens/arquivos no SQL Server, vamos utilizar o próprio T-SQL para realizar a importação de arquivos para dentro do banco de dados.
Pareceu difícil? Não se preocupem, é bem tranquilo.
O primeiro comando deste artigo utiliza a função OPENROWSET, especificando o caminho do arquivo, para recuperar os bytes deste arquivo em formato VARBINARY:
SELECT Imagem.BulkColumn AS [Bytes] FROM OPENROWSET(BULK N'C:\cake.jpg', SINGLE_BLOB) AS Imagem

Para um INSERT na tabela que temos trabalhado nos artigos anteriores, basta utilizar uma instrução de INSERT..SELECT:
INSERT INTO [DemoApp].[dbo].[Arquivos] ([Nome] ,[Bytes] ,[Extensao] ,[Tipo]) SELECT 'cake.jpg' AS [Nome], Imagem.BulkColumn AS [Bytes], '.jpg' AS [Extensao], 'image/jpeg' AS [Tipo] FROM OPENROWSET(BULK N'C:\cake.jpg', SINGLE_BLOB) AS Imagem
No caso de operações que exigiam a importação de vários arquivos de uma determinada pasta, será necessário utilizar da Stored Procedure xp_cmdshell, que necessita executar as operações a seguir para ser habilitada:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'xp_cmdshell', 1 GO RECONFIGURE GO
(Lembrando que por questões de segurança, ao termino da utilização da stored procedure xp_cmdshell, desabilitem-na)
E por meio desta Stored Procedured, poderemos relacionar todos os arquivos de uma determinada pasta do servidor de banco de dados:
DECLARE @T TABLE ( CMD NVARCHAR(255)) INSERT INTO @T EXEC xp_cmdshell 'dir E:\Backup\Pictures\2010\Sukiaki\*.jpg /p'; SELECT SUBSTRING(CMD, 40, 215) FROM @T WHERE CMD LIKE '%.jpg' GO

Por fim, unimos a ideia do INSERT..SELECT do OPENROWSET e a execução da Stored Procedure xp_cmdshell:
DECLARE @T TABLE ( CMD NVARCHAR(255)) DECLARE @PATH NVARCHAR(255) SET @PATH = 'E:\Backup\Pictures\2010\Sukiaki\' DECLARE @CMD NVARCHAR(255) SET @CMD = 'dir ' + @PATH + '*.jpg /p' INSERT INTO @T EXEC xp_cmdshell @CMD; DECLARE Arquivos CURSOR FOR SELECT SUBSTRING(CMD, 40, 215) AS Arquivo FROM @T WHERE CMD LIKE '%.jpg'; OPEN Arquivos; DECLARE @Arquivo NVARCHAR(255) DECLARE @ArquivoPath NVARCHAR(255) FETCH NEXT FROM Arquivos INTO @Arquivo; WHILE @@FETCH_STATUS = 0 BEGIN SET @ArquivoPath = @PATH + @Arquivo; EXEC ( 'INSERT INTO [DemoApp].[dbo].[Arquivos] ([Nome] ,[Bytes] ,[Extensao] ,[Tipo]) SELECT ''' + @Arquivo + ''' AS [Nome], Imagem.BulkColumn AS [Bytes], ''.jpg'' AS [Extensao], ''image/jpeg'' AS [Tipo] FROM OPENROWSET(BULK ''' + @ArquivoPath + ''', SINGLE_BLOB) AS Imagem' ) FETCH NEXT FROM Arquivos INTO @Arquivo; END CLOSE Arquivos; DEALLOCATE Arquivos;
E teremos importado todos os arquivos:

1 Resposta para “Imagens no banco de dados 5 – Importando arquivos por T-SQL”