Como despejar todas as nossas imagens de um campo de VARBINARY (MAX) em SQL Server 2008 para o sistema de arquivos?
-
03-07-2019 - |
Pergunta
Eu tenho uma tabela que tem um campo IDENTITY
e um campo VARBINARY(MAX)
nele. Existe alguma maneira eu poderia despejar o conteúdo de cada campo VARBINARY(MAX)
ao sistema de arquivos (eg. c:\temp\images
)?
Esquema da tabela:
PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME
Output:
c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...
O que é a melhor maneira de abordar isso?
Solução
Eu percebi isso graças a este post ...
SET NOCOUNT ON
DECLARE @IdThumbnail INTEGER,
@MimeType VARCHAR(100),
@FileName VARCHAR(200),
@Sqlstmt varchar(4000)
DECLARE Cursor_Image CURSOR FOR
SELECT a.IdThumbnail
FROM tblThumbnail a
ORDER BY a.IdThumbnail
OPEN Cursor_Image
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
WHILE @@FETCH_STATUS = 0
BEGIN
-- Generate the file name based upon the ID and the MIMETYPE.
SELECT @FileName = LTRIM(STR(@IdThumbnail)) + '.png'
-- Framing DynamicSQL for XP_CMDshell
SET @Sqlstmt='BCP "SELECT OriginalImage
FROM Appian.dbo.tblThumbnail
WHERE IdThumbnail = ' + LTRIM(STR(@IdThumbnail)) +
'" QUERYOUT c:\Temp\Images\' + LTRIM(@FileName) +
' -T -fC:\Temp\ImageFormatFile.txt'
print @FileName
print @sqlstmt
EXEC xp_cmdshell @sqlstmt
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
END
CLOSE Cursor_Image
DEALLOCATE Cursor_Image
Por favor, note -> u precisa ter um arquivo de formato, para o comando BCP. Este é o conteúdo do arquivo e eu tenho colocá-lo em c:. \ Temp (como observado na linha de comando BCP acima)
10.0
1
1 SQLIMAGE 0 0 "" 1 OriginalImage ""
Nota final sobre esse arquivo formato .. Tem que haver uma nova linha após a última linha. caso contrário, o retorno vai obter um erro.
Aproveite!
Outras dicas
O mais fácil (para mim) seria escrever um pequeno aplicativo .NET que jogou os campos varbinary para um arquivo.
Se você se opõem a trabalhar na NET, então você deve (eu não testei isso) ser capaz de criar uma nova coluna do tipo "VARBINARY (MAX) FILESTREAM". Certifique-se que você também tem uma coluna do correspondente "ROWGUIDCOL". Depois, você pode (em teoria) fazer algo como:
UPDATE tabela varfilestream_col SET = varbinary_col
Hope que funciona para você.